concepts.hpp File Reference

## Classes

struct | concepts::return_t_< typename >

## Macros

#define | concept(NAME) concept NAME CPP_CONCEPT_EQUALS_
#define | CPP_and &&
#define | CPP_and_sfinae && CPP_BOOL(CPP_true), int> = 0, std::enable_if_t<
| INTERNAL ONLY.
#define | CPP_and_sfinae_def && CPP_BOOL(CPP_true), int>, std::enable_if_t<
| INTERNAL ONLY.
#define | CPP_assert(...)
#define | CPP_assert_msg static_assert
#define | CPP_auto_fun(X) X CPP_AUTO_FUN_IMPL_
#define | CPP_AUTO_FUN_DECLTYPE_NOEXCEPT_(...)
| INTERNAL ONLY. More...
#define | CPP_AUTO_FUN_IMPL_(...) (__VA_ARGS__) CPP_AUTO_FUN_RETURNS_
| INTERNAL ONLY.
#define | CPP_AUTO_FUN_RETURNS_(...)
| INTERNAL ONLY. More...
#define | CPP_AUTO_FUN_RETURNS_CONST_0(...)
| INTERNAL ONLY. More...
#define | CPP_AUTO_FUN_RETURNS_CONST_1(...) __VA_ARGS__ CPP_AUTO_FUN_RETURNS_CONST_0
| INTERNAL ONLY.
#define | CPP_AUTO_FUN_RETURNS_CONST_2(...) CPP_PP_CAT(CPP_PP_EAT_MUTABLE_, __VA_ARGS__) CPP_AUTO_FUN_RETURNS_CONST_0
| INTERNAL ONLY.
#define | CPP_AUTO_FUN_RETURNS_return
| INTERNAL ONLY.
#define | CPP_AUTO_FUN_SELECT_RETURNS_(MAYBE_CONST, ...)
| INTERNAL ONLY. More...
#define | CPP_auto_member
#define | CPP_BOOL(...) __VA_ARGS__
#define | CPP_broken_friend_ret(...) __VA_ARGS__ CPP_PP_EXPAND
| INTERNAL ONLY.
#define | CPP_concept META_CONCEPT
#define | CPP_CONCEPT_EQUALS_(...) =
#define | CPP_CONCEPT_NAME_(DECL)
| INTERNAL ONLY. More...
#define | CPP_CONCEPT_PARAMS_(DECL) CPP_PP_EVAL(CPP_PP_SECOND, CPP_EAT_CONCEPT_(DECL))
| INTERNAL ONLY.
#define | CPP_concept_ref(NAME, ...) NAME<__VA_ARGS__>
#define | CPP_ctor(TYPE) TYPE CPP_CTOR_IMPL_1_
#define | CPP_CTOR_IMPL_1_(...) (__VA_ARGS__) CPP_PP_EXPAND
| INTERNAL ONLY.
#define | CPP_ctor_sfinae(TYPE)
| INTERNAL ONLY. More...
#define | CPP_CTOR_SFINAE_EAT_NOEXCEPT_noexcept(...)
| INTERNAL ONLY.
#define | CPP_CTOR_SFINAE_IMPL_1_(...)
| INTERNAL ONLY. More...
#define | CPP_CTOR_SFINAE_MAKE_PROBE(FIRST, ...) CPP_PP_CAT(CPP_CTOR_SFINAE_PROBE_NOEXCEPT_, FIRST)
| INTERNAL ONLY.
#define | CPP_CTOR_SFINAE_PROBE_NOEXCEPT_noexcept CPP_PP_PROBE(~)
| INTERNAL ONLY.
#define | CPP_CTOR_SFINAE_REQUIRES(...)
| INTERNAL ONLY. More...
#define | CPP_CTOR_SFINAE_REQUIRES_0(...)
| INTERNAL ONLY. More...
#define | CPP_CTOR_SFINAE_REQUIRES_1(...)
| INTERNAL ONLY. More...
#define | CPP_CTOR_SFINAE_SHOW_NOEXCEPT_noexcept(...)
| INTERNAL ONLY. More...
#define | CPP_CXX_CONCEPTS 201800L
#define | CPP_CXX_VA_OPT 0
#define | CPP_EAT_CONCEPT_(DECL) CPP_PP_CAT(CPP_EAT_CONCEPT_, DECL)
| INTERNAL ONLY.
#define | CPP_EAT_CONCEPT_concept
| INTERNAL ONLY.
#define | CPP_fun(X) X CPP_FUN_IMPL_1_
#define | CPP_FUN_IMPL_1_(...)
| INTERNAL ONLY. More...
#define | CPP_member
#define | CPP_member_sfinae CPP_broken_friend_member
| INTERNAL ONLY.
#define | CPP_NOT(...) (!(__VA_ARGS__))
#define | CPP_PP_CAT(X, ...) CPP_PP_CAT_(X, __VA_ARGS__)
#define | CPP_PP_CAT_(X, ...) X ## __VA_ARGS__
#define | CPP_PP_CHECK(...) CPP_PP_EXPAND(CPP_PP_CHECK_N(__VA_ARGS__, 0,))
#define | CPP_PP_CHECK_N(x, n, ...) n
#define | CPP_PP_COMMA() ,
#define | CPP_PP_COMMA_IIF(X) CPP_PP_IIF(X)(CPP_PP_EMPTY, CPP_PP_COMMA)()
#define | CPP_PP_COUNT(...)
#define | CPP_PP_COUNT_( _01, _02, _03, _04, _05, _06, _07, _08, _09, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, N, ...) N
#define | CPP_PP_EAT(...)
#define | CPP_PP_EAT_MUTABLE_mutable
| INTERNAL ONLY.
#define | CPP_PP_EMPTY()
#define | CPP_PP_EVAL(X, ...) CPP_PP_EVAL_(X, (__VA_ARGS__))
#define | CPP_PP_EVAL2(X, ...) CPP_PP_EVAL2_(X, (__VA_ARGS__))
#define | CPP_PP_EVAL2_(X, ARGS) X ARGS
#define | CPP_PP_EVAL_(X, ARGS) X ARGS
#define | CPP_PP_EXPAND(...) __VA_ARGS__
#define | CPP_PP_FIRST(LIST) CPP_PP_FIRST_ LIST
#define | CPP_PP_FIRST_(...) __VA_ARGS__ CPP_PP_EAT
#define | CPP_PP_FOR_EACH(M, ...) CPP_PP_FOR_EACH_N(CPP_PP_COUNT(__VA_ARGS__), M, __VA_ARGS__)
#define | CPP_PP_FOR_EACH_1(M, _1) M(_1)
#define | CPP_PP_FOR_EACH_2(M, _1, _2) M(_1), M(_2)
#define | CPP_PP_FOR_EACH_3(M, _1, _2, _3) M(_1), M(_2), M(_3)
#define | CPP_PP_FOR_EACH_4(M, _1, _2, _3, _4) M(_1), M(_2), M(_3), M(_4)
#define | CPP_PP_FOR_EACH_5(M, _1, _2, _3, _4, _5) M(_1), M(_2), M(_3), M(_4), M(_5)
#define | CPP_PP_FOR_EACH_6(M, _1, _2, _3, _4, _5, _6) M(_1), M(_2), M(_3), M(_4), M(_5), M(_6)
#define | CPP_PP_FOR_EACH_7(M, _1, _2, _3, _4, _5, _6, _7) M(_1), M(_2), M(_3), M(_4), M(_5), M(_6), M(_7)
#define | CPP_PP_FOR_EACH_8(M, _1, _2, _3, _4, _5, _6, _7, _8) M(_1), M(_2), M(_3), M(_4), M(_5), M(_6), M(_7), M(_8)
#define | CPP_PP_FOR_EACH_N(N, M, ...) CPP_PP_CAT(CPP_PP_FOR_EACH_, N)(M, __VA_ARGS__)
#define | CPP_PP_IGNORE_CXX2A_COMPAT_BEGIN
#define | CPP_PP_IGNORE_CXX2A_COMPAT_END
#define | CPP_PP_IIF(BIT) CPP_PP_CAT_(CPP_PP_IIF_, BIT)
#define | CPP_PP_IIF_0(TRUE, ...) __VA_ARGS__
#define | CPP_PP_IIF_1(TRUE, ...) TRUE
#define | CPP_PP_IS_NOT_EMPTY(...)
#define | CPP_PP_IS_PAREN(x) CPP_PP_CHECK(CPP_PP_IS_PAREN_PROBE x)
#define | CPP_PP_IS_PAREN_PROBE(...) CPP_PP_PROBE(~)
#define | CPP_PP_LBRACE() {
#define | CPP_PP_LPAREN (
#define | CPP_PP_NOT(BIT) CPP_PP_CAT_(CPP_PP_NOT_, BIT)
#define | CPP_PP_NOT_0 1
#define | CPP_PP_NOT_1 0
#define | CPP_PP_PROBE(x) x, 1,
#define | CPP_PP_PROBE_CONST_MUTABLE_PROBE_const CPP_PP_PROBE_N(~, 1)
| INTERNAL ONLY.
#define | CPP_PP_PROBE_CONST_MUTABLE_PROBE_mutable CPP_PP_PROBE_N(~, 2)
| INTERNAL ONLY.
#define | CPP_PP_PROBE_EMPTY()
#define | CPP_PP_PROBE_EMPTY_PROBE_CPP_PP_PROBE_EMPTY CPP_PP_PROBE(~)
#define | CPP_PP_PROBE_N(x, n) x, n,
#define | CPP_PP_RBRACE() }
#define | CPP_PP_RPAREN )
#define | CPP_PP_SECOND(LIST) CPP_PP_SECOND_ LIST
#define | CPP_PP_SECOND_(...) CPP_PP_EXPAND
#define | CPP_requires(NAME, REQS)
#define | CPP_REQUIRES_AUX_(...) { __VA_ARGS__; }
| INTERNAL ONLY.
#define | CPP_requires_ref(NAME, ...) NAME<__VA_ARGS__>
#define | CPP_REQUIRES_requires(...) requires(__VA_ARGS__) CPP_REQUIRES_AUX_
| INTERNAL ONLY.
#define | CPP_ret(...) __VA_ARGS__ CPP_PP_EXPAND
#define | CPP_template(...) template<__VA_ARGS__> CPP_TEMPLATE_EXPAND_
#define | CPP_TEMPLATE_AUX_(...)
| INTERNAL ONLY. More...
#define | CPP_TEMPLATE_AUX_0(...) __VA_ARGS__
| INTERNAL ONLY.
#define | CPP_TEMPLATE_AUX_1(DECL, ...) CPP_concept CPP_CONCEPT_NAME_(DECL) = __VA_ARGS__
| INTERNAL ONLY.
#define | CPP_TEMPLATE_AUX_WHICH_(FIRST, ...)
| INTERNAL ONLY. More...
#define | CPP_template_def CPP_template
#define | CPP_template_def_sfinae(...) template<__VA_ARGS__ CPP_TEMPLATE_DEF_SFINAE_AUX_
| INTERNAL ONLY.
#define | CPP_TEMPLATE_DEF_SFINAE_AUX_(...)
| INTERNAL ONLY. More...
#define | CPP_TEMPLATE_EXPAND_(X, Y) X Y
#define | CPP_TEMPLATE_PROBE_CONCEPT_concept CPP_PP_PROBE(~)
| INTERNAL ONLY.
#define | CPP_template_sfinae(...)
#define | CPP_TEMPLATE_SFINAE_AUX_(...)
| INTERNAL ONLY. More...
#define | CPP_TEMPLATE_SFINAE_AUX_0(...)
| INTERNAL ONLY. More...
#define | CPP_TEMPLATE_SFINAE_AUX_1(DECL, ...)
| INTERNAL ONLY. More...
#define | CPP_TEMPLATE_SFINAE_AUX_3_requires
| INTERNAL ONLY.
#define | CPP_TEMPLATE_SFINAE_AUX_WHICH_(FIRST, ...)
| INTERNAL ONLY. More...
#define | CPP_TEMPLATE_SFINAE_PROBE_CONCEPT_concept CPP_PP_PROBE(~)
| INTERNAL ONLY.
#define | CPP_TRUE_FN CPP_true_fn(::concepts::detail::xNil{})

## Typedefs

template<bool B>
using | concepts::bool_ = std::integral_constant< bool, B >
template<typename T , typename EnableIf >
using | concepts::return_t = meta::invoke< return_t_< EnableIf >, T >

## Variables

template<typename T , typename U >
concept | concepts::aassignable_from
| \concept assignable_from More...
template<bool... Bs>
constexpr bool | concepts::and_v
template<typename T , typename U >
concept | concepts::assignable_from_ = requires( T t, U && u ) { t = (U &&) u, requires_<same_as<T, decltype(t = (U &&) u)>> ; }
| \concept assignable_from_ More...
template<typename T >
concept | concepts::detail::bboolean_testable_
| \concept boolean_testable_ More...
template<typename T >
concept | concepts::detail::bboolean_testable_impl_ = convertible_to<T, bool>
| \concept boolean_testable_impl_ More...
template<typename T >
concept | concepts::detail::boolean_testable_frag_ = requires( T && t ) { !(T&&) t, concepts::requires_<boolean_testable_impl_<decltype(!(T&&) t)>> ; }
| \concept boolean_testable_frag_ More...
template<typename T , typename U >
concept | concepts::ccommon_reference_with
| \concept common_reference_with More...
template<typename T , typename U >
concept | concepts::ccommon_with
| \concept common_with More...
template<typename T , typename... Args>
concept | concepts::cconstructible_from
| \concept constructible_from More...
template<typename From , typename To >
concept | concepts::cconvertible_to
| \concept convertible_to More...
template<typename T >
concept | concepts::ccopy_constructible
| \concept copy_constructible More...
template<typename T >
concept | concepts::ccopyable
| \concept copyable More...
template<typename T , typename U >
concept | concepts::common_reference_with_
| \concept common_reference_with_ More...
template<typename T , typename U >
concept | concepts::common_with_
| \concept common_with_ More...
template<typename T >
concept | concepts::copy_assignable_
| \concept copy_assignable_ More...
template<typename T >
concept | concepts::copy_constructible_
| \concept copy_constructible_ More...
template<typename T >
concept | concepts::ddefault_constructible
| \concept default_constructible More...
template<typename T , typename U >
concept | concepts::dderived_from
| \concept derived_from More...
template<typename T >
concept | concepts::ddestructible
| \concept destructible More...
template<typename T , typename U >
concept | concepts::derived_from_
| \concept derived_from_ More...
template<typename T >
concept | concepts::eequality_comparable
| \concept equality_comparable More...
template<typename T , typename U >
concept | concepts::eequality_comparable_with
| \concept equality_comparable_with More...
template<typename From , typename To >
concept | concepts::eexplicitly_convertible_to
| \concept explicitly_convertible_to More...
template<typename T , typename U >
concept | concepts::equality_comparable_with_
| \concept equality_comparable_with_ More...
template<typename From , typename To >
concept | concepts::explicitly_convertible_to_ = requires( From(*from)() ) { static_cast<To>(from()) ; }
| \concept explicitly_convertible_to_ More...
template<typename From , typename To >
concept | concepts::iimplicitly_convertible_to
| \concept implicitly_convertible_to More...
template<typename T >
concept | concepts::iintegral
| \concept integral More...
template<bool B>
concept | concepts::iis_true = B
| \concept is_true More...
template<typename T >
concept | concepts::mmovable
| \concept movable More...
template<typename T >
concept | concepts::mmove_constructible
| \concept move_constructible More...
template<typename T >
concept | concepts::move_assignable_
| \concept move_assignable_ More...
template<bool... Bs>
constexpr bool | concepts::or_v
template<typename T , typename U >

concept

concepts::detail::partially_ordered_with_frag_ = requires( detail::as_cref_t<T>& t, detail::as_cref_t<U>& u ) { concepts::requires_<boolean_testable_<decltype(t < u)>>, concepts::requires_<boolean_testable_<decltype(t > u)>>, concepts::requires_<boolean_testable_<decltype(t <= u)>>, concepts::requires_<boolean_testable_<decltype(t >= u)>>, concepts::requires_<boolean_testable_<decltype(u < t)>>, concepts::requires_<boolean_testable_<decltype(u > t)>>, concepts::requires_<boolean_testable_<decltype(u <= t)>>, concepts::requires_<boolean_testable_<decltype(u >= t)>> ; }

| \concept partially_ordered_with_frag_ More...
template<typename T , typename U >
concept | concepts::detail::ppartially_ordered_with_
| \concept partially_ordered_with_ More...
template<bool B>
constexpr std::enable_if_t< B, int > | concepts::requires_ = 0
template<typename T >
concept | concepts::rregular
| \concept regular More...
template<typename A , typename B >
concept | concepts::ssame_as
| \concept same_as More...
template<class T , template< typename... > class Trait, typename... Args>
concept | concepts::ssatisfies
| \concept satisfies More...
template<typename T >
concept | concepts::ssemiregular
| \concept semiregular More...
template<typename T >
concept | concepts::ssigned_integral
| \concept signed_integral More...
template<typename T >
concept | concepts::sswappable
| \concept swappable More...
template<typename T , typename U >
concept | concepts::sswappable_with
| \concept swappable_with More...
template<typename T >
concept | concepts::swappable_ = requires( T & t, T & u ) { concepts::swap(t, u) ; }
| \concept swappable_ More...
template<typename T , typename U >
concept | concepts::swappable_with_ = requires( T && t, U && u ) { concepts::swap((T &&) t, (T &&) t), concepts::swap((U &&) u, (U &&) u), concepts::swap((U &&) u, (T &&) t), concepts::swap((T &&) t, (U &&) u) ; }
| \concept swappable_with_ More...
template<typename T , typename U >
concept | concepts::totally_ordered_with_
| \concept totally_ordered_with_ More...
template<typename T >
concept | concepts::ttotally_ordered
| \concept totally_ordered More...
template<typename T , typename U >
concept | concepts::ttotally_ordered_with
| \concept totally_ordered_with More...
template<typename... Args>
concept | concepts::ttype = true
| \concept type More...
template<typename T >
concept | concepts::uunsigned_integral
| \concept unsigned_integral More...
template<typename T , typename U >
concept | concepts::detail::weakly_equality_comparable_with_frag_ = requires( detail::as_cref_t<T> t, detail::as_cref_t<U> u ) { concepts::requires_<boolean_testable_<decltype(t == u)>>, concepts::requires_<boolean_testable_<decltype(t != u)>>, concepts::requires_<boolean_testable_<decltype(u == t)>>, concepts::requires_<boolean_testable_<decltype(u != t)>> ; }
| \concept weakly_equality_comparable_with_frag_ More...
template<typename T , typename U >
concept | concepts::detail::wweakly_equality_comparable_with_
| \concept weakly_equality_comparable_with_ More...

## Macro Definition Documentation

## CPP_assert

#define CPP_assert | ( |  | ... | ) |

Value:
static_assert(static_cast<bool>(__VA_ARGS__), \
"Concept assertion failed : " #__VA_ARGS__)

## CPP_AUTO_FUN_DECLTYPE_NOEXCEPT_

#define CPP_AUTO_FUN_DECLTYPE_NOEXCEPT_ | ( |  | ... | ) |

Value:
noexcept(noexcept(decltype(__VA_ARGS__)(__VA_ARGS__))) -> \
decltype(__VA_ARGS__) \
{ return (__VA_ARGS__); }

INTERNAL ONLY.

## CPP_AUTO_FUN_RETURNS_

#define CPP_AUTO_FUN_RETURNS_ | ( |  | ... | ) |

Value:
CPP_PP_EVAL2_( \
CPP_AUTO_FUN_SELECT_RETURNS_, \
(__VA_ARGS__,) \
)(__VA_ARGS__)
CPP_AUTO_FUN_SELECT_RETURNS_
#define CPP_AUTO_FUN_SELECT_RETURNS_(MAYBE_CONST,...)
INTERNAL ONLY.
Definition: concepts.hpp:666

INTERNAL ONLY.

## CPP_AUTO_FUN_RETURNS_CONST_0

#define CPP_AUTO_FUN_RETURNS_CONST_0 | ( |  | ... | ) |

Value:
CPP_PP_EVAL(CPP_AUTO_FUN_DECLTYPE_NOEXCEPT_, \
CPP_PP_CAT(CPP_AUTO_FUN_RETURNS_, __VA_ARGS__))
CPP_AUTO_FUN_RETURNS_
#define CPP_AUTO_FUN_RETURNS_(...)
INTERNAL ONLY.
Definition: concepts.hpp:659
CPP_AUTO_FUN_DECLTYPE_NOEXCEPT_
#define CPP_AUTO_FUN_DECLTYPE_NOEXCEPT_(...)
INTERNAL ONLY.
Definition: concepts.hpp:704

INTERNAL ONLY.

## CPP_AUTO_FUN_SELECT_RETURNS_

#define CPP_AUTO_FUN_SELECT_RETURNS_ | ( |  | MAYBE_CONST,
|  |  | ...
| ) |  |

Value:
CPP_PP_CAT(CPP_AUTO_FUN_RETURNS_CONST_, \
CPP_PP_EVAL(CPP_PP_CHECK, CPP_PP_CAT( \
CPP_PP_PROBE_CONST_MUTABLE_PROBE_, MAYBE_CONST)))

INTERNAL ONLY.

## CPP_CONCEPT_NAME_

#define CPP_CONCEPT_NAME_ | ( |  | DECL | ) |

Value:
CPP_PP_EVAL( \
CPP_PP_CAT, \
CPP_PP_EVAL(CPP_PP_FIRST, CPP_EAT_CONCEPT_(DECL)), concept_)
CPP_EAT_CONCEPT_
#define CPP_EAT_CONCEPT_(DECL)
INTERNAL ONLY.
Definition: concepts.hpp:326

INTERNAL ONLY.

## CPP_ctor_sfinae

#define CPP_ctor_sfinae | ( |  | TYPE | ) |

Value:
CPP_PP_IGNORE_CXX2A_COMPAT_BEGIN \
TYPE CPP_CTOR_SFINAE_IMPL_1_
CPP_CTOR_SFINAE_IMPL_1_
#define CPP_CTOR_SFINAE_IMPL_1_(...)
INTERNAL ONLY.
Definition: concepts.hpp:365

INTERNAL ONLY.

## CPP_CTOR_SFINAE_IMPL_1_

#define CPP_CTOR_SFINAE_IMPL_1_ | ( |  | ... | ) |

Value:
(__VA_ARGS__ \
CPP_PP_COMMA_IIF( \
CPP_PP_NOT(CPP_PP_IS_NOT_EMPTY(__VA_ARGS__))) \
CPP_CTOR_SFINAE_REQUIRES

INTERNAL ONLY.

## CPP_CTOR_SFINAE_REQUIRES

#define CPP_CTOR_SFINAE_REQUIRES | ( |  | ... | ) |

Value:
CPP_PP_CAT( \
CPP_CTOR_SFINAE_REQUIRES_, \
CPP_PP_EVAL( \
CPP_PP_CHECK, \
CPP_CTOR_SFINAE_MAKE_PROBE(__VA_ARGS__,)))(__VA_ARGS__)
CPP_CTOR_SFINAE_MAKE_PROBE
#define CPP_CTOR_SFINAE_MAKE_PROBE(FIRST,...)
INTERNAL ONLY.
Definition: concepts.hpp:376

INTERNAL ONLY.

## CPP_CTOR_SFINAE_REQUIRES_0

#define CPP_CTOR_SFINAE_REQUIRES_0 | ( |  | ... | ) |

Value:
std::enable_if_t< \
CPP_PP_CAT(CPP_TEMPLATE_SFINAE_AUX_3_, __VA_ARGS__) && CPP_TRUE_FN, \
::concepts::detail::Nil \
> = {}) \
CPP_PP_IGNORE_CXX2A_COMPAT_END

INTERNAL ONLY.

## CPP_CTOR_SFINAE_REQUIRES_1

#define CPP_CTOR_SFINAE_REQUIRES_1 | ( |  | ... | ) |

Value:
std::enable_if_t< \
CPP_PP_EVAL(CPP_PP_CAT, \
CPP_TEMPLATE_SFINAE_AUX_3_, \
CPP_PP_CAT(CPP_CTOR_SFINAE_EAT_NOEXCEPT_, __VA_ARGS__)) && CPP_TRUE_FN,\
::concepts::detail::Nil \
> = {}) \
CPP_PP_EXPAND(CPP_PP_CAT(CPP_CTOR_SFINAE_SHOW_NOEXCEPT_, __VA_ARGS__)))

INTERNAL ONLY.

## CPP_CTOR_SFINAE_SHOW_NOEXCEPT_noexcept

#define CPP_CTOR_SFINAE_SHOW_NOEXCEPT_noexcept | ( |  | ... | ) |

Value:
noexcept(__VA_ARGS__) \
CPP_PP_IGNORE_CXX2A_COMPAT_END \
CPP_PP_EAT CPP_PP_LPAREN

INTERNAL ONLY.

## CPP_FUN_IMPL_1_

#define CPP_FUN_IMPL_1_ | ( |  | ... | ) |

Value:
(__VA_ARGS__) \
CPP_PP_EXPAND

INTERNAL ONLY.

## CPP_PP_COUNT

#define CPP_PP_COUNT | ( |  | ... | ) |

Value:
CPP_PP_EXPAND(CPP_PP_COUNT_(__VA_ARGS__, \
50, 49, 48, 47, 46, 45, 44, 43, 42, 41, \
40, 39, 38, 37, 36, 35, 34, 33, 32, 31, \
30, 29, 28, 27, 26, 25, 24, 23, 22, 21, \
20, 19, 18, 17, 16, 15, 14, 13, 12, 11, \
10, 9, 8, 7, 6, 5, 4, 3, 2, 1,))

## CPP_PP_IS_NOT_EMPTY

#define CPP_PP_IS_NOT_EMPTY | ( |  | ... | ) |

Value:
CPP_PP_EVAL( \
CPP_PP_CHECK, \
CPP_PP_CAT( \
CPP_PP_PROBE_EMPTY_PROBE_, \
CPP_PP_PROBE_EMPTY __VA_ARGS__ ()))

## CPP_requires

#define CPP_requires | ( |  | NAME,
|  |  | REQS
| ) |  |

Value:
concept NAME = \
CPP_PP_CAT(CPP_REQUIRES_, REQS)

## CPP_TEMPLATE_AUX_

#define CPP_TEMPLATE_AUX_ | ( |  | ... | ) |

Value:
> CPP_PP_CAT( \
CPP_TEMPLATE_AUX_, \
CPP_TEMPLATE_AUX_WHICH_(__VA_ARGS__,))(__VA_ARGS__)
CPP_TEMPLATE_AUX_WHICH_
#define CPP_TEMPLATE_AUX_WHICH_(FIRST,...)
INTERNAL ONLY.
Definition: concepts.hpp:232
CPP_TEMPLATE_AUX_
#define CPP_TEMPLATE_AUX_(...)
INTERNAL ONLY.
Definition: concepts.hpp:226

INTERNAL ONLY.

## CPP_TEMPLATE_AUX_WHICH_

#define CPP_TEMPLATE_AUX_WHICH_ | ( |  | FIRST,
|  |  | ...
| ) |  |

Value:
CPP_PP_EVAL( \
CPP_PP_CHECK, \
CPP_PP_CAT(CPP_TEMPLATE_PROBE_CONCEPT_, FIRST))

INTERNAL ONLY.

## CPP_TEMPLATE_DEF_SFINAE_AUX_

#define CPP_TEMPLATE_DEF_SFINAE_AUX_ | ( |  | ... | ) |

Value:
, \
bool CPP_true, \
std::enable_if_t< \
CPP_PP_CAT(CPP_TEMPLATE_SFINAE_AUX_3_, __VA_ARGS__) && \
CPP_BOOL(CPP_true), \
int>>

INTERNAL ONLY.

## CPP_template_sfinae

#define CPP_template_sfinae | ( |  | ... | ) |

Value:
CPP_PP_IGNORE_CXX2A_COMPAT_BEGIN \
template<__VA_ARGS__ CPP_TEMPLATE_SFINAE_AUX_
CPP_TEMPLATE_SFINAE_AUX_
#define CPP_TEMPLATE_SFINAE_AUX_(...)
INTERNAL ONLY.
Definition: concepts.hpp:289

## CPP_TEMPLATE_SFINAE_AUX_

#define CPP_TEMPLATE_SFINAE_AUX_ | ( |  | ... | ) |

Value:
CPP_PP_CAT( \
CPP_TEMPLATE_SFINAE_AUX_, \
CPP_TEMPLATE_SFINAE_AUX_WHICH_(__VA_ARGS__,))(__VA_ARGS__)
CPP_TEMPLATE_SFINAE_AUX_WHICH_
#define CPP_TEMPLATE_SFINAE_AUX_WHICH_(FIRST,...)
INTERNAL ONLY.
Definition: concepts.hpp:283

INTERNAL ONLY.

## CPP_TEMPLATE_SFINAE_AUX_0

#define CPP_TEMPLATE_SFINAE_AUX_0 | ( |  | ... | ) |

Value:
, \
bool CPP_true = true, \
std::enable_if_t< \
CPP_PP_CAT(CPP_TEMPLATE_SFINAE_AUX_3_, __VA_ARGS__) && \
CPP_BOOL(CPP_true), \
int> = 0> \
CPP_PP_IGNORE_CXX2A_COMPAT_END

INTERNAL ONLY.

## CPP_TEMPLATE_SFINAE_AUX_1

#define CPP_TEMPLATE_SFINAE_AUX_1 | ( |  | DECL,
|  |  | ...
| ) |  |

Value:
, \
bool CPP_true = true, \
std::enable_if_t<__VA_ARGS__ && CPP_BOOL(CPP_true), int> = 0> \
auto CPP_CONCEPT_NAME_(DECL)( \
::concepts::detail::tag<CPP_CONCEPT_PARAMS_(DECL)>*) \
-> char(&)[1]; \
auto CPP_CONCEPT_NAME_(DECL)(...) -> char(&)[2] \
CPP_PP_IGNORE_CXX2A_COMPAT_END
CPP_CONCEPT_NAME_
#define CPP_CONCEPT_NAME_(DECL)
INTERNAL ONLY.
Definition: concepts.hpp:316
CPP_CONCEPT_PARAMS_
#define CPP_CONCEPT_PARAMS_(DECL)
INTERNAL ONLY.
Definition: concepts.hpp:322

INTERNAL ONLY.

## CPP_TEMPLATE_SFINAE_AUX_WHICH_

#define CPP_TEMPLATE_SFINAE_AUX_WHICH_ | ( |  | FIRST,
|  |  | ...
| ) |  |

Value:
CPP_PP_EVAL( \
CPP_PP_CHECK, \
CPP_PP_CAT(CPP_TEMPLATE_SFINAE_PROBE_CONCEPT_, FIRST))

INTERNAL ONLY.

## Variable Documentation

## aassignable_from

template<typename T , typename U >

concept concepts::defs::aassignable_from

Initial value:
=
std::is_lvalue_reference<T>::value &&
common_reference_with<detail::as_cref_t<T>, detail::as_cref_t<U>> &&
defs::assignable_from_ < T, U >

\concept assignable_from

The `assignable_from` concept

## and_v

template<bool... Bs>

constexpr bool concepts::and_v

constexpr

Initial value:
=
std::is_same< detail::bools<Bs..., true>, detail::bools<true, Bs...> >::value

## assignable_from_

template<typename T , typename U >

concept concepts::defs::assignable_from_ = requires( T t, U && u ) { t = (U &&) u, requires_<same_as<T, decltype(t = (U &&) u)>> ; }

\concept assignable_from_

The `assignable_from_` concept

## bboolean_testable_

template<typename T >

concept concepts::detail::bboolean_testable_

Initial value:
=
boolean_testable_frag_ < T > &&
boolean_testable_impl_<T>

\concept boolean_testable_

The `boolean_testable_` concept

## bboolean_testable_impl_

template<typename T >

concept concepts::detail::bboolean_testable_impl_ = convertible_to<T, bool>

\concept boolean_testable_impl_

The `boolean_testable_impl_` concept

## boolean_testable_frag_

template<typename T >

concept concepts::detail::boolean_testable_frag_ = requires( T && t ) { !(T&&) t, concepts::requires_<boolean_testable_impl_<decltype(!(T&&) t)>> ; }

\concept boolean_testable_frag_

The `boolean_testable_frag_` concept

## ccommon_reference_with

template<typename T , typename U >

concept concepts::defs::ccommon_reference_with

Initial value:
=
concepts::common_reference_with_ < T, U >

\concept common_reference_with

The `common_reference_with` concept

## ccommon_with

template<typename T , typename U >

concept concepts::defs::ccommon_with

Initial value:
=
concepts::common_with_ < T, U >

\concept common_with

The `common_with` concept

## cconstructible_from

template<typename T , typename... Args>

concept concepts::defs::cconstructible_from

Initial value:
=
destructible<T> &&
std::is_constructible< T, Args... >::value

\concept constructible_from

The `constructible_from` concept

## cconvertible_to

template<typename From , typename To >

concept concepts::defs::cconvertible_to

Initial value:
=
implicitly_convertible_to<From, To> &&
explicitly_convertible_to<From, To>

\concept convertible_to

The `convertible_to` concept

## ccopy_constructible

template<typename T >

concept concepts::defs::ccopy_constructible

Initial value:
=
move_constructible<T> &&
concepts::copy_constructible_ < T >

\concept copy_constructible

The `copy_constructible` concept

## ccopyable

template<typename T >

concept concepts::defs::ccopyable

Initial value:
=
copy_constructible<T> &&
movable<T> &&
concepts::copy_assignable_ < T >

\concept copyable

The `copyable` concept

## common_reference_with_

template<typename T , typename U >

concept concepts::defs::common_reference_with_

Initial value:
= same_as<common_reference_t<T U>, common_reference_t<U, T>> &&
convertible_to<T, common_reference_t<T, U>> &&
convertible_to<U, common_reference_t<T, U>>
)

\concept common_reference_with_

The `common_reference_with_` concept

## common_with_

template<typename T , typename U >

concept concepts::defs::common_with_

Initial value:
= same_as<common_type_t<T U>, common_type_t<U, T>> &&
convertible_to<T, common_type_t<T, U>> &&
convertible_to<U, common_type_t<T, U>> &&
common_reference_with<
std::add_lvalue_reference_t<T const>,
std::add_lvalue_reference_t<U const>> &&
common_reference_with<
std::add_lvalue_reference_t<common_type_t<T, U>>,
common_reference_t<
std::add_lvalue_reference_t<T const>,
std::add_lvalue_reference_t<U const>>>
)

\concept common_with_

The `common_with_` concept

## copy_assignable_

template<typename T >

concept concepts::defs::copy_assignable_

Initial value:
= assignable_from<T & T const &>
)

\concept copy_assignable_

The `copy_assignable_` concept

## copy_constructible_

template<typename T >

concept concepts::defs::copy_constructible_

Initial value:
= constructible_from<T T &> &&
constructible_from<T, T const &> &&
constructible_from<T, T const> &&
convertible_to<T &, T> &&
convertible_to<T const &, T> &&
convertible_to<T const, T>)

\concept copy_constructible_

The `copy_constructible_` concept

## ddefault_constructible

template<typename T >

concept concepts::defs::ddefault_constructible

Initial value:
=
constructible_from<T>

\concept default_constructible

The `default_constructible` concept

## dderived_from

template<typename T , typename U >

concept concepts::defs::dderived_from

Initial value:
=
std::is_base_of< U, T >::value &&
concepts::derived_from_ < T, U >

\concept derived_from

The `derived_from` concept

## ddestructible

template<typename T >

concept concepts::defs::ddestructible

Initial value:
=
std::is_nothrow_destructible<T>::value

\concept destructible

The `destructible` concept

## derived_from_

template<typename T , typename U >

concept concepts::defs::derived_from_

Initial value:
= convertible_to<T const volatile * U const volatile *>
)

\concept derived_from_

The `derived_from_` concept

## eequality_comparable

template<typename T >

concept concepts::defs::eequality_comparable

Initial value:
=
detail::weakly_equality_comparable_with_<T, T>

\concept equality_comparable

The `equality_comparable` concept

## eequality_comparable_with

template<typename T , typename U >

concept concepts::defs::eequality_comparable_with

Initial value:
=
equality_comparable<T> &&
equality_comparable<U> &&
detail::weakly_equality_comparable_with_<T, U> &&
common_reference_with<detail::as_cref_t<T>, detail::as_cref_t<U>> &&
concepts::equality_comparable_with_ < T, U >

\concept equality_comparable_with

The `equality_comparable_with` concept

## eexplicitly_convertible_to

template<typename From , typename To >

concept concepts::defs::eexplicitly_convertible_to

Initial value:
=
concepts::explicitly_convertible_to_ < From, To >

\concept explicitly_convertible_to

The `explicitly_convertible_to` concept

## equality_comparable_with_

template<typename T , typename U >

concept concepts::defs::equality_comparable_with_

Initial value:
= equality_comparable<
common_reference_t<detail::as_cref_t<T> detail::as_cref_t<U>>>
)

\concept equality_comparable_with_

The `equality_comparable_with_` concept

## explicitly_convertible_to_

template<typename From , typename To >

concept concepts::defs::explicitly_convertible_to_ = requires( From(*from)() ) { static_cast<To>(from()) ; }

\concept explicitly_convertible_to_

The `explicitly_convertible_to_` concept

## iimplicitly_convertible_to

template<typename From , typename To >

concept concepts::defs::iimplicitly_convertible_to

Initial value:
=
std::is_convertible<std::add_rvalue_reference_t<From>, To>::value
To

\concept implicitly_convertible_to

The `implicitly_convertible_to` concept

## iintegral

template<typename T >

concept concepts::defs::iintegral

Initial value:
=
std::is_integral<T>::value

\concept integral

The `integral` concept

## iis_true

template<bool B>

concept concepts::defs::iis_true = B

\concept is_true

The `is_true` concept

## mmovable

template<typename T >

concept concepts::defs::mmovable

Initial value:
=
std::is_object<T>::value &&
move_constructible<T> &&
concepts::move_assignable_ < T > &&
swappable<T>

\concept movable

The `movable` concept

## mmove_constructible

template<typename T >

concept concepts::defs::mmove_constructible

Initial value:
=
constructible_from<T, T> &&
convertible_to<T, T>

\concept move_constructible

The `move_constructible` concept

## move_assignable_

template<typename T >

concept concepts::defs::move_assignable_

Initial value:
= assignable_from<T & T>
)

\concept move_assignable_

The `move_assignable_` concept

## or_v

template<bool... Bs>

constexpr bool concepts::or_v

constexpr

Initial value:
=
!std::is_same< detail::bools<Bs..., false>, detail::bools<false, Bs...> >::value

## partially_ordered_with_frag_

template<typename T , typename U >

concept concepts::detail::partially_ordered_with_frag_ = requires( detail::as_cref_t<T>& t, detail::as_cref_t<U>& u ) { concepts::requires_<boolean_testable_<decltype(t < u)>>, concepts::requires_<boolean_testable_<decltype(t > u)>>, concepts::requires_<boolean_testable_<decltype(t <= u)>>, concepts::requires_<boolean_testable_<decltype(t >= u)>>, concepts::requires_<boolean_testable_<decltype(u < t)>>, concepts::requires_<boolean_testable_<decltype(u > t)>>, concepts::requires_<boolean_testable_<decltype(u <= t)>>, concepts::requires_<boolean_testable_<decltype(u >= t)>> ; }

\concept partially_ordered_with_frag_

The `partially_ordered_with_frag_` concept

## ppartially_ordered_with_

template<typename T , typename U >

concept concepts::detail::ppartially_ordered_with_

Initial value:
=
partially_ordered_with_frag_ < T, U >

\concept partially_ordered_with_

The `partially_ordered_with_` concept

## rregular

template<typename T >

concept concepts::defs::rregular

Initial value:
=
semiregular<T> &&
equality_comparable<T>

\concept regular

The `regular` concept

## ssame_as

template<typename A , typename B >

concept concepts::defs::ssame_as

Initial value:
=
std::is_same< A, B >::value && std::is_same< B, A >::value

\concept same_as

The `same_as` concept

## ssatisfies

template<class T , template< typename... > class Trait, typename... Args>

concept concepts::defs::ssatisfies

Initial value:
=
static_cast<bool>(Trait<T, Args...>::type::value)

\concept satisfies

The `satisfies` concept

## ssemiregular

template<typename T >

concept concepts::defs::ssemiregular

Initial value:
=
copyable<T> &&
default_constructible<T>

\concept semiregular

The `semiregular` concept

## ssigned_integral

template<typename T >

concept concepts::defs::ssigned_integral

Initial value:
=
integral<T> &&
std::is_signed<T>::value

\concept signed_integral

The `signed_integral` concept

## sswappable

template<typename T >

concept concepts::defs::sswappable

Initial value:
=
defs::swappable_ < T >

\concept swappable

The `swappable` concept

## sswappable_with

template<typename T , typename U >

concept concepts::defs::sswappable_with

Initial value:
=
common_reference_with<detail::as_cref_t<T>, detail::as_cref_t<U>> &&
defs::swappable_with_ < T, U >

\concept swappable_with

The `swappable_with` concept

## swappable_

template<typename T >

concept concepts::defs::swappable_ = requires( T & t, T & u ) { concepts::swap(t, u) ; }

\concept swappable_

The `swappable_` concept

## swappable_with_

template<typename T , typename U >

concept concepts::defs::swappable_with_ = requires( T && t, U && u ) { concepts::swap((T &&) t, (T &&) t), concepts::swap((U &&) u, (U &&) u), concepts::swap((U &&) u, (T &&) t), concepts::swap((T &&) t, (U &&) u) ; }

\concept swappable_with_

The `swappable_with_` concept

## totally_ordered_with_

template<typename T , typename U >

concept concepts::defs::totally_ordered_with_

Initial value:
= totally_ordered<
common_reference_t<
detail::as_cref_t<T>
detail::as_cref_t<U>>> &&
detail::partially_ordered_with_<T, U>)

\concept totally_ordered_with_

The `totally_ordered_with_` concept

## ttotally_ordered

template<typename T >

concept concepts::defs::ttotally_ordered

Initial value:
=
equality_comparable<T> &&
detail::partially_ordered_with_<T, T>

\concept totally_ordered

The `totally_ordered` concept

## ttotally_ordered_with

template<typename T , typename U >

concept concepts::defs::ttotally_ordered_with

Initial value:
=
totally_ordered<T> &&
totally_ordered<U> &&
equality_comparable_with<T, U> &&
concepts::totally_ordered_with_ < T, U >

\concept totally_ordered_with

The `totally_ordered_with` concept

## ttype

template<typename... Args>

concept concepts::defs::ttype = true

\concept type

The `type` concept

## uunsigned_integral

template<typename T >

concept concepts::defs::uunsigned_integral

Initial value:
=
integral<T> &&
!signed_integral<T>

\concept unsigned_integral

The `unsigned_integral` concept

## weakly_equality_comparable_with_frag_

template<typename T , typename U >

concept concepts::detail::weakly_equality_comparable_with_frag_ = requires( detail::as_cref_t<T> t, detail::as_cref_t<U> u ) { concepts::requires_<boolean_testable_<decltype(t == u)>>, concepts::requires_<boolean_testable_<decltype(t != u)>>, concepts::requires_<boolean_testable_<decltype(u == t)>>, concepts::requires_<boolean_testable_<decltype(u != t)>> ; }

\concept weakly_equality_comparable_with_frag_

The `weakly_equality_comparable_with_frag_` concept

## wweakly_equality_comparable_with_

template<typename T , typename U >

concept concepts::detail::wweakly_equality_comparable_with_

Initial value:
=
weakly_equality_comparable_with_frag_ < T, U >

\concept weakly_equality_comparable_with_

The `weakly_equality_comparable_with_` concept