VCCC  2024.05
VisualCamp Common C++ library
bigger_type.hpp
Go to the documentation of this file.
1 # /*
2 # * Created by YongGyu Lee on 2020/12/08.
3 # */
4 #
5 # ifndef VCCC_TYPE_TRAITS_BIGGER_TYPE_HPP
6 # define VCCC_TYPE_TRAITS_BIGGER_TYPE_HPP
7 #
8 # include <type_traits>
9 
10 namespace vccc {
11 
28 template<typename ...>
29 struct bigger_type;
30 
31 template<typename T>
32 struct bigger_type<T>;
33 
34 template<typename T1, typename T2>
35 struct bigger_type<T1, T2>;
36 
37 template<typename T1, typename T2, typename ...Ts>
38 struct bigger_type<T1, T2, Ts...>;
39 
40 template<typename T>
41 struct bigger_type<T> {
42  static_assert(!std::is_integral<T>::value, "Use signed_bigger_type or unsigned_bigger_type for integer types");
43  using type = T;
44 };
45 
46 template<typename T1, typename T2>
47 struct bigger_type<T1, T2> {
48  using type = std::conditional_t<sizeof(T1) >= sizeof(T2), typename bigger_type<T1>::type, typename bigger_type<T2>::type>;
49 };
50 
51 template<typename T1, typename T2,typename ...Ts>
52 struct bigger_type<T1, T2, Ts...> {
53  using bt = typename bigger_type<T1, T2>::type;
54  using type = typename bigger_type<bt, Ts...>::type;
55 };
56 
57 template<typename ...Ts>
58 using bigger_type_t = typename bigger_type<Ts...>::type;
59 
60 
65 template<typename ...>
67 
68 
69 template<typename T>
71 
72 template<typename T1, typename T2>
74 
75 template<typename T1, typename T2, typename ...Ts>
76 struct signed_bigger_type<T1, T2, Ts...>;
77 
78 template<typename T>
79 struct signed_bigger_type<T> {
80  static_assert(std::is_integral<T>::value, "Use bigger_type for non-integral types");
81  using type = T;
82 };
83 
84 template<typename T1, typename T2>
85 struct signed_bigger_type<T1, T2> {
86  using type =
87  std::conditional_t<sizeof(T1) >= sizeof(T2) && std::is_signed<T1>::value,
90 };
91 
92 template<typename T1, typename T2, typename ...Ts>
93 struct signed_bigger_type<T1, T2, Ts...> {
95  using type = typename signed_bigger_type<bt, Ts...>::type;
96 };
97 
98 template<typename ...Ts>
99 using signed_bigger_type_t = typename signed_bigger_type<Ts...>::type;
100 
101 
107 template<typename ...>
109 
110 
111 template<typename T>
113 
114 template<typename T1, typename T2>
116 
117 template<typename T1, typename T2, typename ...Ts>
118 struct unsigned_bigger_type<T1, T2, Ts...>;
119 
120 template<typename T>
122  static_assert(std::is_integral<T>::value, "Use bigger_type for non-integral types");
123  using type = T;
124 };
125 
126 template<typename T1, typename T2>
127 struct unsigned_bigger_type<T1, T2> {
128  using type =
129  std::conditional_t<sizeof(T1) >= sizeof(T2) && std::is_unsigned<T1>::value,
132 };
133 
134 template<typename T1, typename T2, typename ...Ts>
135 struct unsigned_bigger_type<T1, T2, Ts...> {
137  using type = typename unsigned_bigger_type<bt, Ts...>::type;
138 };
139 
140 template<typename ...Ts>
141 using unsigned_bigger_type_t = typename unsigned_bigger_type<Ts...>::type;
142 
144 
145 } // namespace vccc
146 
147 # endif // VCCC_TYPE_TRAITS_BIGGER_TYPE_HPP
typename unsigned_bigger_type< Ts... >::type unsigned_bigger_type_t
Definition: bigger_type.hpp:141
typename bigger_type< Ts... >::type bigger_type_t
Definition: bigger_type.hpp:58
typename signed_bigger_type< Ts... >::type signed_bigger_type_t
Definition: bigger_type.hpp:99
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
typename bigger_type< bt, Ts... >::type type
Definition: bigger_type.hpp:54
typename bigger_type< T1, T2 >::type bt
Definition: bigger_type.hpp:53
Definition: bigger_type.hpp:47
std::conditional_t< sizeof(T1) >=sizeof(T2), typename bigger_type< T1 >::type, typename bigger_type< T2 >::type > type
Definition: bigger_type.hpp:48
Definition: bigger_type.hpp:41
T type
Definition: bigger_type.hpp:43
Definition: bigger_type.hpp:29
typename signed_bigger_type< bt, Ts... >::type type
Definition: bigger_type.hpp:95
typename signed_bigger_type< T1, T2 >::type bt
Definition: bigger_type.hpp:94
Definition: bigger_type.hpp:85
std::conditional_t< sizeof(T1) >=sizeof(T2) &&std::is_signed< T1 >::value, typename signed_bigger_type< T1 >::type, typename signed_bigger_type< T2 >::type > type
Definition: bigger_type.hpp:89
Definition: bigger_type.hpp:79
T type
Definition: bigger_type.hpp:81
Definition: bigger_type.hpp:66
typename unsigned_bigger_type< bt, Ts... >::type type
Definition: bigger_type.hpp:137
typename unsigned_bigger_type< T1, T2 >::type bt
Definition: bigger_type.hpp:136
Definition: bigger_type.hpp:127
std::conditional_t< sizeof(T1) >=sizeof(T2) &&std::is_unsigned< T1 >::value, typename unsigned_bigger_type< T1 >::type, typename unsigned_bigger_type< T2 >::type > type
Definition: bigger_type.hpp:131
Definition: bigger_type.hpp:121
T type
Definition: bigger_type.hpp:123
Definition: bigger_type.hpp:108