VCCC  2024.05
VisualCamp Common C++ library
check_input.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 1/28/24.
3 //
4 
5 #ifndef VCCC_ALGORITHM_RANGES_DETAIL_INPUT_RANGE_CHECK_HPP_
6 #define VCCC_ALGORITHM_RANGES_DETAIL_INPUT_RANGE_CHECK_HPP_
7 
15 
16 namespace vccc {
17 namespace ranges {
18 namespace detail {
19 
20 template<
21  template<typename F, typename I, typename...> class Test,
22  template<typename I> class IteratorModel,
23  typename I, typename S, typename Proj, typename Pred,
24  bool = conjunction<
25  IteratorModel<I>,
26  sentinel_for<S, I>,
27  projectable<I, Proj>>::value /* true */
28 >
29 struct algo_check_unary_iterator : Test<Pred, projected<I, Proj>> {};
30 
31 template<
32  template<typename F, typename I, typename...> class Test,
33  template<typename I> class IteratorModel,
34  typename I, typename S, typename Proj, typename Pred
35 >
36 struct algo_check_unary_iterator<Test, IteratorModel, I, S, Proj, Pred, false> : std::false_type {};
37 
38 
39 template<
40  template<typename F, typename I1, typename I2> class Test,
41  template<typename I> class IteratorModel,
42  typename I, typename S, typename T, typename Proj, typename Pred,
43  bool = conjunction<
44  IteratorModel<I>,
45  sentinel_for<S, I>,
46  projectable<I, Proj>>::value /* true */
47 >
48 struct algo_check_binary_iterator : Test<Pred, projected<I, Proj>, T> {};
49 
50 template<
51  template<typename F, typename I1, typename I2> class Test,
52  template<typename I> class IteratorModel,
53  typename I, typename S, typename T, typename Proj, typename Pred>
54 struct algo_check_binary_iterator<Test, IteratorModel, I, S, T, Proj, Pred, false> : std::false_type {};
55 
56 
57 
58 
59 template<
60  template<typename F, typename I, typename...> class Test,
61  typename I, typename Proj, typename Pred,
62  bool = projectable<I, Proj>::value /* true */
63 >
64 struct algo_check_unary_range_2 : Test<Pred, projected<I, Proj>> {};
65 
66 template<
67  template<typename F, typename I, typename...> class Test,
68  typename I, typename Proj, typename Pred
69 >
70 struct algo_check_unary_range_2<Test, I, Proj, Pred, false> : std::false_type {};
71 
72 template<
73  template<typename F, typename I, typename...> class Test,
74  template<typename R> class RangeModel,
75  typename R, typename Proj, typename Pred,
76  bool = RangeModel<R>::value /* true */
77 >
78 struct algo_check_unary_range : algo_check_unary_range_2<Test, iterator_t<R>, Proj, Pred> {};
79 
80 template<
81  template<typename F, typename I, typename...> class Test,
82  template<typename R> class RangeModel,
83  typename R, typename Proj, typename Pred
84 >
85 struct algo_check_unary_range<Test, RangeModel, R, Proj, Pred, false> : std::false_type {};
86 
87 
88 
89 template<
90  template<typename F, typename I1, typename I2> class Test,
91  typename I, typename T, typename Proj, typename Pred,
92  bool = projectable<I, Proj>::value /* true */>
93 struct algo_check_binary_range_2 : Test<Pred, projected<I, Proj>, T> {};
94 
95 template<
96  template<typename F, typename I1, typename I2> class Test,
97  typename I, typename T, typename Proj, typename Pred>
98 struct algo_check_binary_range_2<Test, I, T, Proj, Pred, false> : std::false_type {};
99 
100 template<
101  template<typename F, typename I1, typename I2> class Test,
102  template<typename R> class RangeModel,
103  typename R, typename T, typename Proj, typename Pred,
104  bool = RangeModel<R>::value /* true */>
105 struct algo_check_binary_range : algo_check_binary_range_2<Test, iterator_t<R>, T, Proj, Pred> {};
106 
107 template<
108  template<typename F, typename I1, typename I2> class Test,
109  template<typename R> class RangeModel,
110  typename R, typename T, typename Proj, typename Pred>
111 struct algo_check_binary_range<Test, RangeModel, R, T, Proj, Pred, false> : std::false_type {};
112 
113 
114 // algo_check_unary_input_iterator
115 // : test if expression `Test<Pred, projected<I, Proj>>` is valid
116 
117 template<template<typename F, typename I, typename...> class Test, typename I, typename S, typename Proj, typename Pred>
118 struct algo_check_unary_input_iterator : algo_check_unary_iterator<Test, input_iterator, I, S, Proj, Pred> {};
119 
120 
121 // algo_check_unary_forward_iterator
122 // : test if expression `Test<Pred, projected<I, Proj>>` is valid
123 
124 template<
125  template<typename F, typename I, typename...> class Test,
126  typename I, typename S, typename Proj, typename Pred>
127 struct algo_check_unary_forward_iterator : algo_check_unary_iterator<Test, forward_iterator, I, S, Proj, Pred> {};
128 
129 
130 // algo_check_binary_input_iterator
131 // : test if expresssion `Test<Pred, projected<I, Proj>, T>` is valid
132 
133 template<
134  template<typename F, typename I1, typename I2> class Test,
135  typename I, typename S, typename T, typename Proj, typename Pred>
136 struct algo_check_binary_input_iterator : algo_check_binary_iterator<Test, input_iterator, I, S, T, Proj, Pred> {};
137 
138 
139 // algo_check_unary_input_range
140 // : test if expression `Test<Pred, projected<iterator_t<R>, Proj>>` is valid
141 
142 template<template<typename F, typename I, typename...> class Test, typename R, typename Proj, typename Pred>
143 struct algo_check_unary_input_range : algo_check_unary_range<Test, input_range, R, Proj, Pred> {};
144 
145 // algo_check_unary_forward_range
146 // : test if expression `Test<Pred, projected<iterator_t<R>, Proj>>` is valid
147 
148 template<template<typename F, typename I, typename...> class Test, typename R, typename Proj, typename Pred>
149 struct algo_check_unary_forward_range : algo_check_unary_range<Test, forward_range, R, Proj, Pred> {};
150 
151 // algo_check_binary_input_range
152 // : test if expression `Test<Pred, projected<iterator_t<R>, Proj>, T>` is valid
153 template<
154  template<typename F, typename I1, typename I2> class Test,
155  typename R, typename T, typename Proj, typename Pred>
156 struct algo_check_binary_input_range : algo_check_binary_range<Test, input_range, R, T, Proj, Pred> {};
157 
158 } // namespace vccc
159 } // namespace ranges
160 } // namespace detail
161 
162 #endif // VCCC_ALGORITHM_RANGES_DETAIL_INPUT_RANGE_CHECK_HPP_
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35