Concept Subspace :: sus :: ops :: RangeBounds
template <class T, class I>concept RangeBounds
requires
requires(const T& t, T& v, const I& i) {
{ t.start_bound() } -> std::same_as<::sus::option::Option<const I&>>;
{ t.end_bound() } -> std::same_as<::sus::option::Option<const I&>>;
// Rvalue overloads must not exist as they would return a reference to a
// temporary.
requires !requires { ::sus::move(v).start_bound(); };
requires !requires { ::sus::move(v).end_bound(); };
{ t.contains(i) } -> std::same_as<bool>;
// These should return a RangeBounds, but we're unable to check that here as
// the type may return itself and the concept would be cyclical and thus
// become false.
{ ::sus::move(v).start_at(i) };
{ ::sus::move(v).end_at(i) };
// start_at() and end_at() are rvalue methods if T is not Copy.
requires sus::mem::Copy<T> || !requires { t.start_at(i); };
requires sus::mem::Copy<T> || !requires { t.end_at(i); };
requires sus::mem::Copy<T> || !requires { v.start_at(i); };
requires sus::mem::Copy<T> || !requires { v.end_at(i); };
// start_at() and end_at() are lvalue methods if T is Copy.
requires !sus::mem::Copy<T> || requires { t.start_at(i); };
requires !sus::mem::Copy<T> || requires { t.end_at(i); };
requires !sus::mem::Copy<T> || requires { v.start_at(i); };
requires !sus::mem::Copy<T> || requires { v.end_at(i); };
}
RangeBounds
is implemented by Subspace's range types, and produced by
range syntax like ..
, a..
, ..b
, ..=c
, d..e
, or f..=g
.