VCCC  2024.05
VisualCamp Common C++ library
reverse_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_REVERSE_ITERATOR_HPP_
6 #define VCCC_ITERATOR_REVERSE_ITERATOR_HPP_
7 
8 
9 #include <iterator>
10 #include <type_traits>
11 
25 
26 namespace vccc {
27 
30 
31 template<typename I1, typename I2>
32 struct disable_sized_sentinel_for<std::reverse_iterator<I1>, std::reverse_iterator<I2>>
33  : negation<sized_sentinel_for<I1, I2>> {};
34 
35 // iterator_traits
36 #if __cplusplus < 202002L
37 
38 template<typename Iter>
39 struct cxx20_iterator_traits<std::reverse_iterator<Iter>> {
40  using iterator_concept = std::conditional_t<
44  >;
45  using iterator_category = std::conditional_t<
49  >;
54 };
55 
56 namespace detail {
57 
58 template<typename Iter>
59 struct is_primary_iterator_traits<cxx20_iterator_traits<std::reverse_iterator<Iter>>> : std::true_type {};
60 
61 } // namespace detail
62 
63 #endif // __cplusplus < 202002L
64 
66 
67 } // namespace vccc
68 
69 // iter_move, iter_swap
70 #if __cplusplus < 202002L
71 
72 namespace std {
73 
74 template<typename Iter>
75 constexpr vccc::iter_rvalue_reference_t<Iter> iter_move(const std::reverse_iterator<Iter>& i)
76  noexcept(
78  noexcept(vccc::ranges::iter_move(--std::declval<Iter&>()))
79  )
80 {
81  auto tmp = i.base();
82  return vccc::ranges::iter_move(--tmp);
83 }
84 
86 constexpr void iter_swap(const reverse_iterator<Iter>& x, const reverse_iterator<Iter2>& y)
87  noexcept(
90  noexcept(vccc::ranges::iter_swap(--std::declval<Iter&>(), --std::declval<Iter2&>()))
91  )
92 {
93  auto tmp_x = x.base();
94  auto tmp_y = y.base();
95  vccc::ranges::iter_swap(--tmp_x, --tmp_y);
96 }
97 
98 } // namespace std
99 
100 #endif // __cplusplus < 202002L
101 
102 #endif // VCCC_ITERATOR_REVERSE_ITERATOR_HPP_
std::random_access_iterator_tag random_access_iterator_tag
Definition: iterator_tag.hpp:19
typename iter_reference< T >::type iter_reference_t
Definition: iter_reference_t.hpp:30
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::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 std::reverse_iterator< Iter > &i) noexcept(std::is_nothrow_copy_constructible< Iter >::value &&noexcept(vccc::ranges::iter_move(--std::declval< Iter & >())))
Definition: reverse_iterator.hpp:75
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 reverse_iterator< Iter > &x, const reverse_iterator< Iter2 > &y) noexcept(std::is_nothrow_copy_constructible< Iter >::value &&std::is_nothrow_copy_constructible< Iter2 >::value &&noexcept(vccc::ranges::iter_swap(--std::declval< Iter & >(), --std::declval< Iter2 & >())))
Definition: reverse_iterator.hpp:86
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
std::conditional_t< random_access_iterator< Iter >::value, random_access_iterator_tag, bidirectional_iterator_tag > iterator_concept
Definition: reverse_iterator.hpp:44
iter_value_t< Iter > value_type
Definition: reverse_iterator.hpp:50
iter_difference_t< Iter > difference_type
Definition: reverse_iterator.hpp:51
typename cxx20_iterator_traits< Iter >::pointer pointer
Definition: reverse_iterator.hpp:52
std::conditional_t< derived_from< typename cxx20_iterator_traits< Iter >::iterator_category, random_access_iterator_tag >::value, random_access_iterator_tag, typename cxx20_iterator_traits< Iter >::iterator_category > iterator_category
Definition: reverse_iterator.hpp:49
iter_reference_t< Iter > reference
Definition: reverse_iterator.hpp:53
Definition: cxx20_iterator_traits.hpp:188
Models std::derived_from
Definition: derived_from.hpp:42
Definition: sized_sentinel_for.hpp:22
Definition: negation.hpp:23
specifies that a bidirectional_iterator is a random-access iterator, supporting advancement in consta...
Definition: random_access_iterator.hpp:120