File indexing completed on 2026-05-03 08:13:32
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _LIBCPP___CXX03___ITERATOR_ITERATOR_WITH_DATA_H
0010 #define _LIBCPP___CXX03___ITERATOR_ITERATOR_WITH_DATA_H
0011
0012 #include <__cxx03/__compare/compare_three_way_result.h>
0013 #include <__cxx03/__compare/three_way_comparable.h>
0014 #include <__cxx03/__config>
0015 #include <__cxx03/__iterator/concepts.h>
0016 #include <__cxx03/__iterator/incrementable_traits.h>
0017 #include <__cxx03/__iterator/iter_move.h>
0018 #include <__cxx03/__iterator/iter_swap.h>
0019 #include <__cxx03/__iterator/iterator_traits.h>
0020 #include <__cxx03/__iterator/readable_traits.h>
0021 #include <__cxx03/__utility/move.h>
0022
0023 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0024 # pragma GCC system_header
0025 #endif
0026
0027 _LIBCPP_PUSH_MACROS
0028 #include <__cxx03/__undef_macros>
0029
0030 #if _LIBCPP_STD_VER >= 20
0031
0032 _LIBCPP_BEGIN_NAMESPACE_STD
0033
0034 template <forward_iterator _Iterator, class _Data>
0035 class __iterator_with_data {
0036 _Iterator __iter_{};
0037 _Data __data_{};
0038
0039 public:
0040 using value_type = iter_value_t<_Iterator>;
0041 using difference_type = iter_difference_t<_Iterator>;
0042
0043 _LIBCPP_HIDE_FROM_ABI __iterator_with_data() = default;
0044
0045 constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data(_Iterator __iter, _Data __data)
0046 : __iter_(std::move(__iter)), __data_(std::move(__data)) {}
0047
0048 constexpr _LIBCPP_HIDE_FROM_ABI _Iterator __get_iter() const { return __iter_; }
0049
0050 constexpr _LIBCPP_HIDE_FROM_ABI _Data __get_data() && { return std::move(__data_); }
0051
0052 friend constexpr _LIBCPP_HIDE_FROM_ABI bool
0053 operator==(const __iterator_with_data& __lhs, const __iterator_with_data& __rhs) {
0054 return __lhs.__iter_ == __rhs.__iter_;
0055 }
0056
0057 constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data& operator++() {
0058 ++__iter_;
0059 return *this;
0060 }
0061
0062 constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data operator++(int) {
0063 auto __tmp = *this;
0064 __iter_++;
0065 return __tmp;
0066 }
0067
0068 constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data& operator--()
0069 requires bidirectional_iterator<_Iterator>
0070 {
0071 --__iter_;
0072 return *this;
0073 }
0074
0075 constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data operator--(int)
0076 requires bidirectional_iterator<_Iterator>
0077 {
0078 auto __tmp = *this;
0079 --__iter_;
0080 return __tmp;
0081 }
0082
0083 constexpr _LIBCPP_HIDE_FROM_ABI iter_reference_t<_Iterator> operator*() const { return *__iter_; }
0084
0085 _LIBCPP_HIDE_FROM_ABI friend constexpr iter_rvalue_reference_t<_Iterator>
0086 iter_move(const __iterator_with_data& __iter) noexcept(noexcept(ranges::iter_move(__iter.__iter_))) {
0087 return ranges::iter_move(__iter.__iter_);
0088 }
0089
0090 _LIBCPP_HIDE_FROM_ABI friend constexpr void
0091 iter_swap(const __iterator_with_data& __lhs,
0092 const __iterator_with_data& __rhs) noexcept(noexcept(ranges::iter_swap(__lhs.__iter_, __rhs.__iter_)))
0093 requires indirectly_swappable<_Iterator>
0094 {
0095 return ranges::iter_swap(__lhs.__data_, __rhs.__iter_);
0096 }
0097 };
0098
0099 _LIBCPP_END_NAMESPACE_STD
0100
0101 #endif
0102
0103 _LIBCPP_POP_MACROS
0104
0105 #endif