1#ifndef HALCHECK_LIB_TYPE_TRAITS_HPP
2#define HALCHECK_LIB_TYPE_TRAITS_HPP
19#ifdef HALCHECK_DOXYGEN
24#define HALCHECK_REQUIRE(...)
29#define HALCHECK_REQUIRE_(...)
31#define HALCHECK_REQUIRE(...) ::halcheck::lib::enable_if_t<(__VA_ARGS__), int> = 0
32#define HALCHECK_REQUIRE_(...) ::halcheck::lib::enable_if_t<(__VA_ARGS__), int>
35namespace halcheck {
namespace lib {
50template<
bool Cond,
typename T,
typename F>
58template<
typename... Args>
67template<
typename T,
typename... Args>
68struct conjunction<T, Args...> :
lib::conditional_t<bool(T::value), conjunction<Args...>, T> {};
75template<
typename... Args>
84template<
typename T,
typename... Args>
85struct disjunction<T, Args...> :
lib::conditional_t<bool(T::value), T, disjunction<Args...>> {};
92template<
bool Cond,
typename T =
void>
132template<
typename... Args>
148template<
typename T,
typename...>
158template<
typename T,
typename...>
166template<std::
size_t I,
typename T>
234template<
typename,
template<
typename...>
class Op,
typename... Args>
237template<
template<
typename...>
class Op,
typename... Args>
246template<
template<
typename...>
class Op,
typename... Args>
247struct is_detected : detail::is_detected_helper<void, Op, Args...> {};
250template<
typename From,
typename To>
254template<
typename T,
typename U>
258template<
typename T,
typename U>
263using tuple_like =
decltype(std::tuple_size<T>::value);
267struct is_tuple_like : lib::is_detected<lib::tuple_like, T> {};
270template<
class T,
typename... Args>
279template<
class T,
typename... Args>
294using detail::nothrow_swappable;
295using detail::swappable;
359using boolean_testable =
401template<
typename T,
typename Stream>
412template<
typename T,
typename CharT =
char,
typename Traits = std::
char_traits<CharT>>
416template<
typename T,
typename Stream>
417using parsable = lib::same<decltype(std::declval<Stream &>() >>
std::declval<T &>()), Stream &>;
427template<
typename T,
typename CharT =
char,
typename Traits = std::
char_traits<CharT>>
436template<
typename T,
template<
typename...>
class F>
439template<
typename... Args,
template<
typename...>
class F>
443template<
typename T,
template<
typename...>
class F>
typename std::add_pointer< T >::type add_pointer_t
An implementation of std::add_pointer_t.
Definition type_traits.hpp:223
typename std::add_lvalue_reference< T >::type add_lvalue_reference_t
An implementation of std::add_lvalue_reference_t.
Definition type_traits.hpp:199
typename std::remove_cv< typename std::remove_reference< T >::type >::type remove_cvref_t
An implementation of std::remove_cvref_t.
Definition type_traits.hpp:141
typename std::decay< T >::type decay_t
An implementation of std::decay_t.
Definition type_traits.hpp:101
typename std::remove_cv< T >::type remove_cv_t
An implementation of std::remove_cv_t.
Definition type_traits.hpp:109
typename std::add_rvalue_reference< T >::type add_rvalue_reference_t
An implementation of std::add_rvalue_reference_t.
Definition type_traits.hpp:207
typename std::enable_if< Cond, T >::type enable_if_t
An implementation of std::enable_if_t.
Definition type_traits.hpp:93
typename std::remove_extent< T >::type remove_extent_t
An implementation of std::remove_extent_t.
Definition type_traits.hpp:117
typename std::make_signed< T >::type make_signed_t
An implementation of std::make_signed_t.
Definition type_traits.hpp:191
typename std::tuple_element< I, T >::type tuple_element_t
Provides compile-time access the the types of the elements of a tuple.
Definition type_traits.hpp:167
typename std::remove_reference< T >::type remove_reference_t
An implementation of std::remove_reference_t.
Definition type_traits.hpp:175
typename std::make_unsigned< T >::type make_unsigned_t
An implementation of std::make_unsigned_t.
Definition type_traits.hpp:125
typename std::common_type< Args... >::type common_type_t
An implementation of std::common_type_t.
Definition type_traits.hpp:133
void void_t
An implementation of std::void_t.
Definition type_traits.hpp:43
typename std::conditional< Cond, T, F >::type conditional_t
An implementation of std::conditional_t.
Definition type_traits.hpp:51
typename std::add_const< T >::type add_const_t
An implementation of std::add_const_t.
Definition type_traits.hpp:215
typename std::remove_pointer< T >::type remove_pointer_t
An implementation of std::remove_pointer_t.
Definition type_traits.hpp:231
T type_identity_t
An implementation of std::type_identity_t.
Definition type_traits.hpp:159
typename std::remove_const< T >::type remove_const_t
An implementation of std::remove_const_t.
Definition type_traits.hpp:183
An implementation of std::conjunction.
Definition type_traits.hpp:59
An implementation of std::disjunction.
Definition type_traits.hpp:76
Determines if a type is satisfies the boolean-testable concept.
Definition type_traits.hpp:370
Determines if a type is constructible from a given set of argument types using initiailizer-list-styl...
Definition type_traits.hpp:280
Determines if a type is copy constructible and copy assignable.
Definition type_traits.hpp:355
An implementation of std::experimental::is_detected.
Definition type_traits.hpp:247
Determines if a type satisfies the EqualityComparable concept.
Definition type_traits.hpp:386
Determines if a type has a valid std::hash specialization.
Definition type_traits.hpp:398
Determines if a type is move constructible and move assignable.
Definition type_traits.hpp:336
An implementation of std::is_nothrow_swappable.
Definition type_traits.hpp:311
Determines whether a type is parsable (i.e. can be read from a std::basic_istream ).
Definition type_traits.hpp:428
Determines whether a type is printable (i.e. can be output on a std::basic_ostream ).
Definition type_traits.hpp:413
Determines if a type is a specialization of a template class.
Definition type_traits.hpp:437
An implementation of std::is_swappable.
Definition type_traits.hpp:303
An implementation of std::type_identity.
Definition type_traits.hpp:149