Files
Renderive/Core/architecture/Timeline_Stream.h
T
2026-08-02 12:15:48 +08:00

45 lines
1.4 KiB
C++

#pragma once
#include <atomic>
#include <cstdint>
#include <deque>
#include <memory>
#include <mutex>
#include <vector>
#include "../base/Time_Of_Day.h"
#include "global.h"
namespace renderive {
struct Timeline_Label_Tick {
Time_Of_Day time;
int coordinate{};
};
struct LIB_DECL Timeline_Stream_Snapshot {
std::uint64_t version{};
bool newest_at_axis_start = false; // 当前 true 时 代表最新时间映射到起始坐标
int coordinate_begin{};
int visible_time_point_count = 1;
int first_stream_tick{};
int last_stream_tick = -1;
std::vector<Time_Of_Day> times;
std::vector<Timeline_Label_Tick> ticks;
[[nodiscard]] int coordinate_end() const;
[[nodiscard]] bool coord_by_stream_tick(int stream_tick, int& coord) const;
[[nodiscard]] Time_Of_Day time_by_tick(int tick) const;
};
class LIB_DECL Timeline_Stream {
public:
Timeline_Stream();
int append_time(Time_Of_Day time);
[[nodiscard]] Timeline_Stream_Snapshot capture(int time_point_size, int label_tick_interval, bool start_coord_to_end_coord) const;
private:
struct Sample {
int stream_tick{};
Time_Of_Day time;
};
static constexpr std::size_t Max_Buffered_Time_Count = 65536;
mutable std::mutex samples_mutex;
std::deque<Sample> samples;
std::atomic<std::uint64_t> version_value{0};
std::atomic<int> next_tick_value{0};
};
}