@@ -56,9 +56,6 @@ class vector : private std::vector<V, Allocator> {
56
56
class key_iterator ;
57
57
typedef vtr::Range<key_iterator> key_range;
58
58
59
- class pair_iterator ;
60
- typedef vtr::Range<pair_iterator> pair_range;
61
-
62
59
public:
63
60
// Pass through std::vector's types
64
61
using typename storage::allocator_type;
@@ -157,16 +154,31 @@ class vector : private std::vector<V, Allocator> {
157
154
}
158
155
159
156
/* *
160
- * @brief Returns a range containing the key-value pairs .
157
+ * @brief Provides an iterable object to enumerate the vector .
161
158
*
162
- * This function returns a range object that represents the sequence of key-value
163
- * pairs within the vector. The range can be used to iterate over the pairs using
164
- * standard range-based loops or algorithms.
159
+ * This function allows for easy enumeration, yielding a tuple of (index, element)
160
+ * pairs in each iteration. It is similar in functionality to Python's `enumerate()`.
165
161
*
166
- * @return A `pair_range` object representing the range of key-value pairs.
162
+ * @ return An iterable wrapper that can be used in a range-based for loop to obtain
163
+ * (index, element) pairs.
167
164
*/
168
- pair_range pairs () const {
169
- return vtr::make_range (pair_begin (), pair_end ());
165
+ auto pairs () const {
166
+ struct enumerated_iterator {
167
+ key_type i;
168
+ vector::const_iterator iter;
169
+
170
+ bool operator !=(const enumerated_iterator& other) const { return iter != other.iter ; }
171
+ void operator ++() { i = key_type (size_t (i) + 1 ); iter++; }
172
+ std::tuple<key_type, decltype (*iter)&> operator *() { return std::tie (i, *iter); }
173
+ };
174
+
175
+ struct enumerated_wrapper {
176
+ const vector& vec;
177
+ auto begin () { return enumerated_iterator{ key_type (0 ), vec.begin () }; }
178
+ auto end () { return enumerated_iterator{ key_type (vec.size ()), vec.end () }; }
179
+ };
180
+
181
+ return enumerated_wrapper{ *this };
170
182
}
171
183
172
184
public:
@@ -218,59 +230,9 @@ class vector : private std::vector<V, Allocator> {
218
230
value_type value_;
219
231
};
220
232
221
- /* *
222
- * @brief A bidirectional iterator for a vtr:vector object.
223
- *
224
- * The `pair_iterator` class provides a way to iterate over key-value pairs
225
- * within a vtr::vector container. It supports bidirectional iteration,
226
- * allowing the user to traverse the container both forwards and backwards.
227
- */
228
- class pair_iterator {
229
- public:
230
- using iterator_category = std::bidirectional_iterator_tag;
231
- using difference_type = std::ptrdiff_t ;
232
- using value_type = std::pair<key_type, V>;
233
- using pointer = value_type*;
234
- using reference = value_type&;
235
-
236
- // / @brief constructor
237
- pair_iterator (vector<K, V, Allocator>& vec, key_type init)
238
- : vec_(vec), value_(init, vec[init]) {}
239
-
240
- // / @brief ++ operator
241
- pair_iterator& operator ++() {
242
- value_ = std::make_pair (key_type (size_t (value_.first ) + 1 ), vec_[key_type (size_t (value_.first ) + 1 )]);
243
- return *this ;
244
- }
245
- // / @brief -- operator
246
- pair_iterator& operator --() {
247
- value_ = std::make_pair (key_type (size_t (value_.first ) - 1 ), vec_[key_type (size_t (value_.first ) - 1 )]);
248
- return *this ;
249
- }
250
- // / @brief dereference operator
251
- reference operator *() { return value_; }
252
- // / @brief -> operator
253
- pointer operator ->() { return &value_; }
254
-
255
- // / @brief == operator
256
- friend bool operator ==(const pair_iterator& lhs, const pair_iterator& rhs) { return lhs.value_ .first == rhs.value_ .first ; }
257
- // / @brief != operator
258
- friend bool operator !=(const pair_iterator& lhs, const pair_iterator& rhs) { return !(lhs == rhs); }
259
-
260
- private:
261
- // / @brief Reference to the vector of key-value pairs.
262
- vector<K, V, Allocator>& vec_;
263
- // @brief The current key-value pair being pointed to by the iterator.
264
- value_type value_;
265
- };
266
-
267
233
private:
268
234
key_iterator key_begin () const { return key_iterator (key_type (0 )); }
269
235
key_iterator key_end () const { return key_iterator (key_type (size ())); }
270
-
271
- pair_iterator pair_begin () const { return pair_iterator (*const_cast <vector<K, V, Allocator>*>(this ), key_type (0 )); }
272
- pair_iterator pair_end () const { return pair_iterator (*const_cast <vector<K, V, Allocator>*>(this ), key_type (size ())); }
273
236
};
274
-
275
237
} // namespace vtr
276
238
#endif
0 commit comments