3#include <boost/signals2/connection.hpp>
4#include <boost/signals2/signal.hpp>
5#include <boost/signals2/variadic_signal.hpp>
15 std::same_as<std::remove_cvref_t<T>, std::atomic<std::remove_cvref_t<typename T::value_type>>>;
32 std::equality_comparable<T> && std::copy_constructible<T> && std::move_constructible<T>;
45template <Observable T>
48 boost::signals2::signal<void(T
const&)> onUpdate_;
58 boost::signals2::connection
59 observe(std::invocable<T const&>
auto&& fn)
61 return onUpdate_.connect(std::forward<
decltype(fn)>(fn));
71 return not onUpdate_.empty();
123template <Observable T>
138 struct ObservableGuard {
146 ObservableGuard(
ObservableValue<T>& observable) : oldValue(observable), ref(observable)
158 if (oldValue != ref.value_)
159 ref.notifyObservers(ref.value_);
179 : value_{std::forward<decltype(value)>(value)}
187 requires std::default_initializable<T>
192 ObservableValue(ObservableValue
const&) =
delete;
193 ObservableValue(ObservableValue&&) =
default;
195 operator=(ObservableValue
const&) =
delete;
197 operator=(ObservableValue&&) =
default;
225 [[nodiscard]] ObservableGuard
236 operator T
const&()
const
245 [[nodiscard]] T
const&
267 set(std::convertible_to<T>
auto&& val)
270 value_ = std::forward<decltype(val)>(val);
307template <Observable T>
309 std::atomic<T> value_;
317 : value_{std::forward<decltype(value)>(value)}
325 requires std::default_initializable<T>
330 ObservableValue(ObservableValue
const&) =
delete;
331 ObservableValue(ObservableValue&&) =
default;
333 operator=(ObservableValue
const&) =
delete;
335 operator=(ObservableValue&&) =
default;
349 set(std::forward<
decltype(val)>(val));
360 return value_.load();
382 set(std::convertible_to<T>
auto&& val)
384 T newValue = std::forward<decltype(val)>(val);
385 T oldValue = value_.load();
388 while (!value_.compare_exchange_weak(oldValue, newValue)) {
395 if (oldValue != newValue) {
ObservableValue & operator=(std::convertible_to< T > auto &&val)
Assignment operator that updates value and notifies observers.
Definition ObservableValue.hpp:211
ObservableGuard operator->()
Provides deferred notification access to the value.
Definition ObservableValue.hpp:226
void forceNotify() override
Forces notification of all observers with the current value.
Definition ObservableValue.hpp:282
ObservableValue()
Constructs ObservableValue with default initial value.
Definition ObservableValue.hpp:186
ObservableValue(std::convertible_to< T > auto &&value)
Constructs ObservableValue with initial value.
Definition ObservableValue.hpp:178
T const & get() const
Explicitly gets the current value.
Definition ObservableValue.hpp:246
void set(std::convertible_to< T > auto &&val)
Sets a new value and notifies observers if changed.
Definition ObservableValue.hpp:267
void set(std::convertible_to< T > auto &&val)
Sets a new atomic value and notifies observers if changed.
Definition ObservableValue.hpp:382
ObservableValue()
Constructs ObservableValue with default initial value.
Definition ObservableValue.hpp:324
T get() const
Gets the current atomic value.
Definition ObservableValue.hpp:358
ObservableValue(std::convertible_to< T > auto &&value)
Constructs ObservableValue with initial atomic value.
Definition ObservableValue.hpp:316
ObservableValue & operator=(std::convertible_to< T > auto &&val)
Assignment operator that updates atomic value and notifies observers.
Definition ObservableValue.hpp:347
void forceNotify() override
Forces notification of all observers with the current value.
Definition ObservableValue.hpp:407
Definition ObservableValue.hpp:99
Base class containing common ObservableValue functionality.
Definition ObservableValue.hpp:46
void notifyObservers(T const &value)
Notifies all observers with the given value.
Definition ObservableValue.hpp:89
boost::signals2::connection observe(std::invocable< T const & > auto &&fn)
Registers an observer callback for value changes.
Definition ObservableValue.hpp:59
bool hasObservers() const
Checks if there are any active observers.
Definition ObservableValue.hpp:69
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:31
Definition ObservableValue.hpp:14
This namespace contains various utilities.
Definition AccountUtils.hpp:11