5 #ifndef VCCC_ITERATOR_RANDOM_ACCESS_ITERATOR_HPP_
6 #define VCCC_ITERATOR_RANDOM_ACCESS_ITERATOR_HPP_
24 #pragma warning( push )
25 #pragma warning( disable : 4244)
30 namespace detail_random_access_iterator {
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<
37 void_t<decltype(
std::declval<I>() += std::declval<D>() )>,
38 void_t<decltype( std::declval<I>() -= std::declval<D>() )>
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>>>
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<
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>()] )>
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>>>
62 template<
typename I,
bool = is_referencable<iter_difference_t<I>>::value >
63 struct op_check : std::false_type {};
66 struct op_check<I, true>
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>&>
78 bidirectional_iterator<I>,
79 has_typename_type<iter_difference<I>>,
80 has_typename_type<iter_reference<I>>
83 struct random_access_iterator_impl : std::false_type {};
86 struct random_access_iterator_impl<I, true>
88 derived_from<ITER_CONCEPT<I>, random_access_iterator_tag>,
90 sized_sentinel_for<I, I>,
91 detail_random_access_iterator::op_check<I>
127 #pragma warning( pop )
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