HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
observable_value.hpp
1// Copyright Take Vos 2020.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "observable_base.hpp"
8#include <concepts>
9
10namespace tt::detail {
11
12template<typename T>
13class observable_value final : public observable_base<T> {
14public:
16
17 observable_value() noexcept :
18 super(), _value() {}
19
20 observable_value(T const &value) noexcept :
21 super(), _value(value) {}
22
23 T load() const noexcept override {
24 ttlet lock = std::scoped_lock(this->_mutex);
25 return _value;
26 }
27
28 bool store(T const &new_value) noexcept override {
29 this->_mutex.lock();
30
31 ttlet old_value = _value;
32 if constexpr (std::equality_comparable<T>) {
33 if (new_value != old_value) {
34 _value = new_value;
35 this->_mutex.unlock();
36 this->notify(old_value, new_value);
37 return true;
38 } else {
39 this->_mutex.unlock();
40 return false;
41 }
42
43 } else {
44 _value = new_value;
45 this->_mutex.unlock();
46 this->notify(old_value, new_value);
47 return true;
48 }
49 }
50
51private:
52 T _value;
53};
54
55}
Observable abstract base class.
Definition observable_base.hpp:30
Definition observable_value.hpp:13
T load() const noexcept override
Get the current value.
Definition observable_value.hpp:23
bool store(T const &new_value) noexcept override
Set the value.
Definition observable_value.hpp:28