4#ifndef TETL_TYPE_TRAITS_COMMON_TYPE_HPP
5#define TETL_TYPE_TRAITS_COMMON_TYPE_HPP
7#include <etl/_type_traits/decay.hpp>
8#include <etl/_type_traits/declval.hpp>
9#include <etl/_type_traits/void_t.hpp>
18template <
typename... T>
22struct common_type<T> : common_type<T, T> { };
25template <
typename T1,
typename T2>
26using cond_t =
decltype(
false ? declval<T1>() : declval<T2>());
28template <
typename T1,
typename T2,
typename =
void>
29struct common_type_2_impl { };
31template <
typename T1,
typename T2>
32struct common_type_2_impl<T1, T2, void_t<cond_t<T1, T2>>> {
33 using type = decay_t<cond_t<T1, T2>>;
36template <
typename AlwaysVoid,
typename T1,
typename T2,
typename... R>
37struct common_type_multi_impl { };
39template <
typename T1,
typename T2,
typename... R>
40struct common_type_multi_impl<void_t<
typename common_type<T1, T2>::type>, T1, T2, R...>
41 : common_type<
typename common_type<T1, T2>::type, R...> { };
44template <
typename T1,
typename T2>
45struct common_type<T1, T2> : detail::common_type_2_impl<decay_t<T1>, decay_t<T2>> { };
47template <
typename T1,
typename T2,
typename... R>
48struct common_type<T1, T2, R...> : detail::common_type_multi_impl<
void, T1, T2, R...> { };
50template <
typename... T>
51using common_type_t =
typename common_type<T...>::type;
Definition adjacent_find.hpp:9