xref: /llvm-project/libcxx/include/__iterator/iterator_with_data.h (revision 7b4622514d232ce5f7110dd8b20d90e81127c467)
121f4232dSNikolas Klauser //===----------------------------------------------------------------------===//
221f4232dSNikolas Klauser //
321f4232dSNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
421f4232dSNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
521f4232dSNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
621f4232dSNikolas Klauser //
721f4232dSNikolas Klauser //===----------------------------------------------------------------------===//
821f4232dSNikolas Klauser 
921f4232dSNikolas Klauser #ifndef _LIBCPP___ITERATOR_ITERATOR_WITH_DATA_H
1021f4232dSNikolas Klauser #define _LIBCPP___ITERATOR_ITERATOR_WITH_DATA_H
1121f4232dSNikolas Klauser 
1221f4232dSNikolas Klauser #include <__compare/compare_three_way_result.h>
1321f4232dSNikolas Klauser #include <__compare/three_way_comparable.h>
1421f4232dSNikolas Klauser #include <__config>
1521f4232dSNikolas Klauser #include <__iterator/concepts.h>
1621f4232dSNikolas Klauser #include <__iterator/incrementable_traits.h>
1721f4232dSNikolas Klauser #include <__iterator/iter_move.h>
1821f4232dSNikolas Klauser #include <__iterator/iter_swap.h>
1921f4232dSNikolas Klauser #include <__iterator/iterator_traits.h>
2021f4232dSNikolas Klauser #include <__iterator/readable_traits.h>
2121f4232dSNikolas Klauser #include <__utility/move.h>
2221f4232dSNikolas Klauser 
2321f4232dSNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2421f4232dSNikolas Klauser #  pragma GCC system_header
2521f4232dSNikolas Klauser #endif
2621f4232dSNikolas Klauser 
27*7b462251SLouis Dionne _LIBCPP_PUSH_MACROS
28*7b462251SLouis Dionne #include <__undef_macros>
29*7b462251SLouis Dionne 
3021f4232dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
3121f4232dSNikolas Klauser 
3221f4232dSNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
3321f4232dSNikolas Klauser 
3421f4232dSNikolas Klauser template <forward_iterator _Iterator, class _Data>
3521f4232dSNikolas Klauser class __iterator_with_data {
3621f4232dSNikolas Klauser   _Iterator __iter_{};
3721f4232dSNikolas Klauser   _Data __data_{};
3821f4232dSNikolas Klauser 
3921f4232dSNikolas Klauser public:
4021f4232dSNikolas Klauser   using value_type      = iter_value_t<_Iterator>;
4121f4232dSNikolas Klauser   using difference_type = iter_difference_t<_Iterator>;
4221f4232dSNikolas Klauser 
4321f4232dSNikolas Klauser   _LIBCPP_HIDE_FROM_ABI __iterator_with_data() = default;
4421f4232dSNikolas Klauser 
__iterator_with_data(_Iterator __iter,_Data __data)4521f4232dSNikolas Klauser   constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data(_Iterator __iter, _Data __data)
4621f4232dSNikolas Klauser       : __iter_(std::move(__iter)), __data_(std::move(__data)) {}
4721f4232dSNikolas Klauser 
__get_iter()4821f4232dSNikolas Klauser   constexpr _LIBCPP_HIDE_FROM_ABI _Iterator __get_iter() const { return __iter_; }
4921f4232dSNikolas Klauser 
__get_data()5021f4232dSNikolas Klauser   constexpr _LIBCPP_HIDE_FROM_ABI _Data __get_data() && { return std::move(__data_); }
5121f4232dSNikolas Klauser 
5221f4232dSNikolas Klauser   friend constexpr _LIBCPP_HIDE_FROM_ABI bool
5321f4232dSNikolas Klauser   operator==(const __iterator_with_data& __lhs, const __iterator_with_data& __rhs) {
5421f4232dSNikolas Klauser     return __lhs.__iter_ == __rhs.__iter_;
5521f4232dSNikolas Klauser   }
5621f4232dSNikolas Klauser 
5721f4232dSNikolas Klauser   constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data& operator++() {
5821f4232dSNikolas Klauser     ++__iter_;
5921f4232dSNikolas Klauser     return *this;
6021f4232dSNikolas Klauser   }
6121f4232dSNikolas Klauser 
6221f4232dSNikolas Klauser   constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data operator++(int) {
6321f4232dSNikolas Klauser     auto __tmp = *this;
6421f4232dSNikolas Klauser     __iter_++;
6521f4232dSNikolas Klauser     return __tmp;
6621f4232dSNikolas Klauser   }
6721f4232dSNikolas Klauser 
6821f4232dSNikolas Klauser   constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data& operator--()
6921f4232dSNikolas Klauser     requires bidirectional_iterator<_Iterator>
7021f4232dSNikolas Klauser   {
7121f4232dSNikolas Klauser     --__iter_;
7221f4232dSNikolas Klauser     return *this;
7321f4232dSNikolas Klauser   }
7421f4232dSNikolas Klauser 
7521f4232dSNikolas Klauser   constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data operator--(int)
7621f4232dSNikolas Klauser     requires bidirectional_iterator<_Iterator>
7721f4232dSNikolas Klauser   {
7821f4232dSNikolas Klauser     auto __tmp = *this;
7921f4232dSNikolas Klauser     --__iter_;
8021f4232dSNikolas Klauser     return __tmp;
8121f4232dSNikolas Klauser   }
8221f4232dSNikolas Klauser 
8321f4232dSNikolas Klauser   constexpr _LIBCPP_HIDE_FROM_ABI iter_reference_t<_Iterator> operator*() const { return *__iter_; }
8421f4232dSNikolas Klauser 
8521f4232dSNikolas Klauser   _LIBCPP_HIDE_FROM_ABI friend constexpr iter_rvalue_reference_t<_Iterator>
iter_move(const __iterator_with_data & __iter)8621f4232dSNikolas Klauser   iter_move(const __iterator_with_data& __iter) noexcept(noexcept(ranges::iter_move(__iter.__iter_))) {
8721f4232dSNikolas Klauser     return ranges::iter_move(__iter.__iter_);
8821f4232dSNikolas Klauser   }
8921f4232dSNikolas Klauser 
9021f4232dSNikolas Klauser   _LIBCPP_HIDE_FROM_ABI friend constexpr void
iter_swap(const __iterator_with_data & __lhs,const __iterator_with_data & __rhs)9121f4232dSNikolas Klauser   iter_swap(const __iterator_with_data& __lhs,
9221f4232dSNikolas Klauser             const __iterator_with_data& __rhs) noexcept(noexcept(ranges::iter_swap(__lhs.__iter_, __rhs.__iter_)))
9321f4232dSNikolas Klauser     requires indirectly_swappable<_Iterator>
9421f4232dSNikolas Klauser   {
9521f4232dSNikolas Klauser     return ranges::iter_swap(__lhs.__data_, __rhs.__iter_);
9621f4232dSNikolas Klauser   }
9721f4232dSNikolas Klauser };
9821f4232dSNikolas Klauser 
9921f4232dSNikolas Klauser _LIBCPP_END_NAMESPACE_STD
10021f4232dSNikolas Klauser 
10121f4232dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
10221f4232dSNikolas Klauser 
103*7b462251SLouis Dionne _LIBCPP_POP_MACROS
104*7b462251SLouis Dionne 
10521f4232dSNikolas Klauser #endif // _LIBCPP___ITERATOR_ITERATOR_WITH_DATA_H
106