30 #include "Utilities/NoSuchType.hpp" 101 template <
class B1,
class... Bn>
107 template <
class... B>
149 template <
class B1,
class... Bn>
155 template <
class... B>
213 template <
typename... Ts>
220 template <
typename T,
typename U>
224 template <
typename T>
228 template <
typename T>
232 template <
typename T>
236 template <
class T,
class... Args>
240 template <
class T,
class... Args>
244 template <
class T,
class... Args>
245 constexpr
bool is_trivially_constructible_v =
249 template <
class T,
class... Args>
250 constexpr
bool is_nothrow_constructible_v =
255 constexpr
bool is_default_constructible_v =
260 constexpr
bool is_trivially_default_constructible_v =
265 constexpr
bool is_nothrow_default_constructible_v =
274 constexpr
bool is_trivially_copy_constructible_v =
279 constexpr
bool is_nothrow_copy_constructible_v =
288 constexpr
bool is_trivially_move_constructible_v =
293 constexpr
bool is_nothrow_move_constructible_v =
297 template <
class T,
class U>
301 template <
class T,
class U>
302 constexpr
bool is_trivially_assignable_v =
306 template <
class T,
class U>
307 constexpr
bool is_nothrow_assignable_v =
311 template <
class From,
class To>
320 constexpr
bool is_trivially_copy_assignable_v =
325 constexpr
bool is_nothrow_copy_assignable_v =
334 constexpr
bool is_trivially_move_assignable_v =
339 constexpr
bool is_nothrow_move_assignable_v =
343 template <
class Base,
class Derived>
397 template <
typename T,
typename =
void>
401 template <
typename T>
404 cpp17::is_copy_constructible_v<T> and
405 cpp17::is_copy_constructible_v<typename T::value_type>> {};
408 template <
typename T>
443 template <
typename T>
446 template <
typename T,
size_t N>
450 template <
typename T>
454 template <
typename T>
489 template <
size_t N,
typename T>
492 template <
size_t N,
typename T>
496 template <
size_t N,
typename T>
500 template <
size_t N,
typename T>
535 template <
template <
typename...>
class U,
typename T>
538 template <
template <
typename...>
class U,
typename... Args>
542 template <
template <
typename...>
class U,
typename... Args>
546 template <
template <
typename...>
class U,
typename... Args>
581 template <
typename T,
typename = cpp17::
void_t<>>
584 template <
typename T>
586 std::declval<T>().end())>>
590 template <
typename T>
594 template <
typename T>
630 template <
typename T,
typename = cpp17::
void_t<>>
633 template <
typename T>
635 T, cpp17::
void_t<decltype(std::declval<T>() < std::declval<T>()),
636 decltype(std::declval<T>() <= std::declval<T>()),
637 decltype(std::declval<T>() > std::declval<T>()),
638 decltype(std::declval<T>() >= std::declval<T>()),
639 decltype(std::declval<T>() == std::declval<T>()),
640 decltype(std::declval<T>() != std::declval<T>())>>
644 template <
typename T>
648 template <
typename T>
652 namespace TypeTraits_detail {
653 template <
typename T, std::
size_t N>
685 template <
typename Array>
687 decltype(TypeTraits_detail::array_size_impl(std::declval<const Array&>()));
721 template <
typename T,
typename = cpp17::
void_t<>>
724 template <
typename T>
726 T, cpp17::
void_t<decltype(std::declval<T>() == std::declval<T>())>>
730 template <
typename T>
734 template <
typename T>
769 template <
typename T,
typename U =
void>
772 template <
typename T>
774 T, cpp17::
void_t<decltype(std::declval<T>() != std::declval<T>())>>
778 template <
typename T>
782 template <
typename T>
818 template <
typename TT,
typename... TArgs>
828 template <
typename T,
typename... Args>
829 static auto test_callable(
int) noexcept
830 -> decltype(std::declval<T>()(std::declval<Args>()...),
std::true_type());
832 template <
typename,
typename...>
838 static constexpr
bool value = decltype(test_callable<TT, TArgs...>(0))::value;
843 template <
typename T,
typename... Args>
847 template <
typename T,
typename... Args>
870 #define CREATE_IS_CALLABLE(METHOD_NAME) \ 871 template <typename TT, typename... TArgs> \ 872 class is_##METHOD_NAME##_callable { \ 874 template <typename T, typename... Args> \ 875 static auto test_callable(int) noexcept \ 876 -> decltype(std::declval<T>().METHOD_NAME(std::declval<Args>()...), \ 878 template <typename, typename...> \ 879 static auto test_callable(...) noexcept -> std::false_type; \ 882 static constexpr bool value = \ 883 decltype(test_callable<TT, TArgs...>(0))::value; \ 884 using type = std::integral_constant<bool, value>; \ 886 template <typename T, typename... Args> \ 887 static constexpr const bool is_##METHOD_NAME##_callable_v = \ 888 is_##METHOD_NAME##_callable<T, Args...>::value; \ 889 template <typename T, typename... Args> \ 890 using is_##METHOD_NAME##_callable_t = \ 891 typename is_##METHOD_NAME##_callable<T, Args...>::type; 924 template <
typename T,
typename = cpp17::
void_t<>>
927 template <
typename T>
929 cpp17::
void_t<decltype(std::hash<T>{}, std::equal_to<T>{})>>
933 template <
typename T>
937 template <
typename T>
975 template <
typename T,
typename = cpp17::
void_t<>>
978 template <
typename T>
980 cpp17::
void_t<typename T::key_type, typename T::mapped_type,
981 decltype(std::declval<T&>()[std::declval<
982 const typename T::key_type&>()]),
983 Requires<tt::is_iterable_v<T>>>>
987 template <
typename T>
991 template <
typename T>
1027 template <
typename S,
typename T,
typename = cpp17::
void_t<>>
1030 template <
typename S,
typename T>
1032 S, T, cpp17::
void_t<decltype(std::declval<std::add_lvalue_reference_t<S>>()
1033 << std::declval<T>()),
1034 Requires<not std::is_same<S, T>::value>>>
1035 : std::true_type {};
1038 template <typename S, typename T>
1039 constexpr bool is_streamable_v = is_streamable<S, T>::value;
1042 template <typename S, typename T>
1043 using is_streamable_t = typename is_streamable<S, T>::type;
1078 template <typename T, typename = std::nullptr_t>
1079 struct is_string_like : std::false_type {};
1081 template <typename T>
1082 struct is_string_like<
1084 Requires<std::is_same<std::decay_t<T>, std::string>::value or
1085 std::is_same<std::decay_t<std::remove_pointer_t<std::decay_t<T>>>,
1086 char>::value>> : std::true_type {};
1089 template <typename T>
1090 constexpr bool is_string_like_v = is_string_like<T>::value;
1093 template <typename T>
1094 using is_string_like_t = typename is_string_like<T>::type;
1129 template <typename T, typename = cpp17::void_t<>, typename = std::nullptr_t>
1130 struct has_get_clone : std::false_type {};
1134 template <typename T>
1135 struct has_get_clone<
1136 T, cpp17::void_t<decltype(
1137 std::declval<std::remove_pointer_t<std::decay_t<T>>>().get_clone())>,
1138 Requires<not tt::is_a_v<std::unique_ptr, std::decay_t<T>> and
1139 not tt::is_a_v<std::shared_ptr, std::decay_t<T>>>>
1140 : std::true_type {};
1141 template <typename T>
1142 struct has_get_clone<T, cpp17::void_t<Requires<tt::is_a_v<std::unique_ptr, T>>,
1143 decltype(std::declval<T>()->get_clone())>,
1144 Requires<tt::is_a_v<std::unique_ptr, std::decay_t<T>> or
1145 tt::is_a_v<std::shared_ptr, std::decay_t<T>>>>
1149 template <
typename T>
1153 template <
typename T>
1188 template <
typename T,
typename = cpp17::
void_t<>,
typename = std::
nullptr_t>
1191 template <
typename T>
1192 struct has_clone<T, cpp17::
void_t<decltype(std::declval<T>().clone())>,
1193 Requires<not tt::is_a_v<std::unique_ptr, std::decay_t<T>> and
1194 not tt::is_a_v<std::shared_ptr, std::decay_t<T>>>>
1196 template <
typename T>
1197 struct has_clone<T, cpp17::
void_t<decltype(std::declval<T>()->clone())>,
1198 Requires<tt::is_a_v<std::unique_ptr, std::decay_t<T>> or
1199 tt::is_a_v<std::shared_ptr, std::decay_t<T>>>>
1203 template <
typename T>
1207 template <
typename T>
1241 template <
typename T,
typename = cpp17::
void_t<>>
1244 template <
typename T>
1245 struct has_size<T, cpp17::
void_t<decltype(std::declval<T>().size())>>
1249 template <
typename T>
1253 template <
typename T>
1280 template <
typename I>
1305 template <
typename T>
1327 template <
typename T>
1332 template <
typename T>
1336 template <
typename T>
1340 template <
typename T>
1344 template <
typename T>
1351 template <
typename T>
1352 using remove_reference_wrapper_t =
typename remove_reference_wrapper<T>::type;
1364 template <
typename T>
1366 using type = cpp20::remove_cvref_t<tt::remove_reference_wrapper_t<T>>;
1369 template <
typename T>
1370 using remove_cvref_wrap_t =
typename remove_cvref_wrap<T>::type;
1383 template <
typename T,
typename Enable = cpp17::
void_t<>>
1385 using type = tmpl::conditional_t<cpp17::is_fundamental_v<T>, T,
NoSuchType>;
1388 template <
typename T>
1390 using type =
typename get_fundamental_type<typename T::value_type>::type;
1393 template <
typename T>
1394 using get_fundamental_type_t =
typename get_fundamental_type<T>::type;
1403 template <
typename T,
typename = cpp17::
bool_constant<true>>
1408 template <
typename T>
1414 template <
typename T>
1415 constexpr
bool is_complex_of_fundamental_v =
1421 template <
typename T>
1423 is_complex_of_fundamental_v<T> or cpp17::is_fundamental_v<T>;
1425 namespace tt_detail {
1426 template <
typename T>
1427 struct function_info_impl;
1429 template <
typename Ret,
typename... Args>
1430 struct function_info_impl<Ret(Args...)> {
1431 using return_type = Ret;
1432 using argument_types = tmpl::list<Args...>;
1433 using class_type = void;
1436 template <
typename Ret,
typename... Args>
1437 struct function_info_impl<Ret (*)(Args...)> {
1438 using return_type = Ret;
1439 using argument_types = tmpl::list<Args...>;
1440 using class_type = void;
1443 template <
typename Ret,
typename... Args>
1444 struct function_info_impl<Ret (*
const)(Args...)> {
1445 using return_type = Ret;
1446 using argument_types = tmpl::list<Args...>;
1447 using class_type = void;
1450 template <
typename Ret,
typename... Args>
1451 struct function_info_impl<Ret (*
const volatile)(Args...)> {
1452 using return_type = Ret;
1453 using argument_types = tmpl::list<Args...>;
1454 using class_type = void;
1457 template <
typename Ret,
typename... Args>
1458 struct function_info_impl<Ret (*
volatile)(Args...)> {
1459 using return_type = Ret;
1460 using argument_types = tmpl::list<Args...>;
1461 using class_type = void;
1464 template <
typename Ret,
typename Class,
typename... Args>
1465 struct function_info_impl<Ret (Class::*)(Args...)> {
1466 using return_type = Ret;
1467 using argument_types = tmpl::list<Args...>;
1468 using class_type = Class;
1471 template <
typename Ret,
typename Class,
typename... Args>
1472 struct function_info_impl<Ret (Class::*)(Args...) const> {
1473 using return_type = Ret;
1474 using argument_types = tmpl::list<Args...>;
1475 using class_type = Class;
1478 template <
typename Ret,
typename Class,
typename... Args>
1479 struct function_info_impl<Ret (Class::*)(Args...) const volatile> {
1480 using return_type = Ret;
1481 using argument_types = tmpl::list<Args...>;
1482 using class_type = Class;
1485 template <
typename Ret,
typename Class,
typename... Args>
1486 struct function_info_impl<Ret (Class::*)(Args...) volatile> {
1487 using return_type = Ret;
1488 using argument_types = tmpl::list<Args...>;
1489 using class_type = Class;
1507 template <
typename F>
1517 template <
typename T,
size_t = 0>
constexpr bool is_iterable_v
Definition: TypeTraits.hpp:591
Check if type T has a clone() member function.
Definition: TypeTraits.hpp:1189
typename is_comparable< T >::type is_comparable_t
Definition: TypeTraits.hpp:649
Mark a return type as being "void". In C++17 void is a regular type under certain circumstances...
Definition: TypeTraits.hpp:47
typename is_std_array< T >::type is_std_array_t
Definition: TypeTraits.hpp:455
Check if type T has operator== defined.
Definition: TypeTraits.hpp:722
typename is_iterable< T >::type is_iterable_t
Definition: TypeTraits.hpp:595
Extracts the fundamental type for a container.
Definition: TypeTraits.hpp:1384
constexpr bool disjunction_v
Definition: TypeTraits.hpp:156
decltype(TypeTraits_detail::array_size_impl(std::declval< const Array & >())) array_size
Get the size of a std::array as a std::integral_constant.
Definition: TypeTraits.hpp:687
void void_t
Given a set of types, returns void
Definition: TypeTraits.hpp:214
typename has_inequivalence< T >::type has_inequivalence_t
Definition: TypeTraits.hpp:783
Check if a type T is callable, i.e. T(Args...) is evaluable.
Definition: TypeTraits.hpp:819
Negate a bool_constant.
Definition: TypeTraits.hpp:185
Check if T is copy constructible.
Definition: TypeTraits.hpp:398
C++ STL code present in C++20.
Definition: Algorithm.hpp:11
typename has_get_clone< T >::type has_get_clone_t
Definition: TypeTraits.hpp:1154
Check if type T has a size() member function.
Definition: TypeTraits.hpp:1242
constexpr bool is_std_array_v
Definition: TypeTraits.hpp:451
typename has_size< T >::type has_size_t
Definition: TypeTraits.hpp:1254
Check if type T has operator<<(S, T) defined.
Definition: StlStreamDeclarations.hpp:32
constexpr bool is_integer_v
Definition: TypeTraits.hpp:1306
Declares stream operators for STL containers.
Defines the type alias Requires.
Check if std::hash and std::equal_to are defined for type T.
Definition: TypeTraits.hpp:925
typename is_callable< T, Args... >::type is_callable_t
Definition: TypeTraits.hpp:848
A collection of useful type traits.
Definition: TensorExpression.hpp:115
typename is_std_array_of_size< N, T >::type is_std_array_of_size_t
Definition: TypeTraits.hpp:501
A logical AND on the template parameters.
Definition: TypeTraits.hpp:97
constexpr bool is_hashable_v
Definition: TypeTraits.hpp:934
constexpr bool is_comparable_v
Definition: TypeTraits.hpp:645
typename has_equivalence< T >::type has_equivalence_t
Definition: TypeTraits.hpp:735
constexpr bool is_callable_v
Definition: TypeTraits.hpp:844
Removes std::reference_wrapper, references, and cv qualifiers.
Definition: TypeTraits.hpp:1365
Used to mark "no type" or "bad state" for metaprogramming.
Definition: NoSuchType.hpp:10
constexpr bool is_complex_or_fundamental_v
Evaluates to true if type T is a std::complex of a fundamental type or if T is a fundamental type...
Definition: TypeTraits.hpp:1422
typename is_maplike< T >::type is_maplike_t
Definition: TypeTraits.hpp:992
constexpr bool is_std_array_of_size_v
Definition: TypeTraits.hpp:497
Check if type T has a begin() and end() function.
Definition: TypeTraits.hpp:582
constexpr bool is_same_v
Variable template for is_same.
Definition: TypeTraits.hpp:221
constexpr bool is_a_v
Definition: TypeTraits.hpp:543
typename has_clone< T >::type has_clone_t
Definition: TypeTraits.hpp:1208
constexpr bool has_inequivalence_v
Definition: TypeTraits.hpp:779
Check if type T is a std::array of a given size.
Definition: TypeTraits.hpp:490
constexpr bool conjunction_v
Definition: TypeTraits.hpp:108
typename is_hashable< T >::type is_hashable_t
Definition: TypeTraits.hpp:938
constexpr bool has_clone_v
Definition: TypeTraits.hpp:1204
Check if type T is a template specialization of U
Definition: TypeTraits.hpp:536
Check if type T is a std::array.
Definition: TypeTraits.hpp:444
Definition: TypeTraits.hpp:373
constexpr bool is_maplike_v
Definition: TypeTraits.hpp:988
Wraps the template metaprogramming library used (brigand)
Check if type T has a get_clone() member function.
Definition: TypeTraits.hpp:1130
typename Requires_detail::requires_impl< B >::template_error_type_failed_to_meet_requirements_on_template_parameters Requires
Express requirements on the template parameters of a function or class, replaces std::enable_if_t ...
Definition: Requires.hpp:67
Determines if a type T is a std::complex of a fundamental type, is a std::true_type if so...
Definition: TypeTraits.hpp:1404
T identity_t
Given a type T and possibly a size_t evaluates to T. Useful for turning a std::index_sequence into a ...
Definition: TypeTraits.hpp:1518
C++ STL code present in C++17.
Definition: Array.hpp:16
typename is_a< U, Args... >::type is_a_t
Definition: TypeTraits.hpp:547
Check if type T has <, <=, >, >=, ==, !=.
Definition: TypeTraits.hpp:631
Gets the underlying type if the type is a std::reference_wrapper, otherwise returns the type itself...
Definition: TypeTraits.hpp:1328
constexpr bool has_equivalence_v
Definition: TypeTraits.hpp:731
Check if type T has operator!= defined.
Definition: TypeTraits.hpp:770
A logical OR on the template parameters.
Definition: TypeTraits.hpp:145
constexpr bool has_size_v
Definition: TypeTraits.hpp:1250
Check if I is an integer type (non-bool, non-character), unlike std::is_integral. ...
Definition: TypeTraits.hpp:1281
tt_detail::function_info_impl< F > function_info
Returns a struct that contains the return type, argument types, and the class type if the F is a non-...
Definition: TypeTraits.hpp:1508
Check if type T is like a std::map or std::unordored_map.
Definition: TypeTraits.hpp:976
constexpr bool has_get_clone_v
Definition: TypeTraits.hpp:1150