86# include <type_traits>
97 template <
typename F,
typename T>
99 requires(
const F & f,
const T & a,
const T & b)
101 { f(a, b) } -> std::convertible_to<bool>;
124 template <
typename F,
typename T>
126 std::strict_weak_order<F, T, T>
and
127 std::strict_weak_order<const F &, const T &, const T &>;
141 template <
typename F,
typename T>
143 std::equivalence_relation<F, T, T>
and
144 std::equivalence_relation<const F &, const T &, const T &>;
162 template <
typename T,
typename Key>
164 requires {
typename T::Node; }
and
165 requires(
T & t,
T &
t2,
const T &
ct,
166 typename T::Node * p,
const Key & key)
168 { t.getRoot() } -> std::convertible_to<typename T::Node *>;
169 { t.search(key) } -> std::convertible_to<typename T::Node *>;
170 { t.search_or_insert(p) } -> std::convertible_to<typename T::Node *>;
171 { t.insert_dup(p) } -> std::convertible_to<typename T::Node *>;
172 { t.remove(key) } -> std::convertible_to<typename T::Node *>;
173 {
ct.verify() } -> std::convertible_to<bool>;
176 requires not requires {
ct.getRoot(); }
or requires {
177 {
ct.getRoot() } -> std::convertible_to<const typename T::Node *>;
179 requires (
not requires {
ct.search(key); }
or
182 {
ct.search(key) } -> std::convertible_to<const typename T::Node *>;
195 template <
typename T>
198 typename T::Item_Type;
230 template <
typename C>
232 requires {
typename C::Item_Type; }
and
233 requires(C & c,
const C &
cc,
const typename C::Item_Type & val)
235 {
cc.size() } -> std::convertible_to<std::size_t>;
236 {
cc.is_empty() } -> std::convertible_to<bool>;
242 c.mutable_for_each([](
typename C::Item_Type &) {});
266 template <
typename C>
269 requires(
const C &
cc)
289 template <
typename It>
293 static_cast<bool>(it.has_curr());
310 template <
typename C>
314 typename C::Item_Type;
315 typename C::Iterator;
318 std::constructible_from<typename C::Iterator, const C &>;
328 template <
typename C>
330 requires {
typename C::Item_Type; }
and
331 requires(C & c,
bool (&op)(
const typename C::Item_Type &))
333 { c.traverse(op) } -> std::convertible_to<bool>;
343 template <
typename C>
347 requires(
const C &
cc)
349 {
cc.size() } -> std::convertible_to<std::size_t>;
350 {
cc.is_empty() } -> std::convertible_to<bool>;
357 template <
typename C>
360 requires(C & c,
const typename C::Item_Type & v)
372 template <
typename C>
374 requires(
const C & c)
378 typename C::value_type;
386 template <
typename T>
388 std::is_integral_v<std::remove_cv_t<T>>
and
389 not std::is_same_v<std::remove_cv_t<T>,
bool>;
406 template <
typename T>
423 template <
typename F,
typename T>
425 requires(
const F & f,
const T & a,
const T & b)
427 { f(a, b) } -> std::convertible_to<T>;
440 template <
typename M,
typename T>
442 requires(
const T & a,
const T & b)
444 { M::identity() } -> std::convertible_to<T>;
445 { M::combine(a, b) } -> std::convertible_to<T>;
460 template <
typename F,
typename...
Args>
464 std::forward<F>(f)(std::forward<Args>(
args)...);
479 template <
typename F,
typename...
Args>
484 static_cast<bool>(std::forward<F>(f)(std::forward<Args>(
args)...));
487 namespace concepts_detail
494 typename N::key_type;
495 { N::NullPtr } -> std::convertible_to<N *>;
499 { p->getL() } -> std::same_as<N *&>;
500 { p->getR() } -> std::same_as<N *&>;
501 { p->get_key() } -> std::convertible_to<typename N::key_type &>;
516 template <
class Node>
528 template <
class Node>
531 requires(std::remove_cv_t<Node> * p)
533 { p->getCount() } -> std::convertible_to<std::size_t>;
536 namespace concepts_detail
550 template <
class T,
class Deferred>
565 template <
class Container,
class Deferred>
568 using type =
decltype(std::declval<typename defer<Container, Deferred>::type::Iterator &>().
get_curr());
586 template <
class R,
class... A>
606 if constexpr (std::is_void_v<R>)
607 std::invoke(f, std::forward<A>(a)...);
609 return std::invoke(f, std::forward<A>(a)...);
Concept that identifies types that can be converted or used as an Aleph Array.
A traversable, AlephIterable container with a size.
A type that yields an AlephIterator over its Item_Types.
An Aleph cursor-style iterator, as generic library code uses it.
An iterable container that grows at its back with append().
Concept for Aleph-w mutable sequential containers.
Concept for Aleph-w sequential containers that can be iterated.
A container whose items can be visited with traverse().
An element type the Aleph arrays can store.
Concept for BST tree policies used by DynSetTree.
A binary tree node usable by tpl_binNodeUtils.H.
A callable that takes two const T& and returns bool.
f(args...) is a valid call expression, exactly as written.
A binary functor closed over T.
Equivalence relation constraint for equality comparators.
Integral value accepted by linear-time integer sorting algorithms.
f(args...) is a valid call whose result is usable as a condition.
A binary tree node that also keeps subtree sizes (rank).
A static monoid: M::identity() and M::combine(a, b).
A container with STL-style begin()/end() and value_type.
Strict weak ordering constraint for BST comparators.
Unqualified form of BinNodeLike, applied to a cv-free node type.
size_t blossom_maximum_cardinality_matching(const GT &g, DynDlist< typename GT::Arc * > &matching, SA sa=SA())
Alias of compute_maximum_cardinality_general_matching().
Main namespace for Aleph-w library functions.
and
Check uniqueness with explicit hash + equality functors.
std::decay_t< typename HeadC::Item_Type > T
auto get_curr() const
Return the current tuple (bounds-checked).
T itself, made dependent on Deferred.
static R call(F &f, A... a)
Invoke f(a...) converting the result to R.
What Container::Iterator::get_curr() yields, deferred.
decltype(std::declval< typename defer< Container, Deferred >::type::Iterator & >().get_curr()) type
Filter_Iterator< DynList< int >, DynList< int >::Iterator, Par > It