VCCC  2024.05
VisualCamp Common C++ library
random_access_iterator.hpp
Go to the documentation of this file.
1 //
2 // Created by cosge on 2023-12-03.
3 //
4 
5 #ifndef VCCC_ITERATOR_RANDOM_ACCESS_ITERATOR_HPP_
6 #define VCCC_ITERATOR_RANDOM_ACCESS_ITERATOR_HPP_
7 
8 #include <type_traits>
9 
22 
23 #ifdef _MSC_VER
24 #pragma warning( push )
25 #pragma warning( disable : 4244)
26 #endif
27 
28 namespace vccc {
29 namespace detail {
30 namespace detail_random_access_iterator {
31 
32 template<typename I, typename D, typename = void, typename = void>
33 struct explicit_op_assign_check : std::false_type {};
34 template<typename I, typename D>
35 struct explicit_op_assign_check<
36  I, D,
37  void_t<decltype( std::declval<I>() += std::declval<D>() )>,
38  void_t<decltype( std::declval<I>() -= std::declval<D>() )>
39  >
40  : conjunction<
41  same_as<decltype( std::declval<I>() += std::declval<D>() ), std::add_lvalue_reference_t<std::remove_reference_t<I>>>,
42  same_as<decltype( std::declval<I>() -= std::declval<D>() ), std::add_lvalue_reference_t<std::remove_reference_t<I>>>
43  > {};
44 
45 template<typename I, typename D, typename = void, typename = void, typename = void, typename = void>
46 struct explicit_op_const_check : std::false_type {};
47 template<typename I, typename D>
48 struct explicit_op_const_check<
49  I, D,
50  void_t<decltype( std::declval<I>() + std::declval<D>() )>,
51  void_t<decltype( std::declval<D>() + std::declval<I>() )>,
52  void_t<decltype( std::declval<I>() - std::declval<D>() )>,
53  void_t<decltype( std::declval<I>()[std::declval<D>()] )>
54  >
55  : conjunction<
56  same_as<decltype( std::declval<I>() + std::declval<D>() ), remove_cvref_t<I>>,
57  same_as<decltype( std::declval<D>() + std::declval<I>() ), remove_cvref_t<I>>,
58  same_as<decltype( std::declval<I>() - std::declval<D>() ), remove_cvref_t<I>>,
59  same_as<decltype( std::declval<I>()[std::declval<D>()] ), iter_reference_t<remove_cvref_t<I>>>
60  > {};
61 
62 template<typename I, bool = is_referencable<iter_difference_t<I>>::value /* false */>
63 struct op_check : std::false_type {};
64 
65 template<typename I>
66 struct op_check<I, true>
67  : conjunction<
68  implicit_expression_check<explicit_op_assign_check, I&, const iter_difference_t<I>&>,
69  implicit_expression_check<explicit_op_const_check, const I&, const iter_difference_t<I>&>
70  > {};
71 
72 } // detail_random_access_iterator
73 
74 template<
75  typename I,
76  bool =
77  conjunction<
78  bidirectional_iterator<I>,
79  has_typename_type<iter_difference<I>>,
80  has_typename_type<iter_reference<I>>
81  >::value /* false */
82 >
83 struct random_access_iterator_impl : std::false_type {};
84 
85 template<typename I>
86 struct random_access_iterator_impl<I, true>
87  : conjunction<
88  derived_from<ITER_CONCEPT<I>, random_access_iterator_tag>,
89  totally_ordered<I>,
90  sized_sentinel_for<I, I>,
91  detail_random_access_iterator::op_check<I>
92  > {};
93 
94 } // namespace detail
95 
98 
99 
119 template<typename I>
120 struct random_access_iterator : detail::random_access_iterator_impl<I> {};
121 
123 
124 } // namespace vccc
125 
126 #ifdef _MSC_VER
127 #pragma warning( pop )
128 #endif
129 
130 #endif // VCCC_ITERATOR_RANDOM_ACCESS_ITERATOR_HPP_
void void_t
Definition: void_t.hpp:19
Definition: matrix.hpp:495
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
specifies that a bidirectional_iterator is a random-access iterator, supporting advancement in consta...
Definition: random_access_iterator.hpp:120