|
Aria 2.0.0
C++23 MVVM framework (C++20 minimum) — reactive, coroutine-first, ABI-layered
|
Namespaces | |
| namespace | abi |
| namespace | adapters |
| namespace | async |
| namespace | binding |
| namespace | reactive |
| namespace | runtime |
| namespace | testing |
| namespace | trace |
| namespace | validation_dsl |
Classes | |
| class | bad_inplace_function_call |
| class | BatchScope |
| RAII batch guard: { BatchScope b; ...; } or use batch([&]{...}). More... | |
| struct | CallbackFailure |
| Payload passed to a callback-failure sink. More... | |
| class | CircularDependencyError |
| Thrown when flush detects a dependency cycle. More... | |
| class | Command |
| Encapsulated user action with an optional CanExecute predicate. More... | |
| class | Command<> |
| class | Computed |
| class | DistinctList |
| class | Effect |
| struct | Error |
| One uniform error record. More... | |
| class | FilteredList |
| class | function_ref |
| class | function_ref< R(Args...)> |
| class | GraphInspector |
| Lightweight diagnostics entry point. More... | |
| struct | Group |
| One bucket in a GroupedList<T, Key>. More... | |
| class | GroupedList |
| class | IDelayedScheduler |
| Tiny interface — anything that can post a function to run after a delay. More... | |
| class | inplace_function |
| class | inplace_function< R(Args...), Capacity, Alignment > |
| class | IProperty |
| Type-erased Property surface. More... | |
| class | IScheduler |
| struct | ListChange |
| An owning event in a sequential list edit stream. More... | |
| class | Loadable |
| Standard loadable view-model. More... | |
| class | MappedList |
| class | MultiSelection |
| class | ObservableList |
| Observable sequence of owning element handles. More... | |
| class | PagedList |
| class | Property |
| class | ScopedTraceSink |
| Installs a sink for the lifetime of the scope, restoring whatever was previously installed (possibly nothing) on destruction. More... | |
| class | Selection |
| class | SortedList |
| class | Subscription |
| RAII handle to a single subscription. More... | |
| class | SubscriptionBag |
| Aggregate holder: owns multiple Subscriptions and drops them together. More... | |
| struct | TraceEvent |
| One trace event. More... | |
| class | unsupported_capability |
| Thrown when a caller invokes a capability the scheduler did not advertise (e.g. More... | |
| class | UntrackedScope |
| RAII: within the scope, every dep() behaves like a plain get(). More... | |
| struct | ValidationKey |
| (field_path, rule_id) locator for a validation message. More... | |
| struct | ValidationResult |
| struct | ValidationState |
| class | Validator |
Concepts | |
| concept | EqualityComparable |
| Type that supports == and != (required for change detection). | |
| concept | InvocableR |
| Anything that can be invoked with Args... and returns convertible-to-Ret. | |
| concept | ListSource |
| concept | ListSourceOf |
| concept | Observable |
| A read-only observable: has .get() and exposes its value_type. | |
| concept | PropertyValue |
| Type usable as a Property value: | |
| concept | ReactiveNode |
| Type that participates in the reactive graph: inherits from aria::reactive::Node. | |
| concept | ReadOnlyReactive |
| A reactive cell that can be read and observed, but not written: exactly the surface a one-way (VM→View) binding needs. | |
| concept | ReadOnlyReactiveOf |
| ReadOnlyReactive pinned to a specific value type — the constraint for the typed scalar binders (bind_text_oneway wants value_type to be exactly std::string, bind_visible wants bool, ...). | |
| concept | ReadOnlyReactiveOptional |
| A ReadOnlyReactive whose value_type is some std::optional<U> — the shape of AsyncCommand::last_result, and the constraint for BindingEngine::bind_optional_text. | |
Typedefs | |
| using | CallbackFailureSink = void (*)(const CallbackFailure&) |
| Sink type. | |
| using | TracePayload |
| Heterogeneous payload. Order matches TraceCategory. | |
| using | TraceSink = std::function<void(const TraceEvent&)> |
| User-facing sink shape: a callable that receives every published event. | |
| template<typename L> | |
| using | list_source_value_t |
| Element type for a list source. | |
Enumerations | |
| enum class | TraceCategory : std::uint8_t { Reactive = 0 , Async = 1 , Binding = 2 , Command = 3 , Validation = 4 , List = 5 } |
| Coarse subsystem label. More... | |
| enum class | ErrorKind : std::uint8_t { UserError = 0 , Validation = 1 , AsyncFailure = 2 , Cancellation = 3 , Timeout = 4 , BindingFailure = 5 , GraphCycle = 6 , InvariantViolation = 7 } |
| Coarse classification of every error Aria can surface. More... | |
| enum class | ListChangeKind { Insert , Remove , Replace , ItemChanged , Reset , Move } |
| enum class | LoadState : unsigned char { Idle = 0 , Loading = 1 , Refreshing = 2 , Success = 3 , Error = 4 } |
| Discriminator for Loadable<T>. More... | |
| enum class | SchedulerCaps : std::uint32_t { None = 0 , Post = 1u << 0 , Delay = 1u << 1 , MainThread = 1u << 2 , Pumpable = 1u << 3 , GraphSafe = 1u << 4 , WorkerSafe = 1u << 5 , Autonomous = 1u << 6 } |
| enum class | Severity : std::uint8_t { Error = 0 , Warning = 1 } |
| Severity of a single error / warning. More... | |
Functions | |
| CallbackFailureSink | set_callback_failure_sink (CallbackFailureSink sink) noexcept |
| Install a global callback-failure sink. | |
| CallbackFailureSink | current_callback_failure_sink () noexcept |
| Read the currently installed sink. | |
| void | report_callback_failure (std::string_view category, std::exception_ptr exception, std::string_view message={}) noexcept |
| Report a callback failure. | |
| void | report_callback_failure (std::string_view category, std::string_view message) noexcept |
| Convenience overload taking a precomputed message and no exception pointer (e.g. | |
| template<typename Key, typename Source, typename KeyFn, typename T = list_source_value_t<Source>> requires ListSourceOf<Source, T> | |
| std::shared_ptr< DistinctList< T, Key, Source > > | distinct (std::shared_ptr< Source > source, KeyFn key_of) |
| template<typename Source, typename Predicate, typename T = list_source_value_t<Source>> requires ListSourceOf<Source, T> | |
| std::shared_ptr< FilteredList< T, Source > > | filtered (std::shared_ptr< Source > source, Predicate predicate) |
| template<typename Key, typename Source, typename KeyFn, typename T = list_source_value_t<Source>> requires ListSourceOf<Source, T> | |
| std::shared_ptr< GroupedList< T, Key, Source > > | grouped (std::shared_ptr< Source > source, KeyFn key_of) |
| template<typename Target, typename SourceList, typename MapFn, typename Source = list_source_value_t<SourceList>> requires ListSourceOf<SourceList, Source> | |
| std::shared_ptr< MappedList< Source, Target, SourceList > > | mapped (std::shared_ptr< SourceList > source, MapFn mapper, bool remap_on_change=false) |
| template<typename Source, typename T = list_source_value_t<Source>> requires ListSourceOf<Source, T> | |
| std::shared_ptr< PagedList< T, Source > > | paged (std::shared_ptr< Source > source, std::size_t page_size, std::size_t page_index=0) |
| template<typename Source, typename Comparator, typename T = list_source_value_t<Source>> requires ListSourceOf<Source, T> | |
| std::shared_ptr< SortedList< T, Source > > | sorted (std::shared_ptr< Source > source, Comparator comparator) |
| std::string_view | to_string (TraceCategory c) noexcept |
| void | install_trace_sink (TraceSink sink) |
| Install (or replace) the global sink. | |
| void | clear_trace_sink () noexcept |
| Tear down the global sink. | |
| bool | has_trace_sink () noexcept |
| True iff a sink is currently installed. | |
| void | publish_trace_unchecked (const TraceEvent &event) noexcept |
| Publish an already-built event using one owning sink snapshot. | |
| void | publish_trace (const TraceEvent &event) noexcept |
| Publish an already-built event. | |
| template<detail::TracePayloadType Payload> | |
| void | publish_trace_unchecked (TraceCategory category, Payload payload, std::optional<::aria::Error > error=std::nullopt) |
| Build an event after taking one owning sink snapshot. | |
| template<detail::TracePayloadType Payload> | |
| void | publish_trace (TraceCategory category, Payload payload, std::optional<::aria::Error > error=std::nullopt) |
| Convenience form for callers that already have a payload. | |
| std::string_view | to_string (ErrorKind k) noexcept |
| std::string_view | to_string (Severity s) noexcept |
| bool | operator== (const Error &a, const Error &b) noexcept |
| bool | operator!= (const Error &a, const Error &b) noexcept |
| std::ostream & | operator<< (std::ostream &os, const Error &e) |
| template<class R, class... Args> | |
| function_ref (R(*)(Args...)) -> function_ref< R(Args...)> | |
| template<PropertyValue T> | |
| std::shared_ptr< Property< T > > | distinct_until_changed (Property< T > &source) |
| template<PropertyValue T> | |
| std::shared_ptr< Property< T > > | debounce (Property< T > &source, std::chrono::milliseconds quiet, IDelayedScheduler &timer) |
| template<PropertyValue T> | |
| std::shared_ptr< Property< T > > | throttle (Property< T > &source, std::chrono::milliseconds cooldown, IDelayedScheduler &timer) |
| template<PropertyValue T, PropertyValue Acc, typename Reducer> | |
| std::shared_ptr< Property< Acc > > | scan (Property< T > &source, Acc seed, Reducer reduce) |
| template<PropertyValue A, PropertyValue B, typename Combiner> | |
| auto | combine_latest (Property< A > &a, Property< B > &b, Combiner combine) -> std::shared_ptr< Property< std::invoke_result_t< Combiner &, const A &, const B & > > > |
| constexpr SchedulerCaps | operator| (SchedulerCaps a, SchedulerCaps b) noexcept |
| constexpr SchedulerCaps | operator& (SchedulerCaps a, SchedulerCaps b) noexcept |
| constexpr SchedulerCaps & | operator|= (SchedulerCaps &a, SchedulerCaps b) noexcept |
| constexpr SchedulerCaps & | operator&= (SchedulerCaps &a, SchedulerCaps b) noexcept |
| constexpr bool | has_any (SchedulerCaps a, SchedulerCaps b) noexcept |
| constexpr bool | has_all (SchedulerCaps a, SchedulerCaps b) noexcept |
| bool | has_caps (const IScheduler &s, SchedulerCaps required) noexcept |
| void | require_caps (const IScheduler &s, SchedulerCaps required, const char *context="scheduler") |
| Throwing accessor — useful at component construction time when missing a capability is a programmer error. | |
| bool | operator== (const ValidationKey &a, const ValidationKey &b) noexcept |
| bool | operator!= (const ValidationKey &a, const ValidationKey &b) noexcept |
| std::ostream & | operator<< (std::ostream &os, const ValidationKey &k) |
| validation_dsl::FieldPart | field (std::string path) noexcept |
| validation_dsl::RulePart | rule_id (std::string id) noexcept |
| ValidationKey | operator/ (validation_dsl::FieldPart f, validation_dsl::RulePart r) |
| bool | operator== (const ValidationResult &a, const ValidationResult &b) noexcept |
| bool | operator!= (const ValidationResult &a, const ValidationResult &b) noexcept |
| bool | operator== (const ValidationState &a, const ValidationState &b) noexcept |
| bool | operator!= (const ValidationState &a, const ValidationState &b) noexcept |
| template<class Fn> | |
| auto | batch (Fn &&fn) -> decltype(fn()) |
| Sugar: batch([&]{ firstName = "..."; lastName = "..."; }). | |
| template<class Fn> | |
| auto | untracked (Fn &&fn) -> decltype(fn()) |
| Sugar: untracked([&]{ ... }). | |
| template<class Reactive> | |
| requires ::aria::ReactiveNode< Reactive > void | dep (Reactive &r) |
| using aria::CallbackFailureSink = void (*)(const CallbackFailure&) |
Sink type.
The framework wraps every invocation in try / catch (...), so a sink that throws will not crash the noexcept reporter — the framework swallows the secondary failure and falls through to the stderr fallback. By contract the sink should still be noexcept; non-noexcept is allowed only because we cannot make exception safety observable on a function-pointer type alone.
| using aria::TracePayload |
Heterogeneous payload. Order matches TraceCategory.
| using aria::TraceSink = std::function<void(const TraceEvent&)> |
User-facing sink shape: a callable that receives every published event.
Implementations should be cheap on the happy path: the publish call site is on the framework's hot path (every Property flush, every list mutation) so any non-trivial work in the sink must be pushed off-thread by the user themselves.
| using aria::list_source_value_t |
Element type for a list source.
Resolves value_type (preferred) then element_type. Both ObservableList<T> and the derived list types expose one or the other via the Signal parametrisation, but for the adapter contract we just need a stable name.
|
strong |
Coarse subsystem label.
Routers / filters discriminate on this before looking at any other field. Stable enumerator order; never re-ordered, only appended at the end.
| Enumerator | |
|---|---|
| Reactive | Graph flush, push-color, pull-evaluate. |
| Async | AsyncCommand / AsyncResource lifecycle. |
| Binding | BindingEngine VM<->View dispatch. |
| Command | Synchronous Command<Args...> execution. |
| Validation | Validator / FormValidator rule runs. |
| List | |
|
strong |
Coarse classification of every error Aria can surface.
Designed so that a UI router can route on kind alone before inspecting any other field. Stable enumerator order; never re-ordered, only appended at the end.
| Enumerator | |
|---|---|
| UserError | Caller passed something the API explicitly forbids (null view model, out-of-range index, ...). Maps std::invalid_argument and std::out_of_range. |
| Validation | A validator rule failed. The accompanying Error::key is populated; Error::source is "Validator" or "FormValidator". |
| AsyncFailure | An asynchronous body threw a non-cancellation, non-timeout exception. Error::inner carries the original exception_ptr when available. |
| Cancellation | An OperationCancelled propagated through the async pipeline. Cancellation is a normal control-flow path; UI typically renders nothing for this kind. |
| Timeout | A with_timeout deadline elapsed (either Race or Fail mode). |
| BindingFailure | View / adapter side-effect failed (e.g. native widget setter threw). Currently reserved for future binding-side reporting; today binding errors propagate as exceptions. |
| GraphCycle | A reactive dependency cycle or non-converging flush was detected. |
| InvariantViolation | A documented framework invariant was violated at runtime (reserved for stress / fuzz reporting; never thrown from the happy path). |
|
strong |
|
strong |
Discriminator for Loadable<T>.
See file-level docs for the semantic of each tag (LO-1).
| Enumerator | |
|---|---|
| Idle | |
| Loading | |
| Refreshing | |
| Success | |
| Error | |
|
strong |
| Enumerator | |
|---|---|
| None | |
| Post | Can submit "fire now" work. Every conforming IScheduler supplies this (the pure virtual schedule()); declared as a capability for symmetry / introspection. |
| Delay | Can submit work after a wall-clock or virtual-time delay. Implementation must override schedule_after. |
| MainThread | Submitted work runs on a single, identifiable "main" thread that is consistent across calls. is_main_thread() is meaningful. |
| Pumpable | Posted work is held in a queue until a pump-style call drains it (e.g. pump/drain/run_one). Components that need deterministic test-driven progress should require this. |
| GraphSafe | Safe to use as the graph-thread executor — i.e. work posted here will not race the reactive graph's owner-thread invariant. Equivalent to the historical is_safe_graph_executor(). |
| WorkerSafe | Safe to host blocking worker tasks (e.g. backed by a thread pool). Equivalent to the historical is_safe_worker_executor(). |
| Autonomous | Implementation does not require any external pump and runs work on background threads autonomously. Useful for tests that want to assert "this is a thread pool, not a UI dispatcher". |
|
strong |
Severity of a single error / warning.
Carried on aria::Error; also pre-declared here so consumers that only need ValidationKey + Severity (without the whole Error machinery) can stay lightweight.
| Enumerator | |
|---|---|
| Error | |
| Warning | |
|
inlinenoexcept |
Install a global callback-failure sink.
Pass nullptr to revert to the stderr fallback. Returns the previously installed sink (nullptr if none).
|
inlinenodiscardnoexcept |
Read the currently installed sink.
Returns nullptr if the stderr fallback is active. Mostly for diagnostics / introspection.
|
noexcept |
Report a callback failure.
Always succeeds (never throws). The reporter will:
|
inlinenoexcept |
Convenience overload taking a precomputed message and no exception pointer (e.g.
when the framework observed a contract violation it does not wish to model as an exception).
|
nodiscard |
|
nodiscard |
|
nodiscard |
|
nodiscard |
|
nodiscard |
|
nodiscard |
|
inlinenodiscardnoexcept |
|
inline |
Install (or replace) the global sink.
Safe to call from any thread. Pass {} to clear; identical to clear_trace_sink().
|
inlinenoexcept |
Tear down the global sink.
After this returns, publish() is a pure no-op until the next install.
|
inlinenodiscardnoexcept |
True iff a sink is currently installed.
Cheap; useful for sites that want to skip building a payload entirely when no one is listening.
|
inlinenoexcept |
Publish an already-built event using one owning sink snapshot.
Callers normally gate expensive payload construction with has_trace_sink(). This overload remains safe if the sink is removed after that check.
|
inlinenoexcept |
Publish an already-built event.
With no sink, only the atomic presence flag is read. An enabled sink is retained under the registry mutex and invoked outside it. Recursive traces are suppressed; sink exceptions are reported through the callback-failure boundary.
|
inline |
Build an event after taking one owning sink snapshot.
Use after a has_trace_sink() gate to avoid building expensive payloads when disabled.
|
inline |
Convenience form for callers that already have a payload.
To defer its construction, place has_trace_sink() before constructing the argument.
|
inlinenodiscardnoexcept |
|
inlinenodiscardnoexcept |
|
inline |
| aria::function_ref | ( | R(* | )(Args...) | ) | -> function_ref< R(Args...)> |
|
nodiscard |
|
nodiscard |
|
nodiscard |
|
nodiscard |
|
nodiscard |
|
nodiscardconstexprnoexcept |
|
nodiscardconstexprnoexcept |
|
constexprnoexcept |
|
constexprnoexcept |
|
nodiscardconstexprnoexcept |
|
nodiscardconstexprnoexcept |
|
inlinenodiscardnoexcept |
|
inline |
Throwing accessor — useful at component construction time when missing a capability is a programmer error.
|
inlinenoexcept |
|
inlinenoexcept |
|
inline |
|
inlinenodiscardnoexcept |
|
inlinenodiscardnoexcept |
|
inlinenodiscard |
|
inlinenoexcept |
|
inlinenoexcept |
|
inlinenoexcept |
|
inlinenoexcept |
| auto aria::reactive::batch | ( | Fn && | fn | ) | -> decltype(fn()) |
Sugar: batch([&]{ firstName = "..."; lastName = "..."; }).
| auto aria::reactive::untracked | ( | Fn && | fn | ) | -> decltype(fn()) |
Sugar: untracked([&]{ ... }).
Matches the MobX/SolidJS naming so users coming from those ecosystems feel at home.
| requires ::aria::ReactiveNode< Reactive > void aria::reactive::dep | ( | Reactive & | r | ) |