// SampleBuffer.h #pragma once #include "../core/DataTypes.h" #include #include #include #include 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 getSince(int64_t tsExclusive, size_t maxCount = 4096) const; // ¶Á£º°´Çø¼ä [from, to]£¨°üº¬±ß½ç£© std::vector 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 data_; RetentionPolicy policy_; };