17 #include <common/visibility_control.hpp>
21 #include <type_traits>
23 #ifndef COMMON__TYPE_TRAITS_HPP_
24 #define COMMON__TYPE_TRAITS_HPP_
33 template<
class QueryT,
class TupleT>
36 static_assert(!std::is_same<TupleT, std::tuple<>>::value,
"Could not find QueryT in given tuple");
40 template<
class HeadT,
class ... Tail>
41 struct COMMON_PUBLIC
index<HeadT, std::tuple<HeadT, Tail...>>
42 : std::integral_constant<std::int32_t, 0> {};
45 template<
class QueryT,
class HeadT,
class ... Tail>
46 struct COMMON_PUBLIC
index<QueryT, std::tuple<HeadT, Tail...>>
47 : std::integral_constant<std::int32_t, 1 + index<QueryT, std::tuple<Tail...>>::value> {};
60 template<std::size_t
I = 0UL,
typename Callable,
typename ... TypesT>
61 COMMON_PUBLIC
inline typename std::enable_if_t<
I ==
sizeof...(TypesT)>
62 visit(std::tuple<TypesT...> &, Callable) {}
64 template<std::size_t
I = 0UL,
typename Callable,
typename ... TypesT>
65 COMMON_PUBLIC
inline typename std::enable_if_t<
I ==
sizeof...(TypesT)>
66 visit(
const std::tuple<TypesT...> &, Callable) {}
83 template<std::size_t
I = 0UL,
typename Callable,
typename ... TypesT>
84 COMMON_PUBLIC
inline typename std::enable_if_t<
I !=
sizeof...(TypesT)>
85 visit(std::tuple<TypesT...> & tuple, Callable callable)
87 callable(std::get<I>(tuple));
88 visit<
I + 1UL, Callable, TypesT...>(tuple, callable);
91 template<std::size_t
I = 0UL,
typename Callable,
typename ... TypesT>
92 COMMON_PUBLIC
inline typename std::enable_if_t<
I !=
sizeof...(TypesT)>
93 visit(
const std::tuple<TypesT...> & tuple, Callable callable)
95 callable(std::get<I>(tuple));
96 visit<
I + 1UL, Callable, TypesT...>(tuple, callable);
103 template<
class TraitT>
105 template<
class TraitT,
class ... TraitsTs>
107 : std::conditional_t<static_cast<bool>(TraitT::value), conjunction<TraitsTs...>, TraitT> {};
113 #endif // COMMON__TYPE_TRAITS_HPP_