// SampleBuffer.h
|
#pragma once
|
#include "../core/DataTypes.h"
|
#include <deque>
|
#include <vector>
|
#include <shared_mutex>
|
#include <chrono>
|
|
enum class RetainMode {
|
ByCount, // °´Ñù±¾ÊýÉÏÏÞ
|
ByRollingAge, // °´¹ö¶¯Ê±¼ä´°¿Ú£¨maxAge£©
|
ByAbsoluteRange // °´¾ø¶Ôʱ¼ä¶Î [absFrom, absTo]
|
};
|
|
struct RetentionPolicy {
|
RetainMode mode = RetainMode::ByCount;
|
size_t maxSamples = 100000; // ByCount ÓÃ
|
std::chrono::milliseconds maxAge{ std::chrono::hours(1) }; // ByRollingAge ÓÃ
|
int64_t absFrom = 0; // ByAbsoluteRange ÓÃ
|
int64_t absTo = 0; // ByAbsoluteRange Óã¨absTo>=absFrom ÓÐЧ£©
|
};
|
|
class SampleBuffer {
|
public:
|
explicit SampleBuffer(RetentionPolicy policy = {}) : policy_(policy) {}
|
|
// д£º°´Ê±¼ä´ÁµÝÔöÍÆÈ루ÂÒÐò»á±»¼òµ¥¾ÀÕýΪ·ÇµÝ¼õ£©
|
void push(int64_t ts_ms, double v);
|
|
// ¶Á£º°´¡°tsExclusive Ö®ºó¡±µÄÐÂÊý¾Ý
|
std::vector<Sample> getSince(int64_t tsExclusive, size_t maxCount = 4096) const;
|
|
// ¶Á£º°´Çø¼ä [from, to]£¨°üº¬±ß½ç£©
|
std::vector<Sample> getRange(int64_t from_ts, int64_t to_ts, size_t maxCount = 4096) const;
|
|
// ²éѯ / ά»¤
|
size_t size() const;
|
bool empty() const;
|
int64_t latestTs() const;
|
void clear();
|
|
// ÅäÖÃ
|
void setPolicy(const RetentionPolicy& p);
|
RetentionPolicy getPolicy() const;
|
|
int64_t earliestTs() const; // ÎÞÊý¾Ýʱ·µ»Ø 0
|
|
private:
|
void pruneUnlocked(int64_t ref_now_ms); // °´²ßÂÔÇåÀí
|
size_t lowerBoundIndex(int64_t tsExclusive) const; // ¶þ·Ö£ºµÚÒ»¸ö > tsExclusive
|
size_t lowerBoundInclusive(int64_t tsInclusive) const; // µÚÒ»¸ö >= tsInclusive
|
size_t upperBoundInclusive(int64_t tsInclusive) const; // ×îºóÒ»¸ö <= tsInclusive µÄÏÂÒ»¸öλÖÃ
|
|
mutable std::shared_mutex mtx_;
|
std::deque<Sample> data_;
|
RetentionPolicy policy_;
|
};
|