You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datasketches.apache.org by jm...@apache.org on 2023/02/01 17:01:22 UTC
[datasketches-cpp] 01/01: Remove inheritance from std::iterator
This is an automated email from the ASF dual-hosted git repository.
jmalkin pushed a commit to branch update_iterators
in repository https://gitbox.apache.org/repos/asf/datasketches-cpp.git
commit 2ad16482b33cfeb3dc0d47566961ed5b881ba797
Author: Jon <jm...@apache.org>
AuthorDate: Wed Feb 1 09:01:08 2023 -0800
Remove inheritance from std::iterator
---
fi/include/reverse_purge_hash_map.hpp | 12 +++++++++---
hll/include/HllArray.hpp | 8 +++++++-
hll/include/coupon_iterator.hpp | 8 +++++++-
kll/include/kll_sketch.hpp | 7 ++++++-
quantiles/include/quantiles_sketch.hpp | 7 ++++++-
req/include/req_sketch.hpp | 7 ++++++-
sampling/include/var_opt_sketch.hpp | 18 ++++++++++++++----
theta/include/theta_update_sketch_base.hpp | 16 ++++++++++++++--
8 files changed, 69 insertions(+), 14 deletions(-)
diff --git a/fi/include/reverse_purge_hash_map.hpp b/fi/include/reverse_purge_hash_map.hpp
index 6e2e53a..9500852 100644
--- a/fi/include/reverse_purge_hash_map.hpp
+++ b/fi/include/reverse_purge_hash_map.hpp
@@ -91,8 +91,14 @@ private:
// This iterator uses strides based on golden ratio to avoid clustering during merge
template<typename K, typename V, typename H, typename E, typename A>
-class reverse_purge_hash_map<K, V, H, E, A>::iterator: public std::iterator<std::input_iterator_tag, K> {
+class reverse_purge_hash_map<K, V, H, E, A>::iterator {
public:
+ using iterator_category = std::input_iterator_tag;
+ using value_type = std::pair<K&, V>;
+ using difference_type = std::ptrdiff_t;
+ using pointer = void;
+ using reference = value_type&;
+
friend class reverse_purge_hash_map<K, V, H, E, A>;
iterator& operator++() {
++count;
@@ -107,8 +113,8 @@ public:
iterator operator++(int) { iterator tmp(*this); operator++(); return tmp; }
bool operator==(const iterator& rhs) const { return count == rhs.count; }
bool operator!=(const iterator& rhs) const { return count != rhs.count; }
- const std::pair<K&, V> operator*() const {
- return std::pair<K&, V>(map->keys_[index], map->values_[index]);
+ const value_type operator*() const {
+ return value_type(map->keys_[index], map->values_[index]);
}
private:
static constexpr double GOLDEN_RATIO_RECIPROCAL = 0.6180339887498949; // = (sqrt(5) - 1) / 2
diff --git a/hll/include/HllArray.hpp b/hll/include/HllArray.hpp
index 60aee76..b32f7c2 100644
--- a/hll/include/HllArray.hpp
+++ b/hll/include/HllArray.hpp
@@ -113,8 +113,14 @@ class HllArray : public HllSketchImpl<A> {
};
template<typename A>
-class HllArray<A>::const_iterator: public std::iterator<std::input_iterator_tag, uint32_t> {
+class HllArray<A>::const_iterator {
public:
+ using iterator_category = std::input_iterator_tag;
+ using value_type = uint32_t;
+ using difference_type = int32_t;
+ using pointer = uint32_t*;
+ using reference = uint32_t&;
+
const_iterator(const uint8_t* array, uint32_t array_slze, uint32_t index, target_hll_type hll_type, const AuxHashMap<A>* exceptions, uint8_t offset, bool all);
const_iterator& operator++();
bool operator!=(const const_iterator& other) const;
diff --git a/hll/include/coupon_iterator.hpp b/hll/include/coupon_iterator.hpp
index 896a2f7..856065b 100644
--- a/hll/include/coupon_iterator.hpp
+++ b/hll/include/coupon_iterator.hpp
@@ -23,8 +23,14 @@
namespace datasketches {
template<typename A>
-class coupon_iterator: public std::iterator<std::input_iterator_tag, uint32_t> {
+class coupon_iterator {
public:
+ using iterator_category = std::input_iterator_tag;
+ using value_type = uint32_t;
+ using difference_type = int32_t;
+ using pointer = uint32_t*;
+ using reference = uint32_t&;
+
coupon_iterator(const uint32_t* array, size_t array_slze, size_t index, bool all);
coupon_iterator& operator++();
bool operator!=(const coupon_iterator& other) const;
diff --git a/kll/include/kll_sketch.hpp b/kll/include/kll_sketch.hpp
index 3407afc..0272bf4 100644
--- a/kll/include/kll_sketch.hpp
+++ b/kll/include/kll_sketch.hpp
@@ -586,9 +586,14 @@ class kll_sketch {
};
template<typename T, typename C, typename A>
-class kll_sketch<T, C, A>::const_iterator: public std::iterator<std::input_iterator_tag, T> {
+class kll_sketch<T, C, A>::const_iterator {
public:
+ using iterator_category = std::input_iterator_tag;
using value_type = std::pair<const T&, const uint64_t>;
+ using difference_type = std::ptrdiff_t;
+ using pointer = return_value_holder<value_type>;
+ using reference = value_type&;
+
friend class kll_sketch<T, C, A>;
const_iterator& operator++();
const_iterator& operator++(int);
diff --git a/quantiles/include/quantiles_sketch.hpp b/quantiles/include/quantiles_sketch.hpp
index 184b784..11377a4 100644
--- a/quantiles/include/quantiles_sketch.hpp
+++ b/quantiles/include/quantiles_sketch.hpp
@@ -580,9 +580,14 @@ private:
template<typename T, typename C, typename A>
-class quantiles_sketch<T, C, A>::const_iterator: public std::iterator<std::input_iterator_tag, T> {
+class quantiles_sketch<T, C, A>::const_iterator {
public:
+ using iterator_category = std::input_iterator_tag;
using value_type = std::pair<const T&, const uint64_t>;
+ using difference_type = std::ptrdiff_t;
+ using pointer = return_value_holder<value_type>;
+ using reference = value_type&;
+
const_iterator& operator++();
const_iterator& operator++(int);
bool operator==(const const_iterator& other) const;
diff --git a/req/include/req_sketch.hpp b/req/include/req_sketch.hpp
index b6375c5..8beb604 100755
--- a/req/include/req_sketch.hpp
+++ b/req/include/req_sketch.hpp
@@ -399,9 +399,14 @@ private:
};
template<typename T, typename C, typename A>
-class req_sketch<T, C, A>::const_iterator: public std::iterator<std::input_iterator_tag, T> {
+class req_sketch<T, C, A>::const_iterator {
public:
+ using iterator_category = std::input_iterator_tag;
using value_type = std::pair<const T&, const uint64_t>;
+ using difference_type = std::ptrdiff_t;
+ using pointer = return_value_holder<value_type>;
+ using reference = value_type&;
+
const_iterator& operator++();
const_iterator& operator++(int);
bool operator==(const const_iterator& other) const;
diff --git a/sampling/include/var_opt_sketch.hpp b/sampling/include/var_opt_sketch.hpp
index c5cf26c..8f8b3a7 100644
--- a/sampling/include/var_opt_sketch.hpp
+++ b/sampling/include/var_opt_sketch.hpp
@@ -346,9 +346,13 @@ class var_opt_sketch {
};
template<typename T, typename A>
-class var_opt_sketch<T, A>::const_iterator : public std::iterator<std::input_iterator_tag, T> {
-public:
+class var_opt_sketch<T, A>::const_iterator {
+ using iterator_category = std::input_iterator_tag;
using value_type = std::pair<const T&, const double>;
+ using difference_type = std::ptrdiff_t;
+ using pointer = return_value_holder<value_type>;
+ using reference = value_type&;
+public:
const_iterator(const const_iterator& other);
const_iterator& operator++();
const_iterator& operator++(int);
@@ -379,14 +383,20 @@ private:
// non-const iterator for internal use
template<typename T, typename A>
-class var_opt_sketch<T, A>::iterator : public std::iterator<std::input_iterator_tag, T> {
+class var_opt_sketch<T, A>::iterator {
public:
+ using iterator_category = std::input_iterator_tag;
+ using value_type = std::pair<T&, double>;
+ using difference_type = std::ptrdiff_t;
+ using pointer = return_value_holder<value_type>;
+ using reference = value_type&;
+
iterator(const iterator& other);
iterator& operator++();
iterator& operator++(int);
bool operator==(const iterator& other) const;
bool operator!=(const iterator& other) const;
- std::pair<T&, double> operator*();
+ value_type operator*();
private:
friend class var_opt_sketch<T, A>;
diff --git a/theta/include/theta_update_sketch_base.hpp b/theta/include/theta_update_sketch_base.hpp
index 0be40c0..59228d7 100644
--- a/theta/include/theta_update_sketch_base.hpp
+++ b/theta/include/theta_update_sketch_base.hpp
@@ -185,8 +185,14 @@ static inline uint64_t compute_hash(const void* data, size_t length, uint64_t se
// iterators
template<typename Entry, typename ExtractKey>
-class theta_iterator: public std::iterator<std::input_iterator_tag, Entry> {
+class theta_iterator {
public:
+ using iterator_category = std::input_iterator_tag;
+ using value_type = Entry;
+ using difference_type = std::ptrdiff_t;
+ using pointer = Entry*;
+ using reference = Entry&;
+
theta_iterator(Entry* entries, uint32_t size, uint32_t index);
theta_iterator& operator++();
theta_iterator operator++(int);
@@ -201,8 +207,14 @@ private:
};
template<typename Entry, typename ExtractKey>
-class theta_const_iterator: public std::iterator<std::input_iterator_tag, Entry> {
+class theta_const_iterator {
public:
+ using iterator_category = std::input_iterator_tag;
+ using value_type = const Entry;
+ using difference_type = std::ptrdiff_t;
+ using pointer = Entry*;
+ using reference = Entry&;
+
theta_const_iterator(const Entry* entries, uint32_t size, uint32_t index);
theta_const_iterator& operator++();
theta_const_iterator operator++(int);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org