VCCC  2024.05
VisualCamp Common C++ library
tuple_like.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 2023/10/27.
3 //
4 
5 #ifndef VCCC_TUPLE_TUPLE_LIKE_HPP
6 #define VCCC_TUPLE_TUPLE_LIKE_HPP
7 
8 #include <array>
9 #include <cstddef>
10 #include <tuple>
11 #include <type_traits>
12 #include <utility>
13 
18 
19 namespace vccc {
20 
21 namespace internal {
22 
23 template<typename T, typename = void>
24 struct has_tuple_size : std::false_type {};
25 
26 template<typename T>
27 struct has_tuple_size<T, void_t<std::tuple_size<T>>> : std::true_type {};
28 
29 template<typename T, std::size_t X, bool v = /* true */ has_tuple_size<T>::value>
30 struct tuple_size_equal_to : bool_constant<std::tuple_size<T>::value == X> {};
31 
32 template<typename T, std::size_t X>
33 struct tuple_size_equal_to<T, X, false> : std::false_type {};
34 
35 template<typename T, std::size_t X, bool v = /* true */ has_tuple_size<T>::value>
36 struct tuple_size_greater_than : bool_constant<(std::tuple_size<T>::value > X)> {};
37 
38 template<typename T, std::size_t X>
39 struct tuple_size_greater_than<T, X, false> : std::false_type {};
40 
41 template<typename T, std::size_t X, bool v = /* true */ has_tuple_size<T>::value>
42 struct tuple_size_less_than : bool_constant<(std::tuple_size<T>::value < X)> {};
43 
44 template<typename T, std::size_t X>
45 struct tuple_size_less_than<T, X, false> : std::false_type {};
46 
47 template<typename T>
48 struct tuple_like_uncvref : std::false_type {};
49 
50 
51 template<typename T, std::size_t N>
52 struct tuple_like_uncvref<std::array<T, N>> : std::true_type {};
53 
54 template<typename T, typename U>
55 struct tuple_like_uncvref<std::pair<T, U>> : std::true_type {};
56 
57 template<typename ...T>
58 struct tuple_like_uncvref<std::tuple<T...>> : std::true_type {};
59 
60 } // namespace internal
61 
64 
91 template<typename T>
92 struct tuple_like : internal::tuple_like_uncvref<remove_cvref_t<T>> {};
93 
94 
101 template<typename T, std::size_t N>
102 struct sized_tuple_like
103  : conjunction<
104  tuple_like<T>,
105  internal::tuple_size_equal_to<T, N>
106  > {};
107 
108 
115 template<typename T>
116 using pair_like = sized_tuple_like<T, 2>;
117 
119 
120 } // namespace vccc
121 
122 #endif // VCCC_TUPLE_TUPLE_LIKE_HPP
std::integral_constant< bool, v > bool_constant
Definition: bool_constant.hpp:19
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