2323#include < __algorithm/remove_if.h>
2424#include < __assert>
2525#include < __compare/synth_three_way.h>
26- #include < __concepts/convertible_to.h>
2726#include < __concepts/swappable.h>
2827#include < __config>
2928#include < __cstddef/byte.h>
3029#include < __cstddef/ptrdiff_t.h>
30+ #include < __flat_map/key_value_iterator.h>
3131#include < __flat_map/sorted_unique.h>
3232#include < __functional/invoke.h>
3333#include < __functional/is_transparent.h>
3838#include < __iterator/next.h>
3939#include < __iterator/ranges_iterator_traits.h>
4040#include < __iterator/reverse_iterator.h>
41- #include < __memory/addressof.h>
4241#include < __memory/allocator_traits.h>
4342#include < __memory/uses_allocator.h>
4443#include < __memory/uses_allocator_construction.h>
5756#include < __type_traits/is_allocator.h>
5857#include < __type_traits/is_nothrow_constructible.h>
5958#include < __type_traits/is_same.h>
60- #include < __type_traits/maybe_const.h>
6159#include < __utility/exception_guard.h>
60+ #include < __utility/move.h>
6261#include < __utility/pair.h>
6362#include < __utility/scope_guard.h>
6463#include < __vector/vector.h>
@@ -82,9 +81,6 @@ template <class _Key,
8281 class _KeyContainer = vector<_Key>,
8382 class _MappedContainer = vector<_Tp>>
8483class flat_map {
85- template <bool _Const>
86- struct __iterator ;
87-
8884 template <class , class , class , class , class >
8985 friend class flat_map ;
9086
@@ -93,6 +89,9 @@ class flat_map {
9389 static_assert (!is_same_v<_KeyContainer, std::vector<bool >>, " vector<bool> is not a sequence container" );
9490 static_assert (!is_same_v<_MappedContainer, std::vector<bool >>, " vector<bool> is not a sequence container" );
9591
92+ template <bool _Const>
93+ using __iterator = __key_value_iterator<flat_map, _KeyContainer, _MappedContainer, _Const>;
94+
9695public:
9796 // types
9897 using key_type = _Key;
@@ -134,123 +133,6 @@ class flat_map {
134133
135134 _LIBCPP_HIDE_FROM_ABI static constexpr bool __is_compare_transparent = __is_transparent_v<_Compare, _Compare>;
136135
137- template <bool _Const>
138- struct __iterator {
139- private:
140- using __key_iterator = ranges::iterator_t <const key_container_type>;
141- using __mapped_iterator = ranges::iterator_t <__maybe_const<_Const, mapped_container_type>>;
142- using __reference = pair<iter_reference_t <__key_iterator>, iter_reference_t <__mapped_iterator>>;
143-
144- struct __arrow_proxy {
145- __reference __ref_;
146- _LIBCPP_HIDE_FROM_ABI __reference* operator ->() { return std::addressof (__ref_); }
147- };
148-
149- __key_iterator __key_iter_;
150- __mapped_iterator __mapped_iter_;
151-
152- friend flat_map;
153-
154- public:
155- using iterator_concept = random_access_iterator_tag;
156- // `flat_map::iterator` only satisfy "Cpp17InputIterator" named requirements, because
157- // its `reference` is not a reference type.
158- // However, to avoid surprising runtime behaviour when it is used with the
159- // Cpp17 algorithms or operations, iterator_category is set to random_access_iterator_tag.
160- using iterator_category = random_access_iterator_tag;
161- using value_type = flat_map::value_type;
162- using difference_type = flat_map::difference_type;
163-
164- _LIBCPP_HIDE_FROM_ABI __iterator () = default;
165-
166- _LIBCPP_HIDE_FROM_ABI __iterator (__iterator<!_Const> __i)
167- requires _Const && convertible_to<ranges::iterator_t<key_container_type>, __key_iterator> &&
168- convertible_to<ranges::iterator_t<mapped_container_type>, __mapped_iterator>
169- : __key_iter_(std::move(__i.__key_iter_)), __mapped_iter_(std::move(__i.__mapped_iter_)) {}
170-
171- _LIBCPP_HIDE_FROM_ABI __iterator (__key_iterator __key_iter, __mapped_iterator __mapped_iter)
172- : __key_iter_(std::move(__key_iter)), __mapped_iter_(std::move(__mapped_iter)) {}
173-
174- _LIBCPP_HIDE_FROM_ABI __reference operator *() const { return __reference (*__key_iter_, *__mapped_iter_); }
175- _LIBCPP_HIDE_FROM_ABI __arrow_proxy operator ->() const { return __arrow_proxy{**this }; }
176-
177- _LIBCPP_HIDE_FROM_ABI __iterator& operator ++() {
178- ++__key_iter_;
179- ++__mapped_iter_;
180- return *this ;
181- }
182-
183- _LIBCPP_HIDE_FROM_ABI __iterator operator ++(int ) {
184- __iterator __tmp (*this );
185- ++*this ;
186- return __tmp;
187- }
188-
189- _LIBCPP_HIDE_FROM_ABI __iterator& operator --() {
190- --__key_iter_;
191- --__mapped_iter_;
192- return *this ;
193- }
194-
195- _LIBCPP_HIDE_FROM_ABI __iterator operator --(int ) {
196- __iterator __tmp (*this );
197- --*this ;
198- return __tmp;
199- }
200-
201- _LIBCPP_HIDE_FROM_ABI __iterator& operator +=(difference_type __x) {
202- __key_iter_ += __x;
203- __mapped_iter_ += __x;
204- return *this ;
205- }
206-
207- _LIBCPP_HIDE_FROM_ABI __iterator& operator -=(difference_type __x) {
208- __key_iter_ -= __x;
209- __mapped_iter_ -= __x;
210- return *this ;
211- }
212-
213- _LIBCPP_HIDE_FROM_ABI __reference operator [](difference_type __n) const { return *(*this + __n); }
214-
215- _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator ==(const __iterator& __x, const __iterator& __y) {
216- return __x.__key_iter_ == __y.__key_iter_ ;
217- }
218-
219- _LIBCPP_HIDE_FROM_ABI friend bool operator <(const __iterator& __x, const __iterator& __y) {
220- return __x.__key_iter_ < __y.__key_iter_ ;
221- }
222-
223- _LIBCPP_HIDE_FROM_ABI friend bool operator >(const __iterator& __x, const __iterator& __y) { return __y < __x; }
224-
225- _LIBCPP_HIDE_FROM_ABI friend bool operator <=(const __iterator& __x, const __iterator& __y) { return !(__y < __x); }
226-
227- _LIBCPP_HIDE_FROM_ABI friend bool operator >=(const __iterator& __x, const __iterator& __y) { return !(__x < __y); }
228-
229- _LIBCPP_HIDE_FROM_ABI friend auto operator <=>(const __iterator& __x, const __iterator& __y)
230- requires three_way_comparable<__key_iterator>
231- {
232- return __x.__key_iter_ <=> __y.__key_iter_ ;
233- }
234-
235- _LIBCPP_HIDE_FROM_ABI friend __iterator operator +(const __iterator& __i, difference_type __n) {
236- auto __tmp = __i;
237- __tmp += __n;
238- return __tmp;
239- }
240-
241- _LIBCPP_HIDE_FROM_ABI friend __iterator operator +(difference_type __n, const __iterator& __i) { return __i + __n; }
242-
243- _LIBCPP_HIDE_FROM_ABI friend __iterator operator -(const __iterator& __i, difference_type __n) {
244- auto __tmp = __i;
245- __tmp -= __n;
246- return __tmp;
247- }
248-
249- _LIBCPP_HIDE_FROM_ABI friend difference_type operator -(const __iterator& __x, const __iterator& __y) {
250- return difference_type (__x.__key_iter_ - __y.__key_iter_ );
251- }
252- };
253-
254136public:
255137 // [flat.map.cons], construct/copy/destroy
256138 _LIBCPP_HIDE_FROM_ABI flat_map () noexcept (
0 commit comments