22 throw std::invalid_argument(
"Capacity must be positive");
37 throw std::runtime_error(
"Buffer is empty");
58 std::vector<T> result;
59 result.reserve(
size_);
60 size_t current =
head_;
61 for (
size_t i = 0; i <
size_; ++i) {
62 result.push_back(
buffer_[current]);
70template <
typename T,
typename Compare = std::less<T>>
78 size_t parent = (index - 1) / 2;
90 size_t largest = index;
91 size_t left = 2 * index + 1;
92 size_t right = 2 * index + 2;
101 if (largest == index) {
112 heap_.push_back(item);
118 throw std::runtime_error(
"Queue is empty");
129 return heap_.empty();
147 throw std::invalid_argument(
"Window size must be positive");
162 throw std::runtime_error(
"Window is empty");
184 std::shared_ptr<ChunkNode<T>>
next;
185 std::shared_ptr<ChunkNode<T>>
prev;
194 std::shared_ptr<ChunkNode<T>>
head_;
195 std::shared_ptr<ChunkNode<T>>
tail_;
200 auto new_node = std::make_shared<ChunkNode<T>>(chunk_data);
204 new_node->prev =
tail_;
205 tail_->next = new_node;
212 auto new_node = std::make_shared<ChunkNode<T>>(chunk_data);
216 new_node->next =
head_;
217 head_->prev = new_node;
224 std::vector<T> result;
225 auto current =
head_;
227 result.insert(result.end(), current->data.begin(), current->data.end());
228 current = current->next;
std::shared_ptr< ChunkNode< T > > tail_
std::vector< T > flatten() const
std::shared_ptr< ChunkNode< T > > head_
void prepend_chunk(const std::vector< T > &chunk_data)
void append_chunk(const std::vector< T > &chunk_data)
std::vector< T > to_vector() const
CircularBuffer(size_t capacity)
void heapify_down(size_t index)
void heapify_up(size_t index)
void push(const T &value)
const std::deque< T > & window() const
SlidingWindow(size_t size)
ChunkNode(const std::vector< T > &chunk_data)
std::shared_ptr< ChunkNode< T > > next
std::shared_ptr< ChunkNode< T > > prev