aboutsummaryrefslogtreecommitdiff
path: root/src/common/Utilities/Tuples.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/Utilities/Tuples.h')
-rw-r--r--src/common/Utilities/Tuples.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/common/Utilities/Tuples.h b/src/common/Utilities/Tuples.h
index 73337ebd9f5..8b608fd8901 100644
--- a/src/common/Utilities/Tuples.h
+++ b/src/common/Utilities/Tuples.h
@@ -29,6 +29,37 @@ namespace Trinity
struct has_type<T, std::tuple<Us...>> : std::disjunction<std::is_same<T, Us>...>
{
};
+
+ template <typename T, typename... Us>
+ constexpr bool has_type_v = has_type<T, Us...>::value;
+
+ template<typename>
+ struct is_tuple : std::false_type
+ {
+ };
+
+ template<typename... Ts>
+ struct is_tuple<std::tuple<Ts...>> : std::true_type
+ {
+ };
+
+ template<typename... Ts>
+ constexpr bool is_tuple_v = is_tuple<Ts...>::value;
+
+ namespace Impl
+ {
+ template <class T, class Tuple, size_t... I>
+ T* new_from_tuple(Tuple&& args, std::index_sequence<I...>)
+ {
+ return new T(std::get<I>(std::forward<Tuple>(args))...);
+ }
+ }
+
+ template<class T, class Tuple>
+ [[nodiscard]] T* new_from_tuple(Tuple&& args)
+ {
+ return Impl::new_from_tuple<T>(std::forward<Tuple>(args), std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{});
+ }
}
#endif // Tuples_h__