17 template <
typename STATE_TYPE,
typename REASON_TYPE>
18 using StateEvent = std::pair<uint64_t, std::pair<STATE_TYPE, REASON_TYPE>>;
20 template <
typename STATE_TYPE,
typename REASON_TYPE>
21 using StateEvents = std::vector<StateEvent<STATE_TYPE, REASON_TYPE>>;
23 template <
typename STATE_TYPE,
typename REASON_TYPE>
26 explicit StateNotifier(STATE_TYPE init_value) : current_state_(init_value) {}
29 void Notify(uint64_t ts, STATE_TYPE state, REASON_TYPE reason) {
30 if (current_state_.exchange(state) == state) {
34 std::lock_guard<std::mutex> _(lock_);
35 events_.push_back({ts, {state, reason}});
40 std::lock_guard<std::mutex> _(lock_);
42 retEvents.swap(events_);
44 retEvents.assign(events_.begin(), events_.end());
50 std::lock_guard<std::mutex> _(lock_);
52 std::size_t events_size = events_.size();
53 for (std::size_t i = 0; i < events_size; ++i) {
54 if (events_[i].second.first == state) {
55 retEvent = events_[i];
56 for (
int j = i; j < events_size - 1; ++j) {
57 events_[j] = events_[j + 1];
70 std::atomic<STATE_TYPE> current_state_;