18 #include <common/visibility_control.hpp>
22 #include <type_traits>
24 #ifndef COMMON__TYPE_TRAITS_HPP_
25 #define COMMON__TYPE_TRAITS_HPP_
47 return sizeof(T) == 0;
51 template<
class QueryT,
class TupleT>
54 static_assert(!std::is_same<TupleT, std::tuple<>>::value,
"Could not find QueryT in given tuple");
58 template<
class HeadT,
class ... Tail>
59 struct COMMON_PUBLIC
index<HeadT, std::tuple<HeadT, Tail...>>
60 : std::integral_constant<std::int32_t, 0> {};
63 template<
class QueryT,
class HeadT,
class ... Tail>
64 struct COMMON_PUBLIC
index<QueryT, std::tuple<HeadT, Tail...>>
65 : std::integral_constant<std::int32_t, 1 + index<QueryT, std::tuple<Tail...>>::value> {};
78 template<std::size_t
I = 0UL,
typename Callable,
typename ... TypesT>
79 COMMON_PUBLIC
inline constexpr
typename std::enable_if_t<
I ==
sizeof...(TypesT)>
80 visit(std::tuple<TypesT...> &, Callable) noexcept {}
82 template<std::size_t
I = 0UL,
typename Callable,
typename ... TypesT>
83 COMMON_PUBLIC
inline constexpr
typename std::enable_if_t<
I ==
sizeof...(TypesT)>
84 visit(
const std::tuple<TypesT...> &, Callable) noexcept {}
101 template<std::size_t
I = 0UL,
typename Callable,
typename ... TypesT>
102 COMMON_PUBLIC
inline constexpr
typename std::enable_if_t<
I !=
sizeof...(TypesT)>
103 visit(std::tuple<TypesT...> & tuple, Callable callable) noexcept
105 callable(std::get<I>(tuple));
106 visit<
I + 1UL, Callable, TypesT...>(tuple, callable);
109 template<std::size_t
I = 0UL,
typename Callable,
typename ... TypesT>
110 COMMON_PUBLIC
inline constexpr
typename std::enable_if_t<
I !=
sizeof...(TypesT)>
111 visit(
const std::tuple<TypesT...> & tuple, Callable callable) noexcept
113 callable(std::get<I>(tuple));
114 visit<
I + 1UL, Callable, TypesT...>(tuple, callable);
121 template<
class TraitT>
123 template<
class TraitT,
class ... TraitsTs>
125 : std::conditional_t<static_cast<bool>(TraitT::value), conjunction<TraitsTs...>, TraitT> {};
136 template<
typename QueryT,
typename TupleT>
145 template<
typename QueryT>
146 struct has_type<QueryT, std::tuple<>>: std::false_type {};
155 template<
typename QueryT,
typename HeadT,
typename ... TailTs>
156 struct has_type<QueryT, std::tuple<HeadT, TailTs...>>:
has_type<QueryT, std::tuple<TailTs...>> {};
165 template<
typename QueryT,
typename ... TailTs>
166 struct has_type<QueryT, std::tuple<QueryT, TailTs...>>: std::true_type {};
179 template<
typename TupleT1,
typename TupleT2>
188 template<std::size_t... Indices>
191 return std::tuple_cat(
193 has_type<std::tuple_element_t<Indices, TupleT1>, TupleT2>::value,
194 std::tuple<std::tuple_element_t<Indices, TupleT1>>,
195 std::tuple<>>{} ...);
206 #endif // COMMON__TYPE_TRAITS_HPP_