Sparkle 0.0.1
Loading...
Searching...
No Matches
spk_stateful_object.hpp
1#pragma once
2
3#include <mutex>
4#include <unordered_map>
5
6#include "structure/design_pattern/spk_contract_provider.hpp"
7
8#include "utils/spk_debug_macro.hpp"
9
10namespace spk
11{
17 template <typename TType>
19 {
20 public:
22 using Contract = ContractProvider::Contract;
25
26 private:
27 TType _state;
28 std::unordered_map<TType, ContractProvider> _callbacks;
29 mutable std::mutex _mutex;
30
31 public:
36 StatefulObject(const TType &p_initialState) :
37 _state(p_initialState)
38 {
39 }
40
41 StatefulObject(const StatefulObject &p_other) = delete;
42 StatefulObject &operator=(const StatefulObject &p_other) = delete;
43
48 StatefulObject(StatefulObject &&p_other) noexcept :
49 _state(std::move(p_other._state)),
50 _callbacks(std::move(p_other._callbacks))
51 {
52 }
53
60 {
61 if (this != &p_other)
62 {
63 std::scoped_lock lock(_mutex, p_other._mutex);
64
65 _state = std::move(p_other._state);
66 _callbacks = std::move(p_other._callbacks);
67 }
68 return *this;
69 }
70
71 virtual ~StatefulObject() = default;
72
77 void setState(const TType &p_newState)
78 {
79 std::scoped_lock lock(_mutex);
80
81 if (_state != p_newState)
82 {
83 _state = p_newState;
84 _callbacks[_state].trigger();
85 }
86 }
87
92 TType state() const
93 {
94 std::scoped_lock lock(_mutex);
95 return _state;
96 }
97
104 Contract addCallback(const TType &p_state, const Job &p_callback)
105 {
106 std::scoped_lock lock(_mutex);
107 return (std::move(_callbacks[p_state].subscribe(p_callback)));
108 }
109 };
110}
Tracks a state value and triggers callbacks per-state.
Definition spk_stateful_object.hpp:19
ContractProvider::Job Job
Definition spk_stateful_object.hpp:24
TType state() const
Returns the current state.
Definition spk_stateful_object.hpp:92
void setState(const TType &p_newState)
Sets a new state and triggers callbacks registered for it.
Definition spk_stateful_object.hpp:77
Contract addCallback(const TType &p_state, const Job &p_callback)
Subscribes a callback for a specific state.
Definition spk_stateful_object.hpp:104
StatefulObject(StatefulObject &&p_other) noexcept
Move-constructs, transferring state and callbacks.
Definition spk_stateful_object.hpp:48
StatefulObject & operator=(StatefulObject &&p_other) noexcept
Move-assigns, transferring state and callbacks.
Definition spk_stateful_object.hpp:59
StatefulObject(const TType &p_initialState)
Builds with an initial state.
Definition spk_stateful_object.hpp:36
ContractProvider::Contract Contract
Definition spk_stateful_object.hpp:22
typename Contract::Job Job
Definition spk_contract_provider.hpp:267