17 #include <type_traits> 25 template <std::
size_t N>
38 template <std::
size_t N>
inline constexpr
choice_t<N> choice{};
57 template <
typename Type>
68 using type =
const std::remove_reference_t<T>&;
76 using const_reference_t =
typename const_reference<T>::type;
81 using type = std::conditional_t<std::is_lvalue_reference_v<T>, const_reference_t<T>,
const T>;
85 using add_const_to_value_t =
typename add_const_to_value<T>::type;
93 template <
typename Type,
typename =
void>
94 struct size_of : std::integral_constant<std::size_t, 0u> {};
97 template <
typename Type>
98 struct size_of<Type,
std::void_t<decltype(sizeof(Type))>>
99 : std::integral_constant<std::size_t, sizeof(Type)> {};
105 template <
typename Type>
113 template <
typename Type,
typename>
using unpack_as_type = Type;
120 template <auto Value,
typename>
inline constexpr
auto unpack_as_value = Value;
126 template <auto Value>
127 using integral_constant = std::integral_constant<decltype(Value), Value>;
146 static constexpr
auto size =
sizeof...(Type);
158 template <std::size_t Index,
typename First,
typename... Other>
167 template <
typename First,
typename... Other>
178 template <std::
size_t Index,
typename List>
190 template <
typename Type,
typename First,
typename... Other>
204 template <
typename Type,
typename... Other>
231 template <
typename Type,
typename List>
232 inline constexpr std::size_t type_list_index_v =
241 template <
typename... Type,
typename... Other>
262 template <
typename... Type,
typename... Other,
typename... List>
282 template <
typename... List>
293 template <
typename Type,
typename... Other>
296 using type = std::conditional_t<
297 (std::is_same_v<Type, Other> || ...),
299 type_list_cat_t<type_list<Type>,
313 template <
typename Type>
329 template <
typename... Type,
typename Other>
331 : std::disjunction<std::is_same<Type, Other>...> {};
338 template <
typename List,
typename Type>
339 inline constexpr
bool type_list_contains_v =
350 template <
typename... Type,
typename... Other>
353 using type = type_list_cat_t<
354 std::conditional_t<type_list_contains_v<
type_list<Other...>, Type>,
362 template <
typename... List>
373 template <
typename... Type,
template <
typename...>
class Op>
384 template <
typename List,
template <
typename...>
class Op>
394 template <
typename... T,
template <
typename...>
typename F>
396 using result = F<T...>;
406 template <
typename... E,
typename T>
415 template <
class First,
class... Tail>
428 static constexpr
auto size =
sizeof...(Value);
440 template <std::size_t Index,
auto Value,
auto... Other>
449 template <
auto Value,
auto... Other>
452 static constexpr
auto value = Value;
460 template <std::
size_t Index,
typename List>
461 inline constexpr
auto value_list_element_v =
470 template <
auto... Value,
auto... Other>
491 template <
auto... Value,
auto... Other,
typename... List>
511 template <
typename... List>
515 template <
typename List,
size_t ... indexes>
518 using type = std::tuple<typename value_list_element<indexes, List>::type...>;
521 template <
typename List,
size_t ... indexes>
538 template <
typename Func,
template <
typename...>
class Tuple,
typename... Args>
539 struct is_applicable<Func, Tuple<Args...>> : std::is_invocable<Func, Args...> {
548 template <
typename Func,
template <
typename...>
class Tuple,
typename... Args>
550 : std::is_invocable<Func, Args...> {};
557 template <
typename Func,
typename Args>
561 template <
typename,
typename,
typename>
571 template <
typename Ret,
typename Func,
typename... Args>
573 : std::is_invocable_r<Ret, Func, Args...> {};
582 template <
typename Ret,
typename Func,
typename Args>
583 inline constexpr
bool is_applicable_r_v =
591 template <
typename Type,
typename =
void>
595 template <
typename Type>
596 struct is_complete<Type, std::void_t<decltype(sizeof(Type))>> : std::true_type {
603 template <
typename Type>
611 template <
typename Type,
typename =
void>
616 template <
typename,
typename =
void>
619 template <
typename Type>
621 Type, std::void_t<typename std::iterator_traits<Type>::iterator_category>>
627 template <
typename Type>
629 std::enable_if_t<!std::is_same_v<
630 std::remove_const_t<std::remove_pointer_t<Type>>, void>>>
637 template <
typename Type>
645 template <
typename Type>
647 std::negation<std::is_final<Type>>> {
654 template <
typename Type>
662 template <
typename Type,
typename =
void>
666 template <
typename Type>
674 template <
typename Type>
682 template <
typename Type,
typename =
void>
687 template <
typename,
typename =
void>
690 template <
typename Type>
692 Type, std::void_t<decltype(std::tuple_size<const Type>::value)>>
695 template <
typename Type, std::size_t... Index>
696 [[nodiscard]] constexpr
bool 697 unpack_maybe_equality_comparable(std::index_sequence<Index...>) {
703 [[nodiscard]] constexpr
bool maybe_equality_comparable(
choice_t<0>) {
707 template <
typename Type>
708 [[nodiscard]] constexpr
auto maybe_equality_comparable(
choice_t<1>)
709 -> decltype(std::declval<typename Type::value_type>(),
bool{}) {
710 if constexpr (is_iterator_v<Type>) {
712 }
else if constexpr (std::is_same_v<typename Type::value_type, Type>) {
713 return maybe_equality_comparable<Type>(choice<0>);
719 template <
typename Type>
720 [[nodiscard]] constexpr std::enable_if_t<
721 is_complete_v<std::tuple_size<std::remove_const_t<Type>>>,
bool>
724 return unpack_maybe_equality_comparable<Type>(
725 std::make_index_sequence<std::tuple_size<Type>::value>{});
727 return maybe_equality_comparable<Type>(choice<1>);
734 template <
typename Type>
736 Type, std::void_t<decltype(std::declval<Type>() == std::declval<Type>())>>
737 : std::bool_constant<details::maybe_equality_comparable<Type>(choice<2>)> {
744 template <
typename Type>
745 inline constexpr
bool is_equality_comparable_v =
755 using type = std::remove_const_t<To>;
759 template <
typename To,
typename From>
struct constness_as<To, const From> {
769 template <
typename To,
typename From>
777 static_assert(std::is_member_pointer_v<Member>,
778 "Invalid pointer type to non-static member object or function");
780 template <
typename Class,
typename Ret,
typename... Args>
781 static Class *
clazz(Ret (Class::*)(Args...));
783 template <
typename Class,
typename Ret,
typename... Args>
784 static Class *clazz(Ret (Class::*)(Args...)
const);
786 template <
typename Class,
typename Type>
static Class *clazz(Type Class::*);
790 using type = std::remove_pointer_t<decltype(clazz(std::declval<Member>()))>;
797 template <
typename Member>
806 template <
typename Ret,
typename... Args>
807 static constexpr
type_list<Args...> pick_up(Ret (*)(Args...));
809 template <
typename Ret,
typename Class,
typename... Args>
810 static constexpr
type_list<Args...> pick_up(Ret (Class ::*)(Args...));
812 template <
typename Ret,
typename Class,
typename... Args>
813 static constexpr
type_list<Args...> pick_up(Ret (Class ::*)(Args...)
const);
815 template <
typename Type,
typename Class>
820 using type = type_list_element_t<Index, decltype(pick_up(Candidate))>;
828 template <std::
size_t Index, auto Cand
idate>
835 template<std::size_t N, std::size_t... Ints>
838 using type = std::index_sequence<Ints + N...>;
845 template<std::
size_t N,
typename Seq>
856 template <
typename T, T... S,
typename F>
857 constexpr
void for_sequence(std::integer_sequence<T, S...>, F &&f) {
858 using unpack_t =
int[];
859 (void)unpack_t{(
static_cast<void>(f(std::integral_constant<T, S>{})), 0)...,
870 template <
typename T,
typename =
void>
878 template <
typename T>
880 T,
std::void_t<decltype(std::from_chars(std::declval<const char *>(),
881 std::declval<const char *>(),
882 std::declval<T &>()))>>
Get first type in provided type_list<>
Definition: type_traits.h:414
Definition: type_traits.h:20
Same as std::is_invocable_r, but with tuples for arguments.
Definition: type_traits.h:562
Primary template isn't defined on purpose.
Definition: type_traits.h:286
Primary template isn't defined on purpose.
Definition: type_traits.h:432
std::remove_const_t< To > type
The type resulting from the transcription of the constness.
Definition: type_traits.h:755
Definition: testIterator.cpp:9
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.
Definition: type_traits.h:355
Extracts the n-th argument of a given function or member function.
Definition: type_traits.h:805
std::conditional_t<(std::is_same_v< Type, Other >||...), typename type_list_unique< type_list< Other... > >::type, type_list_cat_t< type_list< Type >, typename type_list_unique< type_list< Other... > >::type > > type
A type list without duplicate types.
Definition: type_traits.h:300
Definition: compressed_pair.h:255
A type-only sizeof wrapper that returns 0 where sizeof complains.
Definition: type_traits.h:94
First type
Searched type.
Definition: type_traits.h:170
Provides the member constant value to true if a given type is complete, false otherwise.
Definition: type_traits.h:592
Definition: type_traits.h:833
Identity type trait.
Definition: type_traits.h:48
Primary template isn't defined on purpose.
Definition: type_traits.h:248
Definition: type_traits.h:79
Append a type at the begining of the type_list.
Definition: type_traits.h:405
const To type
The type resulting from the transcription of the constness.
Definition: type_traits.h:761
Primary template isn't defined on purpose.
Definition: type_traits.h:477
Provides the member constant value to true if a given type is both an empty and non-final class...
Definition: type_traits.h:646
Extracts the class of a non-static member object or function.
Definition: type_traits.h:776
Default detection pattern template for std::from_chars.
Definition: type_traits.h:871
Definition: type_traits.h:688
Definition: type_traits.h:516
Provides the member constant value to true if Type::is_transparent is valid and denotes a type...
Definition: type_traits.h:663
A type trait that provides a const reference type for a given type.
Definition: type_traits.h:66
Transcribes the constness of a type to another type.
Definition: type_traits.h:753
type_list_element_t< Index, decltype(pick_up(Candidate))> type
N-th argument of the given function or member function.
Definition: type_traits.h:820
std::size_t value_type
Unsigned integer type.
Definition: type_traits.h:193
A class to use to push around lists of constant values, nothing more.
Definition: type_traits.h:424
Concatenates multiple type lists.
Definition: type_traits.h:251
Definition: type_traits.h:617
typename type_list_cat< type_list< Type..., Other... >, List... >::type type
A type list composed by the types of all the type lists.
Definition: type_traits.h:266
std::size_t value_type
Unsigned integer type.
Definition: type_traits.h:221
Primary template isn't defined on purpose.
Definition: type_traits.h:150
Primary template isn't defined on purpose.
Definition: type_traits.h:343
Utility class to disambiguate overloaded functions.
Definition: type_traits.h:26
Concatenates multiple value lists.
Definition: type_traits.h:480
typename value_list_cat< value_list< Value..., Other... >, List... >::type type
A value list composed by the values of all the value lists.
Definition: type_traits.h:495
std::size_t value_type
Unsigned integer type.
Definition: type_traits.h:210
reanme typelist
Definition: type_traits.h:393
Provides the member constant value to true if a given type is equality comparable, false otherwise.
Definition: type_traits.h:683
Provides the member constant value to true if a type list contains a given type, false otherwise...
Definition: type_traits.h:322
Alias template to facilitate the creation of named values.
Definition: type_traits.h:142
Same as std::is_invocable, but with tuples.
Definition: type_traits.h:530
Primary template isn't defined on purpose.
Definition: type_traits.h:182
Type type
Identity type.
Definition: type_traits.h:50
Utility class to disambiguate overloaded functions.
Definition: type_traits.h:32
std::remove_pointer_t< decltype(clazz(std::declval< Member >()))> type
The class of the given non-static member object or function.
Definition: type_traits.h:790
Provides the member constant value to true if a given type is an iterator, false otherwise.
Definition: type_traits.h:612