]>
Commit | Line | Data |
---|---|---|
c9a7474f TL |
1 | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
2 | From: Thomas Lamprecht <t.lamprecht@proxmox.com> | |
3 | Date: Wed, 3 May 2023 13:25:08 +0200 | |
4 | Subject: [PATCH] define iterators without std::iterator<> | |
5 | ||
6 | > std::iterator<> is deprecated in C++17, so let's just | |
7 | > define the required traits directly. | |
8 | ||
9 | cherry-picked/backported from upstream PRs: | |
10 | https://github.com/ceph/ceph/pull/45419/commits | |
11 | https://github.com/ceph/ceph/pull/45198/commits | |
12 | ||
13 | Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com> | |
14 | --- | |
15 | .../btree/string_kv_node_layout.h | 27 +++++++++++-------- | |
16 | src/include/rados/librados.hpp | 7 ++++- | |
17 | src/include/xlist.h | 15 +++++++++-- | |
18 | 3 files changed, 35 insertions(+), 14 deletions(-) | |
19 | ||
20 | diff --git a/src/crimson/os/seastore/omap_manager/btree/string_kv_node_layout.h b/src/crimson/os/seastore/omap_manager/btree/string_kv_node_layout.h | |
21 | index 9948a4292..1bd95415a 100644 | |
22 | --- a/src/crimson/os/seastore/omap_manager/btree/string_kv_node_layout.h | |
23 | +++ b/src/crimson/os/seastore/omap_manager/btree/string_kv_node_layout.h | |
24 | @@ -294,7 +294,7 @@ class StringKVInnerNodeLayout { | |
25 | friend class delta_inner_t; | |
26 | public: | |
27 | template <bool is_const> | |
28 | - class iter_t : public std::iterator<std::input_iterator_tag, StringKVInnerNodeLayout> { | |
29 | + class iter_t { | |
30 | friend class StringKVInnerNodeLayout; | |
31 | ||
32 | template <typename iterator, typename const_iterator> | |
33 | @@ -312,17 +312,22 @@ public: | |
34 | uint16_t index) : node(parent), index(index) {} | |
35 | ||
36 | public: | |
37 | - iter_t(const iter_t &) = default; | |
38 | - iter_t(iter_t &&) = default; | |
39 | - iter_t &operator=(const iter_t &) = default; | |
40 | - iter_t &operator=(iter_t &&) = default; | |
41 | - | |
42 | - operator iter_t<!is_const>() const { | |
43 | - static_assert(!is_const); | |
44 | - return iter_t<!is_const>(node, index); | |
45 | - } | |
46 | - | |
47 | + using iterator_category = std::input_iterator_tag; | |
48 | + using value_type = StringKVInnerNodeLayout; | |
49 | + using difference_type = std::ptrdiff_t; | |
50 | + using pointer = StringKVInnerNodeLayout*; | |
51 | using reference = iter_t&; | |
52 | + | |
53 | + iter_t(const iter_t &) = default; | |
54 | + iter_t(iter_t &&) = default; | |
55 | + iter_t &operator=(const iter_t &) = default; | |
56 | + iter_t &operator=(iter_t &&) = default; | |
57 | + | |
58 | + operator iter_t<!is_const>() const { | |
59 | + static_assert(!is_const); | |
60 | + return iter_t<!is_const>(node, index); | |
61 | + } | |
62 | + | |
63 | iter_t &operator*() { return *this; } | |
64 | iter_t *operator->() { return this; } | |
65 | ||
66 | diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp | |
67 | index b40d7bf9a..712a5da82 100644 | |
68 | --- a/src/include/rados/librados.hpp | |
69 | +++ b/src/include/rados/librados.hpp | |
70 | @@ -104,8 +104,13 @@ inline namespace v14_2_0 { | |
71 | }; | |
72 | CEPH_RADOS_API std::ostream& operator<<(std::ostream& os, const librados::ObjectCursor& oc); | |
73 | ||
74 | - class CEPH_RADOS_API NObjectIterator : public std::iterator <std::forward_iterator_tag, ListObject> { | |
75 | + class CEPH_RADOS_API NObjectIterator { | |
76 | public: | |
77 | + using iterator_category = std::forward_iterator_tag; | |
78 | + using value_type = ListObject; | |
79 | + using difference_type = std::ptrdiff_t; | |
80 | + using pointer = ListObject*; | |
81 | + using reference = ListObject&; | |
82 | static const NObjectIterator __EndObjectIterator; | |
83 | NObjectIterator(): impl(NULL) {} | |
84 | ~NObjectIterator(); | |
85 | diff --git a/src/include/xlist.h b/src/include/xlist.h | |
86 | index 733a318a9..73e6d8d53 100644 | |
87 | --- a/src/include/xlist.h | |
88 | +++ b/src/include/xlist.h | |
89 | @@ -159,10 +159,15 @@ public: | |
90 | remove(_back); | |
91 | } | |
92 | ||
93 | - class iterator: std::iterator<std::forward_iterator_tag, T> { | |
94 | + class iterator { | |
95 | private: | |
96 | item *cur; | |
97 | public: | |
98 | + using iterator_category = std::forward_iterator_tag; | |
99 | + using value_type = T; | |
100 | + using difference_type = std::ptrdiff_t; | |
101 | + using pointer = T*; | |
102 | + using reference = T&; | |
103 | iterator(item *i = 0) : cur(i) {} | |
104 | T operator*() { return static_cast<T>(cur->_item); } | |
105 | iterator& operator++() { | |
106 | @@ -183,10 +188,16 @@ public: | |
107 | iterator begin() { return iterator(_front); } | |
108 | iterator end() { return iterator(NULL); } | |
109 | ||
110 | - class const_iterator: std::iterator<std::forward_iterator_tag, T> { | |
111 | + class const_iterator { | |
112 | private: | |
113 | item *cur; | |
114 | public: | |
115 | + using iterator_category = std::forward_iterator_tag; | |
116 | + using value_type = T; | |
117 | + using difference_type = std::ptrdiff_t; | |
118 | + using pointer = const T*; | |
119 | + using reference = const T&; | |
120 | + | |
121 | const_iterator(item *i = 0) : cur(i) {} | |
122 | const T operator*() { return static_cast<const T>(cur->_item); } | |
123 | const_iterator& operator++() { |