31#ifndef ETL_CONCEPTS_INCLUDED
32#define ETL_CONCEPTS_INCLUDED
39#if ETL_NOT_USING_CPP20 && !defined(ETL_IN_UNIT_TEST)
40 #error NOT SUPPORTED FOR BELOW C++20
54 using std::assignable_from;
55 using std::common_reference_with;
56 using std::common_with;
57 using std::convertible_to;
58 using std::derived_from;
59 using std::floating_point;
62 using std::signed_integral;
63 using std::unsigned_integral;
67 namespace private_concepts
69 template <
typename T,
typename U>
70 concept same_as_helper = etl::is_same_v<T, U>;
74 template <
typename T,
typename U>
75 concept same_as = private_concepts::same_as_helper<T, U> && private_concepts::same_as_helper<U, T>;
78 template <
typename Derived,
typename Base>
79 concept derived_from = etl::is_base_of_v<Base, Derived> && etl::is_convertible_v<const volatile Derived*, const volatile Base*>;
82 template <
typename From,
typename To>
83 concept convertible_to = etl::is_convertible_v<From, To> &&
requires {
static_cast<To
>(etl::declval<From>()); };
86 template <
class T,
typename U >
87 concept common_reference_with = etl::same_as<etl::common_reference_t<T, U>, etl::common_reference_t<U, T> >
88 && etl::convertible_to<T, etl::common_reference_t<T, U> > && etl::convertible_to<U, etl::common_reference_t<T, U> >;
91 template <
typename T,
typename U>
92 concept common_with = etl::same_as<etl::common_type_t<T, U>, etl::common_type_t<U, T> > &&
requires {
93 static_cast<etl::common_type_t<T, U>
>(etl::declval<T>());
94 static_cast<etl::common_type_t<T, U>
>(etl::declval<U>());
95 } && etl::common_reference_with< etl::add_lvalue_reference_t<const T>, etl::add_lvalue_reference_t<const U> > && etl::common_reference_with< etl::add_lvalue_reference_t<etl::common_type_t<T, U> >, etl::common_reference_t< etl::add_lvalue_reference_t<const T>, etl::add_lvalue_reference_t<const U> > >;
99 concept integral = etl::is_integral_v<T>;
102 template <
typename T>
103 concept signed_integral = etl::integral<T> && etl::is_signed_v<T>;
106 template <
typename T>
107 concept unsigned_integral = etl::integral<T> && !etl::signed_integral<T>;
110 template <
typename T>
111 concept floating_point = etl::is_floating_point_v<T>;
114 template <
typename LHS,
typename RHS>
115 concept assignable_from =
116 etl::is_lvalue_reference_v<LHS> && etl::common_reference_with< const etl::remove_reference_t<LHS>&,
const etl::remove_reference_t<RHS>&>
117 &&
requires(LHS lhs, RHS&& rhs) {
118 { lhs = etl::forward<RHS>(rhs) } -> etl::same_as<LHS>;
bitset_ext
Definition absolute.h:40