1#ifndef ENTT_CORE_TYPE_TRAITS_HPP
2#define ENTT_CORE_TYPE_TRAITS_HPP
9#include "../config/config.h"
18template<std::
size_t N>
32template<std::
size_t N>
43template<
typename Type>
53template<
typename Type>
60template<
typename Type,
typename =
void>
61struct size_of: std::integral_constant<std::size_t, 0u> {};
64template<
typename Type>
65struct size_of<Type, std::void_t<decltype(sizeof(Type))>>
67 : std::integral_constant<std::size_t, sizeof(Type)> {};
73template<
typename Type>
81template<
typename Type,
typename>
89template<auto Value,
typename>
103template<
id_type Value>
110template<
typename... Type>
115 static constexpr auto size =
sizeof...(Type);
119template<std::
size_t,
typename>
128template<std::size_t Index,
typename First,
typename... Other>
137template<
typename First,
typename... Other>
148template<std::
size_t Index,
typename List>
152template<
typename,
typename>
161template<
typename Type,
typename First,
typename... Other>
174template<
typename Type,
typename... Other>
187template<
typename Type>
200template<
typename Type,
typename List>
209template<
typename... Type,
typename... Other>
231template<
typename... Type,
typename... Other,
typename... List>
241template<
typename... Type>
251template<
typename... List>
260template<
typename First,
typename... Other,
typename... Type>
262 : std::conditional_t<(std::is_same_v<First, Type> || ...), type_list_unique<type_list<Other...>, Type...>, type_list_unique<type_list<Other...>, Type..., First>> {};
264template<
typename... Type>
276template<
typename List>
279 using type =
typename internal::type_list_unique<List>::type;
286template<
typename List>
295template<
typename List,
typename Type>
303template<
typename... Type,
typename Other>
305 : std::bool_constant<(std::is_same_v<Type, Other> || ...)> {};
312template<
typename List,
typename Type>
324template<
typename... Type,
typename... Other>
334template<
typename... List>
338template<
typename,
template<
typename...>
class>
346template<
typename... Type,
template<
typename...>
class Op>
358template<
typename List,
template<
typename...>
class Op>
365template<
auto... Value>
370 static constexpr auto size =
sizeof...(Value);
374template<std::
size_t,
typename>
383template<std::size_t Index,
auto Value,
auto... Other>
392template<
auto Value,
auto... Other>
397 static constexpr auto value = Value;
405template<std::
size_t Index,
typename List>
413template<std::
size_t Index,
typename List>
417template<auto,
typename>
426template<
auto Value,
auto First,
auto... Other>
439template<
auto Value,
auto... Other>
465template<auto Value,
typename List>
474template<
auto... Value,
auto... Other>
496template<
auto... Value,
auto... Other,
typename... List>
506template<
auto... Value>
516template<
typename... List>
528template<
auto Value,
auto... Other>
531 using type = std::conditional_t<
532 ((Value == Other) || ...),
548template<
typename Type>
557template<
typename List, auto Value>
565template<
auto... Value,
auto Other>
567 : std::bool_constant<((Value == Other) || ...)> {};
574template<
typename List, auto Value>
586template<
auto... Value,
auto... Other>
596template<
typename... List>
600template<
typename,
typename>
609template<
typename Func,
template<
typename...>
class Tuple,
typename... Args>
610struct is_applicable<Func, Tuple<Args...>>: std::is_invocable<Func, Args...> {};
618template<
typename Func,
template<
typename...>
class Tuple,
typename... Args>
619struct is_applicable<Func, const Tuple<Args...>>: std::is_invocable<Func, Args...> {};
626template<
typename Func,
typename Args>
630template<
typename,
typename,
typename>
640template<
typename Ret,
typename Func,
typename... Args>
641struct is_applicable_r<Ret, Func, std::tuple<Args...>>: std::is_invocable_r<Ret, Func, Args...> {};
650template<
typename Ret,
typename Func,
typename Args>
658template<
typename Type,
typename =
void>
662template<
typename Type>
663struct is_complete<Type, std::void_t<decltype(sizeof(Type))>>: std::true_type {};
669template<
typename Type>
677template<
typename Type,
typename =
void>
683template<
typename,
typename =
void>
684struct has_iterator_category: std::false_type {};
686template<
typename Type>
687struct has_iterator_category<Type, std::void_t<typename std::iterator_traits<Type>::iterator_category>>: std::true_type {};
693template<
typename Type>
694struct is_iterator<Type, std::enable_if_t<!std::is_void_v<std::remove_cv_t<std::remove_pointer_t<Type>>>>>
695 : internal::has_iterator_category<Type> {};
701template<
typename Type>
709template<
typename Type>
711 : std::bool_constant<std::is_empty_v<Type> && !std::is_final_v<Type>> {};
717template<
typename Type>
725template<
typename Type,
typename =
void>
729template<
typename Type>
730struct is_transparent<Type, std::void_t<typename Type::is_transparent>>: std::true_type {};
736template<
typename Type>
742template<
typename,
typename =
void>
743struct has_tuple_size_value: std::false_type {};
745template<
typename Type>
746struct has_tuple_size_value<Type, std::void_t<decltype(std::tuple_size<const Type>::value)>>: std::true_type {};
748template<
typename,
typename =
void>
749struct has_value_type: std::false_type {};
751template<
typename Type>
752struct has_value_type<Type, std::void_t<typename Type::value_type>>: std::true_type {};
755[[nodiscard]]
constexpr bool dispatch_is_equality_comparable();
757template<
typename Type, std::size_t... Index>
758[[nodiscard]]
constexpr bool unpack_maybe_equality_comparable(std::index_sequence<Index...>) {
759 return (dispatch_is_equality_comparable<std::tuple_element_t<Index, Type>>() && ...);
763[[nodiscard]]
constexpr bool maybe_equality_comparable(
char) {
767template<
typename Type>
768[[nodiscard]]
constexpr auto maybe_equality_comparable(
int) ->
decltype(std::declval<Type>() == std::declval<Type>()) {
772template<
typename Type>
773[[nodiscard]]
constexpr bool dispatch_is_equality_comparable() {
775 if constexpr(std::is_array_v<Type>) {
778 if constexpr(has_tuple_size_value<Type>::value) {
779 return maybe_equality_comparable<Type>(0) && unpack_maybe_equality_comparable<Type>(std::make_index_sequence<std::tuple_size<Type>::value>{});
781 return maybe_equality_comparable<Type>(0);
783 }
else if constexpr(has_value_type<Type>::value) {
784 if constexpr(
is_iterator_v<Type> || std::is_same_v<typename Type::value_type, Type> || dispatch_is_equality_comparable<typename Type::value_type>()) {
785 return maybe_equality_comparable<Type>(0);
790 return maybe_equality_comparable<Type>(0);
803template<
typename Type>
807template<
typename Type>
814template<
typename Type>
822template<
typename To,
typename From>
825 using type = std::remove_const_t<To>;
829template<
typename To,
typename From>
840template<
typename To,
typename From>
847template<
typename Member>
849 static_assert(std::is_member_pointer_v<Member>,
"Invalid pointer type to non-static member object or function");
851 template<
typename Class,
typename Ret,
typename... Args>
852 static Class *clazz(Ret (Class::*)(Args...));
854 template<
typename Class,
typename Ret,
typename... Args>
855 static Class *clazz(Ret (Class::*)(Args...)
const);
857 template<
typename Class,
typename Type>
858 static Class *clazz(Type Class::*);
862 using type = std::remove_pointer_t<decltype(clazz(std::declval<Member>()))>;
869template<
typename Member>
877template<std::
size_t Index,
typename Cand
idate>
879 template<
typename Ret,
typename... Args>
880 static constexpr type_list<Args...> pick_up(Ret (*)(Args...));
882 template<
typename Ret,
typename Class,
typename... Args>
883 static constexpr type_list<Args...> pick_up(Ret (Class ::*)(Args...));
885 template<
typename Ret,
typename Class,
typename... Args>
886 static constexpr type_list<Args...> pick_up(Ret (Class ::*)(Args...)
const);
888 template<
typename Type,
typename Class>
891 template<
typename Type>
892 static constexpr decltype(pick_up(&Type::operator())) pick_up(Type &&);
904template<std::
size_t Index,
typename Cand
idate>
909template<
typename... Type>
910struct std::tuple_size<
entt::type_list<Type...>>: std::integral_constant<std::size_t, entt::type_list<Type...>::size> {};
912template<std::size_t Index,
typename... Type>
915template<
auto... Value>
916struct std::tuple_size<
entt::value_list<Value...>>: std::integral_constant<std::size_t, entt::value_list<Value...>::size> {};
918template<std::size_t Index,
auto... Value>
Extracts the class of a non-static member object or function.
std::remove_pointer_t< decltype(clazz(std::declval< Member >()))> type
The class of the given non-static member object or function.
Extracts the n-th argument of a callable type.
type_list_element_t< Index, decltype(pick_up(std::declval< Candidate >()))> type
N-th argument of the callable type.
typename member_class< Member >::type member_class_t
Helper type.
constexpr bool is_equality_comparable_v
Helper variable template.
constexpr choice_t< N > choice
Variable template for the choice trick.
std::integral_constant< decltype(Value), Value > integral_constant
Wraps a static constant.
typename constness_as< To, From >::type constness_as_t
Alias template to facilitate the transcription of the constness.
constexpr std::size_t size_of_v
Helper variable template.
typename nth_argument< Index, Candidate >::type nth_argument_t
Helper type.
typename type_list_cat< List... >::type type_list_cat_t
Helper type.
typename type_list_transform< List, Op >::type type_list_transform_t
Helper type.
typename value_list_unique< Type >::type value_list_unique_t
Helper type.
constexpr std::size_t type_list_index_v
Helper variable template.
constexpr bool is_iterator_v
Helper variable template.
typename value_list_cat< List... >::type value_list_cat_t
Helper type.
constexpr auto value_list_element_v
Helper type.
typename type_list_diff< List... >::type type_list_diff_t
Helper type.
constexpr bool is_applicable_v
Helper variable template.
constexpr bool is_transparent_v
Helper variable template.
typename type_identity< Type >::type type_identity_t
Helper type.
constexpr bool is_complete_v
Helper variable template.
constexpr bool type_list_contains_v
Helper variable template.
typename type_list_element< Index, List >::type type_list_element_t
Helper type.
constexpr std::size_t value_list_index_v
Helper variable template.
typename type_list_unique< List >::type type_list_unique_t
Helper type.
constexpr type_list< Type..., Other... > operator+(type_list< Type... >, type_list< Other... >)
Concatenates multiple type lists.
typename value_list_element< Index, List >::type value_list_element_t
Helper type.
constexpr bool value_list_contains_v
Helper variable template.
typename value_list_diff< List... >::type value_list_diff_t
Helper type.
Type unpack_as_type
Using declaration to be used to repeat the same type a number of times equal to the size of a given p...
integral_constant< Value > tag
Alias template to facilitate the creation of named values.
constexpr bool is_applicable_r_v
Helper variable template.
constexpr auto unpack_as_value
Helper variable template to be used to repeat the same value a number of times equal to the size of a...
constexpr bool is_ebco_eligible_v
Helper variable template.
Utility class to disambiguate overloaded functions.
const To type
The type resulting from the transcription of the constness.
Transcribes the constness of a type to another type.
std::remove_const_t< To > type
The type resulting from the transcription of the constness.
Same as std::is_invocable_r, but with tuples for arguments.
Same as std::is_invocable, but with tuples.
Provides the member constant value to true if a given type is complete, false otherwise.
Provides the member constant value to true if a given type is both an empty and non-final class,...
Provides the member constant value to true if a given type is equality comparable,...
Provides the member constant value to true if a given type is an iterator, false otherwise.
Provides the member constant value to true if Type::is_transparent is valid and denotes a type,...
A type-only sizeof wrapper that returns 0 where sizeof complains.
typename type_list_cat< type_list< Type..., Other... >, List... >::type type
A type list composed by the types of all the type lists.
type_list< Type... > type
A type list composed by the types of all the type lists.
Concatenates multiple type lists.
type_list<> type
A type list composed by the types of all the type lists.
Primary template isn't defined on purpose.
Provides the member constant value to true if a type list contains a given type, false otherwise.
type_list_cat_t< std::conditional_t< type_list_contains_v< type_list< Other... >, Type >, type_list<>, type_list< Type > >... > type
A type list that is the difference between the two type lists.
Primary template isn't defined on purpose.
Primary template isn't defined on purpose.
std::size_t value_type
Unsigned integer type.
static constexpr value_type value
Compile-time position of the given type in the sublist.
static constexpr value_type value
Compile-time position of the given type in the sublist.
std::size_t value_type
Unsigned integer type.
static constexpr value_type value
Compile-time position of the given type in the sublist.
std::size_t value_type
Unsigned integer type.
Primary template isn't defined on purpose.
Removes duplicates types from a type list.
typename internal::type_list_unique< List >::type type
A type list without duplicate types.
A class to use to push around lists of types, nothing more.
static constexpr auto size
type_list type
Type list type.
typename value_list_cat< value_list< Value..., Other... >, List... >::type type
A value list composed by the values of all the value lists.
value_list< Value... > type
A value list composed by the values of all the value lists.
Concatenates multiple value lists.
value_list<> type
A value list composed by the values of all the value lists.
Primary template isn't defined on purpose.
Provides the member constant value to true if a value list contains a given value,...
value_list_cat_t< std::conditional_t< value_list_contains_v< value_list< Other... >, Value >, value_list<>, value_list< Value > >... > type
A value list that is the difference between the two value lists.
Primary template isn't defined on purpose.
decltype(Value) type
Searched type.
static constexpr auto value
Searched value.
Primary template isn't defined on purpose.
static constexpr value_type value
Compile-time position of the given value in the sublist.
std::size_t value_type
Unsigned integer type.
static constexpr value_type value
Compile-time position of the given value in the sublist.
std::size_t value_type
Unsigned integer type.
std::size_t value_type
Unsigned integer type.
static constexpr value_type value
Compile-time position of the given type in the sublist.
Primary template isn't defined on purpose.
std::conditional_t<((Value==Other)||...), typename value_list_unique< value_list< Other... > >::type, value_list_cat_t< value_list< Value >, typename value_list_unique< value_list< Other... > >::type > > type
A value list without duplicate types.
value_list<> type
A value list without duplicate types.
Primary template isn't defined on purpose.
A class to use to push around lists of constant values, nothing more.
static constexpr auto size
value_list type
Value list type.