VCCC  2024.05
VisualCamp Common C++ library
legacy_random_access_iterator.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 2023/12/25.
3 //
4 
5 #ifndef VCCC_ITERATOR_ITERATOR_TRAITS_LEGACY_RANDOM_ACCESS_ITERATOR_HPP_
6 #define VCCC_ITERATOR_ITERATOR_TRAITS_LEGACY_RANDOM_ACCESS_ITERATOR_HPP_
7 
8 #include <type_traits>
9 
16 
17 namespace vccc {
18 namespace detail {
19 
20 template<typename I, typename D, typename = void>
21 struct is_iter_add_assignmentable : std::false_type {};
22 template<typename I, typename D>
23 struct is_iter_add_assignmentable<I, D, void_t<decltype(std::declval<I&>() += std::declval<D&>())>>
24  : same_as<decltype(std::declval<I&>() += std::declval<D&>()), I&> {};
25 
26 template<typename I, typename D, typename = void>
27 struct is_iter_sub_assignmentable : std::false_type {};
28 template<typename I, typename D>
29 struct is_iter_sub_assignmentable<I, D, void_t<decltype(std::declval<I&>() -= std::declval<D&>())>>
30  : same_as<decltype(std::declval<I&>() -= std::declval<D&>()), I&> {};
31 
32 template<typename I, typename D, typename = void, typename = void>
33 struct is_iter_addable : std::false_type {};
34 template<typename I, typename D>
35 struct is_iter_addable<I, D,
36  void_t<decltype(std::declval<I&>() + std::declval<D&>())>,
37  void_t<decltype(std::declval<D&>() + std::declval<I&>())>>
38  : conjunction<
39  same_as<decltype(std::declval<I&>() + std::declval<D&>()), I>,
40  same_as<decltype(std::declval<D&>() + std::declval<I&>()), I>
41  >{};
42 
43 template<typename I, typename D, typename = void, typename = void>
44 struct is_iter_subtractable : std::false_type {};
45 template<typename I, typename D>
46 struct is_iter_subtractable<I, D,
47  void_t<decltype(std::declval<I&>() - std::declval<D&>())>,
48  void_t<decltype(std::declval<I&>() - std::declval<I&>())>>
49  : conjunction<
50  same_as<decltype(std::declval<I&>() - std::declval<D&>()), I>,
51  same_as<decltype(std::declval<I&>() - std::declval<I&>()), D>
52  > {};
53 
54 template<typename I, typename D, typename = void>
55 struct is_iter_subscriptable : std::false_type {};
56 
57 template<typename I, typename D>
58 struct is_iter_subscriptable<I, D, void_t<decltype( std::declval<I&>()[std::declval<D&>()] )>>
59  : convertible_to<decltype( std::declval<I&>()[std::declval<D&>()] ), iter_reference_t<I>> {};
60 
61 template<typename I, typename D>
62 struct LegacyRandomAccessIteratorStage2
63  : conjunction<
64  is_iter_add_assignmentable<I, D>,
65  is_iter_sub_assignmentable<I, D>,
66  is_iter_addable<I, D>,
67  is_iter_subtractable<I, D>,
68  is_iter_subscriptable<I, D>
69  > {};
70 
72 struct LegacyRandomAccessIteratorStage1 : std::false_type {};
73 
74 template<typename I, typename D>
75 struct LegacyRandomAccessIteratorStage1<I, D, true> : LegacyRandomAccessIteratorStage2<I, D> {};
76 
77 } // namespace detail
78 
86 template<typename I, bool = conjunction<LegacyBidirectionalIterator<I>, totally_ordered<I>>::value>
87 struct LegacyRandomAccessIterator : std::false_type {};
88 
89 template<typename I>
91  : detail::LegacyRandomAccessIteratorStage1<I, typename incrementable_traits<I>::difference_type> {};
92 
95 
96 } // namespace vccc
97 
98 #endif // VCCC_ITERATOR_ITERATOR_TRAITS_LEGACY_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
Definition: legacy_random_access_iterator.hpp:87