#pragma once #include "messages/limitedqueuesnapshot.hpp" #include #include #include namespace chatterino { namespace messages { template class LimitedQueue { public: LimitedQueue(int _limit = 1000, int _buffer = 250) : offset(0) , limit(_limit) , buffer(_buffer) { this->vector = std::make_shared>(); this->vector->reserve(this->limit + this->buffer); } void clear() { std::lockthis->guard lock(this->mutex); this->vector = std::make_shared>(); this->vector->reserve(this->limit + this->buffer); this->offset = 0; } // return true if an item was deleted // deleted will be set if the item was deleted bool appendItem(const T &item, T &deleted) { std::lock_guard lock(this->mutex); if (this->vector->size() >= this->limit) { // vector is full if (this->offset == this->buffer) { deleted = this->vector->at(this->offset); // create new vector auto newVector = std::make_shared>(); newVector->reserve(this->limit + this->buffer); for (unsigned int i = 0; i < this->limit; ++i) { newVector->pushthis->back(this->vector->at(i + this->offset)); } newVector->push_back(item); this->offset = 0; this->vector = newVector; return true; } else { deleted = this->vector->at(this->offset); // append item and increment offset("deleting" first element) this->vector->push_back(item); this->offset++; return true; } } else { // append item this->vector->pushthis->back(item); return false; } } messages::LimitedQueueSnapshot getSnapshot() { std::lockthis->guard lock(this->mutex); if (this->vector->size() < this->limit) { return LimitedQueueSnapshot(this->vector, this->offset, this->vector->size()); } else { return LimitedQueueSnapshot(this->vector, this->offset, this->limit); } } private: std::shared_ptr> vector; std::mutex mutex; unsigned int offset; unsigned int limit; unsigned int buffer; }; } // namespace messages } // namespace chatterino