|
15 | 15 | #pragma once |
16 | 16 |
|
17 | 17 | #include <tuple> |
| 18 | +#include <type_traits> |
18 | 19 | #include <vector> |
19 | 20 |
|
20 | 21 | namespace iganet::utils { |
21 | 22 |
|
| 23 | +/// @brief Type trait for std::tuple type |
| 24 | +/// @{ |
| 25 | +template <class T> struct is_tuple : std::false_type {}; |
| 26 | + |
| 27 | +template <class... Ts> struct is_tuple<std::tuple<Ts...>> : std::true_type {}; |
| 28 | +/// @} |
| 29 | + |
| 30 | +template <class T> inline constexpr bool is_tuple_v = is_tuple<T>::value; |
| 31 | + |
| 32 | +/// @brief Type trait for std::tuple<std::tuple> type |
| 33 | +/// @{ |
| 34 | +template <class T> struct is_tuple_of_tuples : std::false_type {}; |
| 35 | + |
| 36 | +template <class... Ts> |
| 37 | +struct is_tuple_of_tuples<std::tuple<Ts...>> |
| 38 | + : std::common_type_t<is_tuple<Ts>...> {}; |
| 39 | +/// @} |
| 40 | + |
| 41 | +/// @brief Alias for is_tuple_of_tuples::type |
| 42 | +template <class T> using is_tuple_of_tuples_t = is_tuple_of_tuples<T>::type; |
| 43 | + |
| 44 | +/// @brief Alias for is_tuple_of_tuples::value |
| 45 | +template <class T> |
| 46 | +inline constexpr auto is_tuple_of_tuples_v = is_tuple_of_tuples<T>::value; |
| 47 | + |
| 48 | +/// @brief Type trait for concatenating std::tuples |
| 49 | +/// @{ |
| 50 | +template <typename... Tuples> struct tuple_cat; |
| 51 | + |
| 52 | +template <> struct tuple_cat<> { |
| 53 | + using type = std::tuple<>; |
| 54 | +}; |
| 55 | + |
| 56 | +template <typename... Ts, typename... Tuples> |
| 57 | +struct tuple_cat<std::tuple<Ts...>, Tuples...> { |
| 58 | + using type = decltype(std::tuple_cat( |
| 59 | + std::declval<std::tuple<Ts...>>(), |
| 60 | + std::declval<typename tuple_cat<Tuples...>::type>())); |
| 61 | +}; |
| 62 | + |
| 63 | +template <typename T, typename... Tuples> struct tuple_cat<T, Tuples...> { |
| 64 | + using type = decltype(std::tuple_cat( |
| 65 | + std::declval<std::tuple<T>>(), |
| 66 | + std::declval<typename tuple_cat<Tuples...>::type>())); |
| 67 | +}; |
| 68 | +/// @} |
| 69 | + |
| 70 | +/// @brief Alias for tuple_cat::type |
| 71 | +template <typename... Tuples> using tuple_cat_t = tuple_cat<Tuples...>::type; |
| 72 | + |
| 73 | +/// @brief Alias for tuple_cat::value |
| 74 | +template <typename... Tuples> |
| 75 | +inline constexpr auto tuple_cat_v = tuple_cat<Tuples...>::value; |
| 76 | + |
22 | 77 | /// @brief Concatenates the entries of a std::tuple object into a |
23 | 78 | /// single Torch tensor along the given dimension |
24 | 79 | template <typename... Tensors> |
|
0 commit comments