VCCC  2024.05
VisualCamp Common C++ library
weakly_incrementable.hpp
Go to the documentation of this file.
1 //
2 // Created by cosge on 2023-12-02.
3 //
4 
5 #ifndef VCCC_ITERATOR_WEAKLY_INCREMENTABLE_HPP_
6 #define VCCC_ITERATOR_WEAKLY_INCREMENTABLE_HPP_
7 
8 #include <type_traits>
9 
17 
18 namespace vccc {
19 namespace detail {
20 
21 template<typename T, bool = has_typename_type<iter_difference<T>>::value>
22 struct is_signed_integer_like_iter_difference : std::false_type {};
23 
24 template<typename T>
25 struct is_signed_integer_like_iter_difference<T, true>
26  : is_signed_integer_like<iter_difference_t<T>> {};
27 
28 template<typename T, typename = void>
29 struct is_pre_incrementable : std::false_type {};
30 
31 template<typename T>
32 struct is_pre_incrementable<T, void_t<decltype( ++std::declval<T&>() )>> : same_as<decltype( ++std::declval<T&>() ), T&> {};
33 
34 template<typename T, typename = void>
35 struct is_post_incrementable : std::false_type {};
36 
37 template<typename T>
38 struct is_post_incrementable<T, void_t<decltype( std::declval<T&>()++ )>> : std::true_type {};
39 
40 } // namespace detail
41 
44 
45 template<typename I>
47  : conjunction<
48  movable<I>,
49  detail::is_signed_integer_like_iter_difference<I>,
50  detail::is_pre_incrementable<I>,
51  detail::is_post_incrementable<I>
52  > {};
53 
55 
56 } // namespace vccc
57 
58 #endif // VCCC_ITERATOR_WEAKLY_INCREMENTABLE_HPP_
void void_t
Definition: void_t.hpp:19
Definition: matrix.hpp:495
Definition: directory.h:12
Definition: conjunction.hpp:22
Definition: weakly_incrementable.hpp:52