Go to the documentation of this file.
15 #ifndef BELUGA_TYPE_TRAITS_TUPLE_TRAITS_HPP
16 #define BELUGA_TYPE_TRAITS_TUPLE_TRAITS_HPP
19 #include <type_traits>
33 template <
typename,
typename =
void>
34 struct is_complete : std::false_type {};
37 struct is_complete<T,
std::void_t<decltype(sizeof(T))>> : std::true_type {};
49 struct is_tuple_like : detail::is_complete<std::tuple_size<std::decay_t<T>>> {};
63 typename Is = std::enable_if_t<
64 std::tuple_size_v<std::decay_t<T>> == std::tuple_size_v<std::decay_t<U>>,
65 std::make_index_sequence<std::tuple_size_v<std::decay_t<T>>>>>
69 template <
typename T,
typename U, std::size_t... I>
72 using type = std::tuple<
73 std::common_type_t<std::tuple_element_t<I, std::decay_t<T>>, std::tuple_element_t<I, std::decay_t<U>>>...>;
77 template <
typename T,
typename U>
81 template <
typename,
typename,
typename =
void>
85 template <
typename T,
typename U>
89 template <
typename T,
typename U>
105 template <
class T,
class... Args>
107 constexpr
bool kMatches[
sizeof...(Args)] =
108 {std::is_same_v<T, std::decay_t<Args>>...};
110 for (std::size_t i = 0; i <
sizeof...(Args); ++i) {
123 template <
class T,
class... Args>
132 template <
class T,
class TupleLike,
class =
void>
136 template <
class T,
template <
class...>
class TupleLike,
class... Args>
140 std::
enable_if_t<is_tuple_like_v<std::decay_t<TupleLike<Args...>>> && detail::tuple_index_found<T, Args...>()>>
141 : std::integral_constant<std::size_t, detail::tuple_index_helper<T, Args...>()> {};
144 template <
class T,
class TupleLike>
148 template <
class T,
class TupleLike>
152 template <
class T,
class TupleLike,
class =
void>
156 template <
class T,
template <
class...>
class TupleLike,
class... Args>
160 std::
enable_if_t<is_tuple_like_v<std::decay_t<TupleLike<Args...>>> && detail::tuple_index_found<T, Args...>()>>
164 template <
class T,
class TupleLike>
168 template <
class T,
class TupleLike>
169 constexpr decltype(
auto)
element(TupleLike&& tuple) noexcept {
170 constexpr std::size_t kIndex = tuple_index_v<T, std::decay_t<TupleLike>>;
171 return std::get<kIndex>(std::forward<TupleLike>(tuple));
175 template <
class T,
class =
void>
179 template <
template <
class...>
class TupleLike,
class... Args>
182 using type = std::decay_t<TupleLike<std::decay_t<Args>...>>;
Meta-function that returns the tuple index of the element whose type is T.
std::decay_t< TupleLike< std::decay_t< Args >... > > type
Return type.
constexpr bool has_single_element_v
Convenience template variable for has_single_element.
constexpr decltype(auto) element(TupleLike &&tuple) noexcept
Returns element of a tuple like object whose type is T (or a possibly const reference to T).
typename tuple_index< T, TupleLike >::type tuple_index_t
Convenience template type alias for tuple_index.
typename std::enable_if< B, T >::type enable_if_t
Meta-function that decays a tuple like type and its members.
Meta-function that computes a common tuple type given two tuple-like types T and U.
constexpr bool is_tuple_like_v
Convenience template variable for is_tuple_like.
Meta-function that returns true if T is a tuple-like type.
constexpr bool tuple_index_found() noexcept
Help method that returns true if a tuple element index that matches an input type is found.
static constexpr std::size_t kTupleIndexAmbiguous
Constant value to return when there are multiple indices that match the input type.
typename common_tuple_type< T, U >::type common_tuple_type_t
Convenience template type alias for common_tuple_type.
constexpr std::size_t tuple_index_v
Convenience template variable for tuple_index.
Meta-function that returns true if there is a single element of type T in the tuple-like type.
typename decay_tuple_like< T >::type decay_tuple_like_t
Convenience template type alias for decay_tuple_like.
constexpr bool has_common_tuple_type_v
Convenience template variable for has_common_tuple_type.
constexpr std::size_t tuple_index_helper() noexcept
Help method that finds a tuple element index that matches an input type.
static constexpr std::size_t kTupleIndexNotFound
Constant value to return when the index was not found.
Meta-function that checks for the existence of a common tuple type.
std::tuple< std::common_type_t< std::tuple_element_t< I, std::decay_t< T > >, std::tuple_element_t< I, std::decay_t< U > >>... > type
Common tuple type based on an std::tuple.
The main Beluga namespace.
beluga
Author(s):
autogenerated on Tue Jul 16 2024 02:59:53