漏删除
This commit is contained in:
@@ -1,52 +0,0 @@
|
||||
#pragma once
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <mutex>
|
||||
#include <optional>
|
||||
#include <utility>
|
||||
#include "renderive/base/Concepts.hpp"
|
||||
#include "renderive/base/observer/Observer.hpp"
|
||||
#include "Observation.hpp"
|
||||
#include "base/Real_Time_Data_Base.hpp"
|
||||
#include "concept/Real_Time_Data.hpp"
|
||||
#include "renderive/state/Render_State_View.hpp"
|
||||
template <class Value_Type, Mutex_Type Mutex = std::mutex, class Observer = Observer_State<>>
|
||||
class Latest_Real_Time_Data : public Real_Time_Data_Base {
|
||||
public:
|
||||
using Value = Value_Type;
|
||||
static_assert(Real_Time_Data_Value<Value>);
|
||||
static_assert(Timed_Struct_Observer<Observer, Real_Time_Data_Observation>);
|
||||
explicit Latest_Real_Time_Data(Observer observer = {});
|
||||
Latest_Real_Time_Data(const Latest_Real_Time_Data&) = delete;
|
||||
Latest_Real_Time_Data& operator=(const Latest_Real_Time_Data&) = delete;
|
||||
void update(Value value);
|
||||
std::optional<Value> snapshot() const;
|
||||
bool has_value() const;
|
||||
std::uint64_t revision() const;
|
||||
Real_Time_Data_Retention retention() const noexcept override;
|
||||
Real_Time_Data_Update_State update_state() const override;
|
||||
std::size_t discard_before_time_ns(std::uint64_t time_ns) override;
|
||||
template <class Target>
|
||||
requires requires(Observer& observer, Target& target) {
|
||||
observer.bind(target);
|
||||
}
|
||||
decltype(auto) bind(Target& target) {
|
||||
return observer_.bind(target);
|
||||
}
|
||||
private:
|
||||
friend class Render_State_View;
|
||||
void publish_render_state() override;
|
||||
const std::optional<Value>& render_state_value() const noexcept;
|
||||
mutable Mutex mutex_;
|
||||
std::recursive_mutex mutation_mutex_;
|
||||
Observer observer_;
|
||||
std::optional<Value> states_[3];
|
||||
std::optional<Value>* render_state_;
|
||||
std::optional<Value>* cache_state_;
|
||||
std::optional<Value>* scratch_state_;
|
||||
std::uint64_t revision_{};
|
||||
std::uint64_t render_revision_{};
|
||||
std::uint64_t total_update_count_{};
|
||||
std::uint64_t last_update_time_ns_{};
|
||||
};
|
||||
#include "Latest_Real_Time_Data.inl"
|
||||
@@ -1,61 +0,0 @@
|
||||
#pragma once
|
||||
template <class Value_Type, Mutex_Type Mutex, class Observer>
|
||||
Latest_Real_Time_Data<Value_Type, Mutex, Observer>::Latest_Real_Time_Data(Observer observer)
|
||||
: observer_(std::move(observer)), render_state_(&states_[0]), cache_state_(&states_[1]), scratch_state_(&states_[2]) {}
|
||||
template <class Value_Type, Mutex_Type Mutex, class Observer>
|
||||
void Latest_Real_Time_Data<Value_Type, Mutex, Observer>::update(Value value) {
|
||||
std::lock_guard mutation_lock(mutation_mutex_);
|
||||
Real_Time_Data_Observation observation;
|
||||
{
|
||||
std::lock_guard<Mutex> lock(mutex_);
|
||||
*cache_state_ = std::move(value);
|
||||
++revision_;
|
||||
++total_update_count_;
|
||||
last_update_time_ns_ = observer_.now_ns();
|
||||
observation = {Real_Time_Data_Observation_Event::updated, {this, Real_Time_Data_Retention::latest, revision_, last_update_time_ns_, total_update_count_, 1}};
|
||||
}
|
||||
observer_.observe(observation);
|
||||
}
|
||||
template <class Value_Type, Mutex_Type Mutex, class Observer>
|
||||
auto Latest_Real_Time_Data<Value_Type, Mutex, Observer>::snapshot() const -> std::optional<Value> {
|
||||
std::lock_guard<Mutex> lock(mutex_);
|
||||
return *cache_state_;
|
||||
}
|
||||
template <class Value_Type, Mutex_Type Mutex, class Observer>
|
||||
bool Latest_Real_Time_Data<Value_Type, Mutex, Observer>::has_value() const {
|
||||
std::lock_guard<Mutex> lock(mutex_);
|
||||
return cache_state_->has_value();
|
||||
}
|
||||
template <class Value_Type, Mutex_Type Mutex, class Observer>
|
||||
std::uint64_t Latest_Real_Time_Data<Value_Type, Mutex, Observer>::revision() const {
|
||||
std::lock_guard<Mutex> lock(mutex_);
|
||||
return revision_;
|
||||
}
|
||||
template <class Value_Type, Mutex_Type Mutex, class Observer>
|
||||
Real_Time_Data_Update_State Latest_Real_Time_Data<Value_Type, Mutex, Observer>::update_state() const {
|
||||
std::lock_guard<Mutex> lock(mutex_);
|
||||
return {this, Real_Time_Data_Retention::latest, revision_, last_update_time_ns_, total_update_count_, *cache_state_ ? 1U : 0U};
|
||||
}
|
||||
template <class Value_Type, Mutex_Type Mutex, class Observer>
|
||||
void Latest_Real_Time_Data<Value_Type, Mutex, Observer>::publish_render_state() {
|
||||
std::lock_guard<Mutex> lock(mutex_);
|
||||
if (render_revision_ == revision_)
|
||||
return;
|
||||
*scratch_state_ = *cache_state_;
|
||||
std::swap(render_state_, scratch_state_);
|
||||
render_revision_ = revision_;
|
||||
}
|
||||
template <class Value_Type, Mutex_Type Mutex, class Observer>
|
||||
auto Latest_Real_Time_Data<Value_Type, Mutex, Observer>::render_state_value() const noexcept
|
||||
-> const std::optional<Value>& {
|
||||
return *render_state_;
|
||||
}
|
||||
|
||||
template <class Value_Type, Mutex_Type Mutex, class Observer>
|
||||
Real_Time_Data_Retention Latest_Real_Time_Data<Value_Type, Mutex, Observer>::retention() const noexcept {
|
||||
return Real_Time_Data_Retention::latest;
|
||||
}
|
||||
template <class Value_Type, Mutex_Type Mutex, class Observer>
|
||||
std::size_t Latest_Real_Time_Data<Value_Type, Mutex, Observer>::discard_before_time_ns(std::uint64_t) {
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user