Non-propagating cache (C++20)
requires std::is_object_v <T>
(exposition only*)
Some range adaptors such as ranges::join_view and ranges::lazy_split_view conditionally store value (e.g. an iterator) which is specified in terms of an exposition-only class template non-propagating-cache
.
The wrapper behaves exactly like std::optional <T>, except that:
- it does not copy the value of the source when it is copy constructed or assigned to,
- it resets the value of the source when it is moved-from,
- it resets its value when it is assigned from, and
- it additionally provides a member function template to enable an input view to temporarily cache values as it is iterated over.
The wrapper encapsulates a cache containing a value. Clearing cache is an operation equivalent to resetting a contained value. Such operation is performed when copying or moving a wrapper.
Contents
[edit] Template parameters
[edit] Member functions
Copy and move constructors
( const /*non-propagating-cache*/& ) noexcept {}
( /*non-propagating-cache*/&& other ) noexcept { other.reset(); }
Copy and move assignment operators
operator=( const /*non-propagating-cache*/& other ) noexcept
{
if (std::addressof (other) != this)
reset();
return *this;
operator=( /*non-propagating-cache*/&& other ) noexcept
{
reset();
other.reset();
return *this;
non-propagating-cache<T>::emplace-deref
constexpr T& /*emplace-deref*/( const I& i );
(exposition only*)
Initializes the contained value by direct-initializing (but not direct-list-initializing) with *i. If *this already contains a value before the call, reset() is called.
Returns a reference to the new contained value.
The program is ill-formed unless the declaration T t(*i); is well-formed for some invented variable t. If *i is a prvalue of possibly cv-qualified T
, then it is not required to be movable.
Members identical to std::optional
Member functions
Observers
Modifiers
[edit] Notes
non-propagating-cache
is used in implementations to cache the result of begin() to provide an amortized constant time complexity of the method.
[edit] See also
view
consisting of the sequence obtained from flattening a view
of range
s (class template) (range adaptor object)[edit]
view
consisting of the sequence obtained from flattening a view of ranges, with the delimiter in between elements(class template) (range adaptor object)[edit]
view
over the subranges obtained from splitting another view
using a delimiter(class template) (range adaptor object)[edit]
view
over the subranges obtained from splitting another view
using a delimiter(class template) (range adaptor object)[edit]