aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-08-20 13:34:45 +0200
committerShauren <shauren.trinity@gmail.com>2020-08-20 13:34:45 +0200
commit7c08fc863ac45f2d41b18103b0132004a4c0c524 (patch)
tree8e32f3f3088cfb44f1f631cb3ddbf0ad5ecd72ff
parent7bfeb03c136f18fda73474054c837f4fe8f11136 (diff)
Core/Util: Added new utilities
* Trinity::new_from_tuple - same as std::make_from_tuple except allocates object using "new" * Trinity::is_tuple - detects whether given type is a tuple specialization * advstd::type_identity - C++20 std::type_identity
-rw-r--r--src/common/Utilities/Tuples.h31
-rw-r--r--src/common/Utilities/advstd.h11
2 files changed, 42 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__
diff --git a/src/common/Utilities/advstd.h b/src/common/Utilities/advstd.h
index fc8221b7314..2552f7d12bb 100644
--- a/src/common/Utilities/advstd.h
+++ b/src/common/Utilities/advstd.h
@@ -27,6 +27,17 @@ namespace advstd
// C++20 advstd::remove_cvref_t
template <class T>
using remove_cvref_t = std::remove_cv_t<std::remove_reference_t<T>>;
+
+ // C++20 std::type_identity
+ template <typename T>
+ struct type_identity
+ {
+ using type = T;
+ };
+
+ // C++20 std::type_identity_t
+ template <typename T>
+ using type_identity_t = typename type_identity<T>::type;
}
#endif