31#ifndef ETL_CONCEPTS_INCLUDED
32#define ETL_CONCEPTS_INCLUDED
51 using std::assignable_from;
52 using std::common_reference_with;
53 using std::common_with;
54 using std::constructible_from;
55 using std::convertible_to;
56 using std::copy_constructible;
58 using std::default_initializable;
59 using std::derived_from;
60 using std::destructible;
61 using std::equality_comparable;
62 using std::equivalence_relation;
63 using std::floating_point;
67 using std::move_constructible;
70 using std::regular_invocable;
73 using std::semiregular;
74 using std::signed_integral;
75 using std::strict_weak_order;
77 using std::swappable_with;
78 using std::totally_ordered;
79 using std::unsigned_integral;
83 namespace private_concepts
85 template <
typename T,
typename U>
86 concept same_as_helper = etl::is_same_v<T, U>;
90 template <
typename T,
typename U>
91 concept same_as = private_concepts::same_as_helper<T, U> && private_concepts::same_as_helper<U, T>;
94 template <
typename Derived,
typename Base>
95 concept derived_from = etl::is_base_of_v<Base, Derived> && etl::is_convertible_v<const volatile Derived*, const volatile Base*>;
98 template <
typename From,
typename To>
99 concept convertible_to = etl::is_convertible_v<From, To> &&
requires {
static_cast<To
>(etl::declval<From>()); };
102 template <
class T,
typename U >
103 concept common_reference_with = etl::same_as<etl::common_reference_t<T, U>, etl::common_reference_t<U, T> >
104 && etl::convertible_to<T, etl::common_reference_t<T, U> > && etl::convertible_to<U, etl::common_reference_t<T, U> >;
107 template <
typename T,
typename U>
108 concept common_with = etl::same_as<etl::common_type_t<T, U>, etl::common_type_t<U, T> > &&
requires {
109 static_cast<etl::common_type_t<T, U>
>(etl::declval<T>());
110 static_cast<etl::common_type_t<T, U>
>(etl::declval<U>());
111 } && 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> > >;
114 template <
typename T>
115 concept integral = etl::is_integral_v<T>;
118 template <
typename T>
119 concept signed_integral = etl::integral<T> && etl::is_signed_v<T>;
122 template <
typename T>
123 concept unsigned_integral = etl::integral<T> && !etl::signed_integral<T>;
126 template <
typename T>
127 concept floating_point = etl::is_floating_point_v<T>;
130 template <
typename LHS,
typename RHS>
131 concept assignable_from =
132 etl::is_lvalue_reference_v<LHS> && etl::common_reference_with< const etl::remove_reference_t<LHS>&,
const etl::remove_reference_t<RHS>&>
133 &&
requires(LHS lhs, RHS&& rhs) {
134 { lhs = etl::forward<RHS>(rhs) } -> etl::same_as<LHS>;
138 template <
typename F,
typename... Args>
139 concept invocable = etl::is_invocable_v<F, Args...>;
142 template <
typename F,
typename... Args>
143 concept regular_invocable = etl::invocable<F, Args...>;
146 template <
typename T>
147 concept destructible =
requires(T& t) {
152 template <
typename T,
typename... Args>
153 concept constructible_from = etl::destructible<T> && etl::is_constructible_v<T, Args...>;
156 template <
typename T>
157 concept default_initializable = etl::constructible_from<T> &&
requires {
163 template <
typename T>
164 concept move_constructible = etl::constructible_from<T, T> && etl::convertible_to<T, T>;
167 template <
typename T>
168 concept copy_constructible =
169 etl::move_constructible<T> && etl::constructible_from<T, T&> && etl::convertible_to<T&, T> && etl::constructible_from<T, const T&>
170 && etl::convertible_to<const T&, T> && etl::constructible_from<T, const T> && etl::convertible_to<const T, T>;
173 namespace private_concepts
175 template <
typename T>
176 concept boolean_testable = etl::convertible_to<T, bool> &&
requires(T&& t) {
177 { !etl::forward<T>(t) } -> etl::convertible_to<bool>;
182 template <
typename T>
183 concept equality_comparable =
requires(
const etl::remove_reference_t<T>& a,
const etl::remove_reference_t<T>& b) {
184 { a == b } -> private_concepts::boolean_testable;
185 { a != b } -> private_concepts::boolean_testable;
189 template <
typename T>
190 concept totally_ordered = etl::equality_comparable<T> &&
requires(
const etl::remove_reference_t<T>& a,
const etl::remove_reference_t<T>& b) {
191 { a < b } -> private_concepts::boolean_testable;
192 { a > b } -> private_concepts::boolean_testable;
193 { a <= b } -> private_concepts::boolean_testable;
194 { a >= b } -> private_concepts::boolean_testable;
198 template <
typename T>
199 concept swappable =
requires(T& a, T& b) {
etl::swap(a, b); };
202 template <
typename T,
typename U>
203 concept swappable_with = etl::common_reference_with<etl::remove_reference_t<T>&, etl::remove_reference_t<U>&> &&
requires(T&& t, U&& u) {
204 etl::swap(etl::forward<T>(t), etl::forward<T>(t));
205 etl::swap(etl::forward<U>(u), etl::forward<U>(u));
206 etl::swap(etl::forward<T>(t), etl::forward<U>(u));
207 etl::swap(etl::forward<U>(u), etl::forward<T>(t));
211 template <
typename T>
212 concept movable = etl::is_object_v<T> && etl::move_constructible<T> && etl::assignable_from<T&, T> && etl::swappable<T>;
215 template <
typename T>
216 concept copyable = etl::copy_constructible<T> && etl::movable<T> && etl::assignable_from<T&, T&> && etl::assignable_from<T&, const T&>
217 && etl::assignable_from<T&, const T>;
220 template <
typename T>
221 concept semiregular = etl::copyable<T> && etl::default_initializable<T>;
224 template <
typename T>
225 concept regular = etl::semiregular<T> && etl::equality_comparable<T>;
228 template <
typename F,
typename... Args>
229 concept predicate = etl::regular_invocable<F, Args...> && private_concepts::boolean_testable<etl::invoke_result_t<F, Args...> >;
232 template <
typename R,
typename T,
typename U>
233 concept relation = etl::predicate<R, T, T> && etl::predicate<R, U, U> && etl::predicate<R, T, U> && etl::predicate<R, U, T>;
236 template <
typename R,
typename T,
typename U>
237 concept equivalence_relation = etl::relation<R, T, U>;
240 template <
typename R,
typename T,
typename U>
241 concept strict_weak_order = etl::relation<R, T, U>;
ETL_CONSTEXPR14 void swap(etl::typed_storage_ext< T > &lhs, etl::typed_storage_ext< T > &rhs) ETL_NOEXCEPT
Swap two etl::typed_storage_ext.
Definition alignment.h:856