24 #ifndef FUB_CORE_TYPE_TRAITS_HPP
25 #define FUB_CORE_TYPE_TRAITS_HPP
27 #include <type_traits>
32 #if defined(__cpp_lib_byte) && __cpp_lib_byte >= 201603
35 using byte =
unsigned char;
44 template <
class...>
using void_t = void;
57 template <
class Default,
class AlwaysVoid,
template <
class...>
class Op,
60 using value_t = std::false_type;
64 template <
class Default,
template <
class...>
class Op,
class... Args>
65 struct detector<Default,
void_t<Op<Args...>>, Op, Args...> {
66 using value_t = std::true_type;
67 using type = Op<Args...>;
70 template <
template <
class...>
class Op,
class... Args>
72 typename detail::detector<nonesuch, void, Op, Args...>::value_t;
76 template <
template <
class...>
class Op,
class... Args>
77 using detected_t =
typename detail::detector<nonesuch, void, Op, Args...>::type;
79 template <
class Default,
template <
class...>
class Op,
class... Args>
80 using detected_or = detail::detector<Default, void, Op, Args...>;
82 template <
class Default,
template <
class...>
class Op,
class... Args>
83 using detected_or_t =
typename detected_or<Default, Op, Args...>::type;
85 template <
class Expected,
template <
typename...>
class Op,
class... Args>
86 using is_detected_exact = std::is_same<Expected,
detected_t<Op, Args...>>;
91 template <
template <
class...>
class Op,
class... Args>
96 template <
template <
class...>
class Op,
class... Args>
101 template <
class Default,
template <
class...>
class Op,
class... Args>
102 struct detected_or : detail::detected_or<Default, Op, Args...> {};
107 template <
class Expected,
template <
typename...>
class Op,
class... Args>
114 #if defined(__cpp_lib_logical_traits)
115 using std::conjunction;
116 using std::disjunction;
118 #elif defined(__cpp_lib_experimental_logical_traits)
119 using std::experimental::conjunction;
120 using std::experimental::disjunction;
125 template <
class B1,
class... Bn>
127 : std::conditional_t<bool(B1::value), conjunction<Bn...>, B1> {};
131 template <
class B1,
class... Bn>
133 : std::conditional_t<bool(B1::value), B1, disjunction<Bn...>> {};
135 template <
class Bool>
136 using negation = std::integral_constant<bool, !bool(Bool::value)>;
139 #if defined(__cpp_nontype_template_parameter_auto)
140 template <auto N>
struct constant : std::integral_constant<decltype(N), N> {};
143 #if defined(__cpp_lib_integer_sequence)
145 using std::integer_sequence;
152 static constexpr std::size_t
size() noexcept {
return sizeof...(Ints); }
155 template <std::size_t... Is>
160 template <
typename T, T N, T... Ints>
169 template <
typename T, T N>
172 template <std::
size_t N>
181 template <
bool Bool>
using bool_constant = std::integral_constant<bool, Bool>;
184 template <std::
size_t I>
195 #ifdef __cpp_lib_is_invocable
196 using std::invoke_result;
198 using std::is_invocable;
204 template <
typename F,
typename... Args>
207 template <
typename F,
typename... Args>
214 template <
typename F,
typename... Args>
224 using type = std::remove_cv_t<std::remove_reference_t<T>>;
232 using type =
typename Var::value_type;
241 template <
typename L,
typename R>
242 using equality_t = decltype(std::declval<L>() == std::declval<R>());
244 template <
typename L,
typename R>
253 template <
typename T,
typename S = T>
257 template <
typename T,
typename S,
bool IsComparable>
258 struct is_nothrow_equality_comparable_impl :
bool_constant<false> {};
260 template <
typename T,
typename S>
261 struct is_nothrow_equality_comparable_impl<T, S, true> {
262 static constexpr
bool is_nothrow_equal =
263 noexcept(std::declval<T>() == std::declval<S>());
265 static constexpr
bool is_nothrow_inequal =
266 noexcept(std::declval<T>() != std::declval<S>());
268 static constexpr
bool value = is_nothrow_equal && is_nothrow_inequal;
275 static constexpr
bool value = detail::is_nothrow_equality_comparable_impl<
284 template <
typename T>
286 :
conjunction<std::is_default_constructible<T>, std::is_copy_assignable<T>,
287 is_equality_comparable<T>> {};
291 template <
class... Ts>
struct overloaded : Ts... {
using Ts::operator()...; };
295 template <
typename X,
typename Y>
300 template <
typename Tag,
typename... Args>
302 decltype(
tag_invoke(std::declval<Tag>(), std::declval<Args>()...));
305 template <
typename Tag,
typename... Args,
306 typename = std::enable_if_t<
309 noexcept(noexcept(
tag_invoke(std::forward<Tag>(tag),
310 std::forward<Args>(args)...))) {
311 return tag_invoke(std::forward<Tag>(tag), std::forward<Args>(args)...);
316 inline namespace tag_invoke_ns {
321 template <
typename _Tag,
typename... _Args>
323 :
is_invocable<decltype(fub::meta::tag_invoke), _Tag, _Args...> {};
326 template <
bool IsComparable,
typename T,
typename... Args>
327 struct is_nothrow_tag_invocable_impl :
bool_constant<false> {};
329 template <
typename T,
typename... Args>
330 struct is_nothrow_tag_invocable_impl<true, T, Args...> {
331 static constexpr
bool value =
336 template <
typename Tag,
typename... Args>
339 is_tag_invocable<Tag, Args...>::value, Tag, Args...>::value> {};
341 template <
typename _Tag,
typename... _Args>
345 template <
typename _Tag,
typename... _Args>
350 using tag_t = std::decay_t<decltype(T)>;
detail::detected_t< Op, Args... > detected_t
Returns the type of Op<Args...> or nonesuch
Definition: type_traits.hpp:97
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
typename remove_cvref< T >::type remove_cvref_t
Definition: type_traits.hpp:226
integer_sequence< std::size_t, Is... > index_sequence
Definition: type_traits.hpp:156
std::integral_constant< bool, !bool(Bool::value)> negation
Definition: type_traits.hpp:136
invoke_result_t< decltype(fub::meta::tag_invoke), _Tag, _Args... > tag_invoke_result_t
Definition: type_traits.hpp:347
void void_t
Definition: type_traits.hpp:44
make_integer_sequence< std::size_t, N > make_index_sequence
Definition: type_traits.hpp:173
typename nodeduce< T >::type nodeduce_t
Definition: type_traits.hpp:47
std::decay_t< decltype(T)> tag_t
Definition: type_traits.hpp:350
typename invoke_result< F, Args... >::type invoke_result_t
Definition: type_traits.hpp:208
static constexpr bool_constant< B > bool_c
Definition: type_traits.hpp:187
typename value_type< Var >::type value_type_t
Definition: type_traits.hpp:234
std::integral_constant< bool, Bool > bool_constant
Definition: type_traits.hpp:181
static constexpr int_constant< I > int_c
Definition: type_traits.hpp:186
static constexpr size_constant< I > size_c
Definition: type_traits.hpp:189
std::integral_constant< std::size_t, I > size_constant
Definition: type_traits.hpp:185
typename MakeIntegerSequence_< T, N, T{0}>::type make_integer_sequence
Definition: type_traits.hpp:170
unsigned char byte
Definition: type_traits.hpp:35
static constexpr index_constant< I > index_c
Definition: type_traits.hpp:188
std::integral_constant< index, I > index_constant
Definition: type_traits.hpp:182
std::is_same< std::decay_t< X >, Y > decays_to
Definition: type_traits.hpp:296
overloaded(Ts...) -> overloaded< Ts... >
std::integral_constant< int, I > int_constant
Definition: type_traits.hpp:183
std::ptrdiff_t index
Definition: type_traits.hpp:179
Definition: type_traits.hpp:165
typename MakeIntegerSequence_< T, N, L+1, Ints..., L >::type type
Definition: type_traits.hpp:166
Definition: type_traits.hpp:124
Definition: type_traits.hpp:123
Returns the type of Op<Args...> or Default
Definition: type_traits.hpp:102
Definition: type_traits.hpp:130
Definition: type_traits.hpp:129
Definition: type_traits.hpp:149
T value_type
Definition: type_traits.hpp:150
static constexpr std::size_t size() noexcept
Definition: type_traits.hpp:152
This is std::true_type if F is a function type and can be invoked with arguments of types Args....
Definition: type_traits.hpp:205
This is std::true_type if Op<Args...> is a valid SFINAE expression and the return type is exactly Exp...
Definition: type_traits.hpp:108
This is std::true_type if Op<Args...> is a valid SFINAE expression.
Definition: type_traits.hpp:92
Definition: type_traits.hpp:240
decltype(std::declval< L >() !=std::declval< R >()) inequality_t
Definition: type_traits.hpp:245
decltype(std::declval< L >()==std::declval< R >()) equality_t
Definition: type_traits.hpp:242
This is std::true_type if T and S are equality comparable.
Definition: type_traits.hpp:254
This is std::true_type if a given object f of type T is callable by fub::invoke(f,...
Definition: type_traits.hpp:215
This is std::true_type if T and S are nothrow equality comparable.
Definition: type_traits.hpp:274
static constexpr bool value
Definition: type_traits.hpp:275
Definition: type_traits.hpp:339
This type trait checks if a specified type T fulfills the Regular concept.
Definition: type_traits.hpp:287
Definition: type_traits.hpp:323
Definition: type_traits.hpp:46
T type
Definition: type_traits.hpp:46
Definition: type_traits.hpp:49
nonesuch(nonesuch const &)=delete
void operator=(nonesuch const &)=delete
Definition: type_traits.hpp:291
This is equivalent to std::remove_cv_t<std::remove_reference_t<T>>.
Definition: type_traits.hpp:223
std::remove_cv_t< std::remove_reference_t< T > > type
Definition: type_traits.hpp:224
Definition: type_traits.hpp:231
typename Var::value_type type
Definition: type_traits.hpp:232