VCCC  2024.05
VisualCamp Common C++ library
move_iterator.hpp
Go to the documentation of this file.
1 //
2 // Created by YongGyu Lee on 4/15/24.
3 //
4 
5 #ifndef VCCC_ITERATOR_MOVE_ITERATOR_HPP_
6 #define VCCC_ITERATOR_MOVE_ITERATOR_HPP_
7 
8 #include <iterator>
9 #include <type_traits>
10 
27 
28 namespace vccc {
29 
32 
33 template<typename Iterator1, typename Iterator2>
34 struct disable_sized_sentinel_for<std::move_iterator<Iterator1>, std::move_iterator<Iterator2>>
35  : negation<sized_sentinel_for<Iterator1, Iterator2>> {};
36 
37 #if __cplusplus < 202302L
38 
39 namespace detail {
40 
42 struct move_iterator_category {};
43 
44 template<typename Iter>
45 struct move_iterator_category<Iter, true> {
46  using iterator_category = std::conditional_t<
47  derived_from<typename cxx20_iterator_traits<Iter>::iterator_category, random_access_iterator_tag>::value, random_access_iterator_tag,
48  typename cxx20_iterator_traits<Iter>::iterator_category
49  >;
50 };
51 
52 } // namespace detail
53 
54 template<typename Iter>
55 struct cxx20_iterator_traits<std::move_iterator<Iter>>
56  : detail::move_iterator_category<Iter>
57 {
59  std::conditional_t<
61  std::conditional_t<
63  std::conditional_t<
66  >>>;
69  using pointer = Iter;
71 };
72 
73 namespace detail {
74 
75 template<typename Iter>
76 struct is_primary_iterator_traits<std::move_iterator<Iter>> : std::true_type {};
77 
78 } // namespace detail
79 
80 #endif // __cplusplus < 202302L
81 
83 
84 } // namespace vccc
85 
86 
87 #if __cplusplus < 202002L
88 
89 namespace std {
90 
91 template<typename Iter>
92 constexpr vccc::iter_rvalue_reference_t<Iter> iter_move(const move_iterator<Iter>& i)
93  noexcept(noexcept(vccc::ranges::iter_move(i.base())))
94 {
95  return vccc::ranges::iter_move(i.base());
96 }
97 
99 constexpr void iter_swap(const move_iterator<Iter>& x, const move_iterator<Iter2>& y)
100  noexcept(noexcept(vccc::ranges::iter_swap(x.base(), y.base())))
101 {
102  vccc::ranges::iter_swap(x.base(), y.base());
103 }
104 
105 } // namespace std
106 
107 #endif
108 
109 #endif // VCCC_ITERATOR_MOVE_ITERATOR_HPP_
std::forward_iterator_tag forward_iterator_tag
Definition: iterator_tag.hpp:17
std::random_access_iterator_tag random_access_iterator_tag
Definition: iterator_tag.hpp:19
typename iter_rvalue_reference< T >::type iter_rvalue_reference_t
Definition: iter_rvalue_reference_t.hpp:33
typename iter_value< T >::type iter_value_t
Definition: iter_value_t.hpp:42
typename iter_difference< T >::type iter_difference_t
Computes the difference type of T
Definition: iter_difference_t.hpp:49
std::input_iterator_tag input_iterator_tag
Definition: iterator_tag.hpp:15
std::bidirectional_iterator_tag bidirectional_iterator_tag
Definition: iterator_tag.hpp:18
Definition: matrix.hpp:495
constexpr vccc::iter_rvalue_reference_t< Iter > iter_move(const move_iterator< Iter > &i) noexcept(noexcept(vccc::ranges::iter_move(i.base())))
Definition: move_iterator.hpp:92
constexpr void iter_swap(const move_iterator< Iter > &x, const move_iterator< Iter2 > &y) noexcept(noexcept(vccc::ranges::iter_swap(x.base(), y.base())))
Definition: move_iterator.hpp:99
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
specifies that a forward_iterator is a bidirectional iterator, supporting movement backwards
Definition: bidirectional_iterator.hpp:58
std::conditional_t< random_access_iterator< Iter >::value, random_access_iterator_tag, std::conditional_t< bidirectional_iterator< Iter >::value, bidirectional_iterator_tag, std::conditional_t< forward_iterator< Iter >::value, forward_iterator_tag, input_iterator_tag > >> iterator_concept
Definition: move_iterator.hpp:66
iter_value_t< Iter > value_type
Definition: move_iterator.hpp:67
Iter pointer
Definition: move_iterator.hpp:69
iter_difference_t< Iter > difference_type
Definition: move_iterator.hpp:68
iter_rvalue_reference_t< Iter > reference
Definition: move_iterator.hpp:70
Definition: cxx20_iterator_traits.hpp:188
Definition: sized_sentinel_for.hpp:22
specifies that an input_iterator is a forward iterator, supporting equality comparison and multi-pass
Definition: forward_iterator.hpp:53
Definition: negation.hpp:23
specifies that a bidirectional_iterator is a random-access iterator, supporting advancement in consta...
Definition: random_access_iterator.hpp:120