Aria 2.0.0
C++23 MVVM framework (C++20 minimum) — reactive, coroutine-first, ABI-layered
Loading...
Searching...
No Matches
aria::ObservableList< T > Class Template Reference

Observable sequence of owning element handles. More...

#include <observable_list.hpp>

Inheritance diagram for aria::ObservableList< T >:
[legend]

Classes

class  SnapshotRange
struct  AddressIdentity

Public Types

using value_type = T
using Signal = detail::ListSignal<T>

Public Member Functions

 ObservableList ()=default
 ObservableList (const ObservableList &)=delete
ObservableListoperator= (const ObservableList &)=delete
 ObservableList (ObservableList &&)=delete
ObservableListoperator= (ObservableList &&)=delete
std::size_t size () const
bool empty () const
std::shared_ptr< T > at (std::size_t index) const
std::vector< std::shared_ptr< T > > snapshot () const
SnapshotRange items () const
 Return a thread-safe, std::ranges-compatible snapshot range over the element handles.
void push_back (std::shared_ptr< T > item)
template<typename... Args>
std::shared_ptr< T > emplace_back (Args &&... args)
void insert (std::size_t index, std::shared_ptr< T > item)
template<typename InputIt>
void insert_range (std::size_t index, InputIt first, InputIt last)
 One O(n + k) insertion and k owning Insert events, in forward order.
void remove_at (std::size_t index)
void remove_range (std::size_t index, std::size_t count)
 Removes in forward event order, each at the same replay pivot.
template<std::predicate< const T & > Pred>
bool remove_first (Pred &&predicate)
template<std::predicate< const T & > Pred>
std::size_t remove_all (Pred &&predicate)
void replace_at (std::size_t index, std::shared_ptr< T > item)
void move (std::size_t from, std::size_t to)
void clear ()
template<typename KeyFn = AddressIdentity>
std::size_t reconcile (std::vector< std::shared_ptr< T > > next, KeyFn key_of={})
 Reconcile by unique key.
std::size_t index_of (const T *item) const
bool contains (const T *item) const

Detailed Description

template<typename T>
class aria::ObservableList< T >

Observable sequence of owning element handles.

Readers take a shared lock; writers serialize mutation and event publication with a separate recursive lock. Callbacks execute without the structural lock. Event payloads own the affected objects and are replayed in order even when the source has already committed the final state of a batch (see ListChange).

Reentrant writes commit immediately, then notify after the current complete event/batch fan-out. Shared backing state keeps an in-flight operation safe if an observer destroys the ObservableList itself.

Repeated handles are separate sequence occurrences. index_of returns the last occurrence; one item subscription emits ItemChanged for each current occurrence. Unique-item lookup and append are amortized O(1); middle edits shift a contiguous vector. Range edits shift/compact once, in O(n + k).

Member Typedef Documentation

◆ value_type

template<typename T>
using aria::ObservableList< T >::value_type = T

◆ Signal

template<typename T>
using aria::ObservableList< T >::Signal = detail::ListSignal<T>

Constructor & Destructor Documentation

◆ ObservableList() [1/3]

template<typename T>
aria::ObservableList< T >::ObservableList ( )
default

◆ ObservableList() [2/3]

template<typename T>
aria::ObservableList< T >::ObservableList ( const ObservableList< T > & )
delete

◆ ObservableList() [3/3]

template<typename T>
aria::ObservableList< T >::ObservableList ( ObservableList< T > && )
delete

Member Function Documentation

◆ operator=() [1/2]

template<typename T>
ObservableList & aria::ObservableList< T >::operator= ( const ObservableList< T > & )
delete

◆ operator=() [2/2]

template<typename T>
ObservableList & aria::ObservableList< T >::operator= ( ObservableList< T > && )
delete

◆ size()

template<typename T>
std::size_t aria::ObservableList< T >::size ( ) const
inlinenodiscard

◆ empty()

template<typename T>
bool aria::ObservableList< T >::empty ( ) const
inlinenodiscard

◆ at()

template<typename T>
std::shared_ptr< T > aria::ObservableList< T >::at ( std::size_t index) const
inlinenodiscard

◆ snapshot()

template<typename T>
std::vector< std::shared_ptr< T > > aria::ObservableList< T >::snapshot ( ) const
inlinenodiscard

◆ items()

template<typename T>
SnapshotRange aria::ObservableList< T >::items ( ) const
inlinenodiscard

Return a thread-safe, std::ranges-compatible snapshot range over the element handles.

See SnapshotRange for semantics.

◆ push_back()

template<typename T>
void aria::ObservableList< T >::push_back ( std::shared_ptr< T > item)
inline

◆ emplace_back()

template<typename T>
template<typename... Args>
std::shared_ptr< T > aria::ObservableList< T >::emplace_back ( Args &&... args)
inline

◆ insert()

template<typename T>
void aria::ObservableList< T >::insert ( std::size_t index,
std::shared_ptr< T > item )
inline

◆ insert_range()

template<typename T>
template<typename InputIt>
void aria::ObservableList< T >::insert_range ( std::size_t index,
InputIt first,
InputIt last )
inline

One O(n + k) insertion and k owning Insert events, in forward order.

◆ remove_at()

template<typename T>
void aria::ObservableList< T >::remove_at ( std::size_t index)
inline

◆ remove_range()

template<typename T>
void aria::ObservableList< T >::remove_range ( std::size_t index,
std::size_t count )
inline

Removes in forward event order, each at the same replay pivot.

◆ remove_first()

template<typename T>
template<std::predicate< const T & > Pred>
bool aria::ObservableList< T >::remove_first ( Pred && predicate)
inline

◆ remove_all()

template<typename T>
template<std::predicate< const T & > Pred>
std::size_t aria::ObservableList< T >::remove_all ( Pred && predicate)
inline

◆ replace_at()

template<typename T>
void aria::ObservableList< T >::replace_at ( std::size_t index,
std::shared_ptr< T > item )
inline

◆ move()

template<typename T>
void aria::ObservableList< T >::move ( std::size_t from,
std::size_t to )
inline

◆ clear()

template<typename T>
void aria::ObservableList< T >::clear ( )
inline

◆ reconcile()

template<typename T>
template<typename KeyFn = AddressIdentity>
std::size_t aria::ObservableList< T >::reconcile ( std::vector< std::shared_ptr< T > > next,
KeyFn key_of = {} )
inline

Reconcile by unique key.

Null targets are ignored. Duplicate target keys use a Reset/rebuild. No-op and append are expected O(n); arbitrary vector reordering is O(n²). The entire edit stream is published as one batch, so a subscriber cannot invalidate the remaining diff midway.

◆ index_of()

template<typename T>
std::size_t aria::ObservableList< T >::index_of ( const T * item) const
inlinenodiscard

◆ contains()

template<typename T>
bool aria::ObservableList< T >::contains ( const T * item) const
inlinenodiscard

The documentation for this class was generated from the following file: