22#include <boost/signals2/connection.hpp>
23#include <boost/signals2/signal.hpp>
24#include <boost/signals2/variadic_signal.hpp>
33concept SomeAtomic = std::same_as<std::remove_cvref_t<T>, std::atomic<std::remove_cvref_t<typename T::value_type>>>;
49concept Observable = std::equality_comparable<T> && std::copy_constructible<T> && std::move_constructible<T>;
61template <Observable T>
64 boost::signals2::signal<void(T
const&)> onUpdate_;
74 boost::signals2::connection
75 observe(std::invocable<T const&>
auto&& fn)
77 return onUpdate_.connect(std::forward<
decltype(fn)>(fn));
87 return not onUpdate_.empty();
138template <Observable T>
153 struct ObservableGuard {
161 ObservableGuard(
ObservableValue<T>& observable) : oldValue(observable), ref(observable)
173 if (oldValue != ref.value_)
174 ref.notifyObservers(ref.value_);
193 ObservableValue(std::convertible_to<T>
auto&& value) : value_{std::forward<decltype(value)>(value)}
201 requires std::default_initializable<T>
206 ObservableValue(ObservableValue
const&) =
delete;
207 ObservableValue(ObservableValue&&) =
default;
209 operator=(ObservableValue
const&) =
delete;
211 operator=(ObservableValue&&) =
default;
239 [[nodiscard]] ObservableGuard
250 operator T
const&()
const
259 [[nodiscard]] T
const&
281 set(std::convertible_to<T>
auto&& val)
284 value_ = std::forward<decltype(val)>(val);
321template <Observable T>
323 std::atomic<T> value_;
330 ObservableValue(std::convertible_to<T>
auto&& value) : value_{std::forward<decltype(value)>(value)}
338 requires std::default_initializable<T>
343 ObservableValue(ObservableValue
const&) =
delete;
344 ObservableValue(ObservableValue&&) =
default;
346 operator=(ObservableValue
const&) =
delete;
348 operator=(ObservableValue&&) =
default;
362 set(std::forward<
decltype(val)>(val));
373 return value_.load();
395 set(std::convertible_to<T>
auto&& val)
397 T newValue = std::forward<decltype(val)>(val);
398 T oldValue = value_.load();
401 while (!value_.compare_exchange_weak(oldValue, newValue)) {
408 if (oldValue != newValue) {
ObservableValue & operator=(std::convertible_to< T > auto &&val)
Assignment operator that updates value and notifies observers.
Definition ObservableValue.hpp:225
ObservableGuard operator->()
Provides deferred notification access to the value.
Definition ObservableValue.hpp:240
void forceNotify() override
Forces notification of all observers with the current value.
Definition ObservableValue.hpp:296
ObservableValue()
Constructs ObservableValue with default initial value.
Definition ObservableValue.hpp:200
ObservableValue(std::convertible_to< T > auto &&value)
Constructs ObservableValue with initial value.
Definition ObservableValue.hpp:193
T const & get() const
Explicitly gets the current value.
Definition ObservableValue.hpp:260
void set(std::convertible_to< T > auto &&val)
Sets a new value and notifies observers if changed.
Definition ObservableValue.hpp:281
void set(std::convertible_to< T > auto &&val)
Sets a new atomic value and notifies observers if changed.
Definition ObservableValue.hpp:395
ObservableValue()
Constructs ObservableValue with default initial value.
Definition ObservableValue.hpp:337
T get() const
Gets the current atomic value.
Definition ObservableValue.hpp:371
ObservableValue(std::convertible_to< T > auto &&value)
Constructs ObservableValue with initial atomic value.
Definition ObservableValue.hpp:330
ObservableValue & operator=(std::convertible_to< T > auto &&val)
Assignment operator that updates atomic value and notifies observers.
Definition ObservableValue.hpp:360
void forceNotify() override
Forces notification of all observers with the current value.
Definition ObservableValue.hpp:420
Definition ObservableValue.hpp:115
Base class containing common ObservableValue functionality.
Definition ObservableValue.hpp:62
void notifyObservers(T const &value)
Notifies all observers with the given value.
Definition ObservableValue.hpp:105
boost::signals2::connection observe(std::invocable< T const & > auto &&fn)
Registers an observer callback for value changes.
Definition ObservableValue.hpp:75
bool hasObservers() const
Checks if there are any active observers.
Definition ObservableValue.hpp:85
virtual void forceNotify()=0
Forces notification of all observers with the current value.
Concept defining types that can be observed for changes.
Definition ObservableValue.hpp:49
Definition ObservableValue.hpp:33
This namespace contains various utilities.
Definition AccountUtils.hpp:30