22#include <boost/signals2/connection.hpp>
23#include <boost/signals2/signal.hpp>
24#include <boost/signals2/variadic_signal.hpp>
34 std::same_as<std::remove_cvref_t<T>, std::atomic<std::remove_cvref_t<typename T::value_type>>>;
51 std::equality_comparable<T> && std::copy_constructible<T> && std::move_constructible<T>;
64template <Observable T>
67 boost::signals2::signal<void(T
const&)> onUpdate_;
77 boost::signals2::connection
78 observe(std::invocable<T const&>
auto&& fn)
80 return onUpdate_.connect(std::forward<
decltype(fn)>(fn));
90 return not onUpdate_.empty();
142template <Observable T>
157 struct ObservableGuard {
165 ObservableGuard(
ObservableValue<T>& observable) : oldValue(observable), ref(observable)
177 if (oldValue != ref.value_)
178 ref.notifyObservers(ref.value_);
198 : value_{std::forward<decltype(value)>(value)}
206 requires std::default_initializable<T>
211 ObservableValue(ObservableValue
const&) =
delete;
212 ObservableValue(ObservableValue&&) =
default;
214 operator=(ObservableValue
const&) =
delete;
216 operator=(ObservableValue&&) =
default;
244 [[nodiscard]] ObservableGuard
255 operator T
const&()
const
264 [[nodiscard]] T
const&
286 set(std::convertible_to<T>
auto&& val)
289 value_ = std::forward<decltype(val)>(val);
326template <Observable T>
328 std::atomic<T> value_;
336 : value_{std::forward<decltype(value)>(value)}
344 requires std::default_initializable<T>
349 ObservableValue(ObservableValue
const&) =
delete;
350 ObservableValue(ObservableValue&&) =
default;
352 operator=(ObservableValue
const&) =
delete;
354 operator=(ObservableValue&&) =
default;
368 set(std::forward<
decltype(val)>(val));
379 return value_.load();
401 set(std::convertible_to<T>
auto&& val)
403 T newValue = std::forward<decltype(val)>(val);
404 T oldValue = value_.load();
407 while (!value_.compare_exchange_weak(oldValue, newValue)) {
414 if (oldValue != newValue) {
ObservableValue & operator=(std::convertible_to< T > auto &&val)
Assignment operator that updates value and notifies observers.
Definition ObservableValue.hpp:230
ObservableGuard operator->()
Provides deferred notification access to the value.
Definition ObservableValue.hpp:245
void forceNotify() override
Forces notification of all observers with the current value.
Definition ObservableValue.hpp:301
ObservableValue()
Constructs ObservableValue with default initial value.
Definition ObservableValue.hpp:205
ObservableValue(std::convertible_to< T > auto &&value)
Constructs ObservableValue with initial value.
Definition ObservableValue.hpp:197
T const & get() const
Explicitly gets the current value.
Definition ObservableValue.hpp:265
void set(std::convertible_to< T > auto &&val)
Sets a new value and notifies observers if changed.
Definition ObservableValue.hpp:286
void set(std::convertible_to< T > auto &&val)
Sets a new atomic value and notifies observers if changed.
Definition ObservableValue.hpp:401
ObservableValue()
Constructs ObservableValue with default initial value.
Definition ObservableValue.hpp:343
T get() const
Gets the current atomic value.
Definition ObservableValue.hpp:377
ObservableValue(std::convertible_to< T > auto &&value)
Constructs ObservableValue with initial atomic value.
Definition ObservableValue.hpp:335
ObservableValue & operator=(std::convertible_to< T > auto &&val)
Assignment operator that updates atomic value and notifies observers.
Definition ObservableValue.hpp:366
void forceNotify() override
Forces notification of all observers with the current value.
Definition ObservableValue.hpp:426
Definition ObservableValue.hpp:118
Base class containing common ObservableValue functionality.
Definition ObservableValue.hpp:65
void notifyObservers(T const &value)
Notifies all observers with the given value.
Definition ObservableValue.hpp:108
boost::signals2::connection observe(std::invocable< T const & > auto &&fn)
Registers an observer callback for value changes.
Definition ObservableValue.hpp:78
bool hasObservers() const
Checks if there are any active observers.
Definition ObservableValue.hpp:88
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:50
Definition ObservableValue.hpp:33
This namespace contains various utilities.
Definition AccountUtils.hpp:30