diff options
author | Shauren <shauren.trinity@gmail.com> | 2020-08-20 13:34:45 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2020-08-20 13:34:45 +0200 |
commit | 7c08fc863ac45f2d41b18103b0132004a4c0c524 (patch) | |
tree | 8e32f3f3088cfb44f1f631cb3ddbf0ad5ecd72ff | |
parent | 7bfeb03c136f18fda73474054c837f4fe8f11136 (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.h | 31 | ||||
-rw-r--r-- | src/common/Utilities/advstd.h | 11 |
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 |