5 #ifndef VCCC_TYPE_TRAITS_COMMON_TYPE_HPP
6 #define VCCC_TYPE_TRAITS_COMMON_TYPE_HPP
116 template<
typename ...T>
121 struct no_common_type {};
123 template<
typename T,
typename U>
124 using common_type_ternary = std::decay_t<decltype(false ? std::declval<T>() :
std::declval<U>())>;
126 template<
typename CR1,
typename CR2>
127 struct common_type_test_3_1 {
128 using type = common_type_ternary<CR1, CR2>;
132 template<
typename CR1,
typename CR2,
typename =
void>
133 struct common_type_test_3 : no_common_type {};
135 template<
typename CR1,
typename CR2>
136 struct common_type_test_3<CR1, CR2,
void_t<common_type_ternary<CR1, CR2>>>
137 : common_type_test_3_1<CR1, CR2> {};
140 template<
typename T1,
typename T2,
141 bool v1 = is_referencable<std::remove_reference_t<T1>>
::value,
142 bool v2 = is_referencable<std::remove_reference_t<T2>>
::value>
143 struct common_type_test_2 : no_common_type {};
145 template<
typename T1,
typename T2>
146 struct common_type_test_2<T1, T2, true, true>
147 : common_type_test_3<const std::remove_reference_t<T1>&, const std::remove_reference_t<T2>&> {};
149 template<
typename T1,
typename T2>
150 struct common_type_test_1_1 {
151 using type = common_type_ternary<T1, T2>;
154 template<
typename T1,
typename T2,
typename =
void>
155 struct common_type_test_1 : common_type_test_2<T1, T2> {};
157 template<
typename T1,
typename T2>
158 struct common_type_test_1<T1, T2,
void_t<common_type_ternary<T1, T2>>>
159 : common_type_test_1_1<T1, T2> {};
162 template<
typename T1,
typename T2,
bool >
163 struct common_type_tuple_like_3 : common_type_test_1<T1, T2> {};
165 template<
template<
typename...>
class Tuple,
typename... T,
typename... U>
166 struct common_type_tuple_like_3<Tuple<T...>, Tuple<U...>, true> {
167 using type = Tuple<typename common_type<T, U>::type...>;
175 struct common_type_tuple_like_2 : common_type_test_1<T1, T2> {};
177 template<
template<
typename...>
class TTuple,
template<
typename...>
class UTuple,
typename... T,
typename... U>
178 struct common_type_tuple_like_2<TTuple<T...>, UTuple<U...>, true>
179 : common_type_tuple_like_3<
183 has_typename_type<common_type<T, U>>...
193 std::is_same<T1, std::decay_t<T1>>,
194 std::is_same<T2, std::decay_t<T2>>
197 struct common_type_tuple_like : common_type_tuple_like_2<T1, T2> {};
199 template<
typename T1,
typename T2>
200 struct common_type_tuple_like<T1, T2, false> : common_type_test_1<T1, T2> {};
203 template<
bool HasType ,
typename CommonType,
typename... Ts>
204 struct common_type_test_three_or_more : no_common_type {};
206 template<
typename CommonType,
typename... Ts>
207 struct common_type_test_three_or_more<true, CommonType, Ts...>
208 : common_type<typename CommonType::type, Ts...> {};
218 template<
typename T1,
typename T2>
219 struct common_type<T1, T2> : detail::common_type_tuple_like<std::decay_t<T1>, std::decay_t<T2>> {};
221 template<
typename T1,
typename T2,
typename ...Ts>
223 : detail::common_type_test_three_or_more<
224 has_typename_type<common_type<T1, T2>>::value,
228 template<
typename ...T>
235 template<
typename T,
typename U,
bool >
236 struct common_type_specialization_impl : no_common_type {};
238 template<
template<
typename...>
class C,
typename... T,
typename... U>
239 struct common_type_specialization_impl<C<T...>, C<U...>, true> {
240 using type = C<common_type_t<T, U>...>;
243 template<
typename T,
typename U>
244 struct common_type_specialization;
246 template<
template<
typename...>
class C,
typename... T,
typename... U>
247 struct common_type_specialization<C<T...>, C<U...>>
248 : common_type_specialization_impl<
252 has_typename_type<common_type<T, U>>...
258 template<
typename T1,
typename T2,
typename U1,
typename U2>
260 : detail::common_type_specialization<std::pair<T1, T2>, std::pair<U1, U2>> {};
262 template<
typename Rep1,
typename Period1,
typename Rep2,
typename Period2>
263 struct common_type<
std::chrono::duration<Rep1, Period1>, std::chrono::duration<Rep2, Period2>>
264 : detail::common_type_specialization<std::chrono::duration<Rep1, Period1>, std::chrono::duration<Rep2, Period2>> {};
266 template<
typename Clock,
typename Duration1,
typename Duration2>
267 struct common_type<
std::chrono::time_point<Clock, Duration1>, std::chrono::time_point<Clock, Duration2>>
268 : detail::common_type_specialization<std::chrono::time_point<Clock, Duration1>, std::chrono::time_point<Clock, Duration2>> {};
std::integral_constant< bool, v > bool_constant
Definition: bool_constant.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: common_type.hpp:117