45 lines
1.4 KiB
C++
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};
|
|
};
|
|
}
|