VCCC  2024.05
VisualCamp Common C++ library
sized_sentinel_for.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 2023/12/24.
3 //
4 
5 #ifndef VCCC_ITERATOR_SIZED_SENTINEL_FOR_HPP_
6 #define VCCC_ITERATOR_SIZED_SENTINEL_FOR_HPP_
7 
8 #include <type_traits>
9 
18 
19 namespace vccc {
20 
21 template<typename S, typename I>
22 struct disable_sized_sentinel_for : std::false_type {};
23 
24 namespace detail {
25 
26 template<typename S, typename I, typename = void, typename = void>
27 struct explicit_sized_sentinel_subtract_check : std::false_type {};
28 
29 template<typename S, typename I>
30 struct explicit_sized_sentinel_subtract_check<
31  S, I,
32  void_t<decltype(std::declval<S>() - std::declval<I>())>,
33  void_t<decltype(std::declval<I>() - std::declval<S>())>
34  > : conjunction<
35  same_as<decltype(std::declval<S>() - std::declval<I>()), iter_difference_t<I>>,
36  same_as<decltype(std::declval<I>() - std::declval<S>()), iter_difference_t<I>>
37  > {};
38 
39 template<typename S, typename I>
40 struct sized_sentinel_requires : implicit_expression_check<explicit_sized_sentinel_subtract_check, const S&, const I&> {};
41 
42 template<
43  typename S,
44  typename I,
45  bool = conjunction<
46  sentinel_for<S, I>,
47  negation<disable_sized_sentinel_for<std::remove_cv_t<S>, std::remove_cv_t<I>>>,
48  has_typename_type<iter_difference<I>>
49  >::value
50 >
51 struct sized_sentinel_for_impl : std::false_type {};
52 
53 template<typename S, typename I>
54 struct sized_sentinel_for_impl<S, I, true> : sized_sentinel_requires<S, I> {};
55 
56 } // namespace detail
57 
58 
61 
62 
74 template<typename S, typename I>
75 struct sized_sentinel_for : detail::sized_sentinel_for_impl<S, I> {};
76 
78 
79 } // namespace vccc
80 
81 #endif // VCCC_ITERATOR_SIZED_SENTINEL_FOR_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: sized_sentinel_for.hpp:22
specifies that the - operator can be applied to an iterator and a sentinel to calculate their differe...
Definition: sized_sentinel_for.hpp:75