#pragma once #include #include #include #include #include #include "tools/replay/route.h" constexpr int MIN_SEGMENTS_CACHE = 5; using SegmentMap = std::map>; class SegmentManager { public: struct EventData { std::vector events; // Events extracted from the segments SegmentMap segments; // Associated segments that contributed to these events bool isSegmentLoaded(int n) const { return segments.find(n) != segments.end(); } }; SegmentManager(const std::string &route_name, uint32_t flags, const std::string &data_dir = "") : flags_(flags), route_(route_name, data_dir), event_data_(std::make_shared()) {} ~SegmentManager(); bool load(); void setCurrentSegment(int seg_num); void setCallback(const std::function &callback) { onSegmentMergedCallback_ = callback; } void setFilters(const std::vector &filters) { filters_ = filters; } const std::shared_ptr getEventData() const { return std::atomic_load(&event_data_); } bool hasSegment(int n) const { return segments_.find(n) != segments_.end(); } Route route_; int segment_cache_limit_ = MIN_SEGMENTS_CACHE; private: void manageSegmentCache(); void loadSegmentsInRange(SegmentMap::iterator begin, SegmentMap::iterator cur, SegmentMap::iterator end); bool mergeSegments(const SegmentMap::iterator &begin, const SegmentMap::iterator &end); std::vector filters_; uint32_t flags_; std::mutex mutex_; std::condition_variable cv_; std::thread thread_; int cur_seg_num_ = -1; bool needs_update_ = false; bool exit_ = false; SegmentMap segments_; std::shared_ptr event_data_; std::function onSegmentMergedCallback_ = nullptr; std::set merged_segments_; };