1*daeddc7cSSzymon Dompke #include <cstddef> 23eb56865SSzymon Dompke #include <vector> 33eb56865SSzymon Dompke 43eb56865SSzymon Dompke template <class T> 53eb56865SSzymon Dompke class CircularVector 63eb56865SSzymon Dompke { 73eb56865SSzymon Dompke public: CircularVector(std::vector<T> & externalVec,size_t maxSizeIn)8493e62ebSKrzysztof Grobelny explicit CircularVector(std::vector<T>& externalVec, size_t maxSizeIn) : 9493e62ebSKrzysztof Grobelny vec(externalVec), maxSize(maxSizeIn) 103eb56865SSzymon Dompke {} 113eb56865SSzymon Dompke 123eb56865SSzymon Dompke template <class... Args> emplace(Args &&...args)133eb56865SSzymon Dompke void emplace(Args&&... args) 143eb56865SSzymon Dompke { 153eb56865SSzymon Dompke if (maxSize == 0) 163eb56865SSzymon Dompke { 173eb56865SSzymon Dompke return; 183eb56865SSzymon Dompke } 193eb56865SSzymon Dompke if (vec.size() == maxSize) 203eb56865SSzymon Dompke { 213eb56865SSzymon Dompke vec.at(idx) = T(std::forward<Args>(args)...); 223eb56865SSzymon Dompke } 233eb56865SSzymon Dompke else 243eb56865SSzymon Dompke { 253eb56865SSzymon Dompke vec.emplace_back(std::forward<Args>(args)...); 263eb56865SSzymon Dompke } 273eb56865SSzymon Dompke idx = (idx + 1) == maxSize ? 0 : (idx + 1); 283eb56865SSzymon Dompke } 293eb56865SSzymon Dompke clear()303eb56865SSzymon Dompke void clear() 313eb56865SSzymon Dompke { 323eb56865SSzymon Dompke vec.clear(); 333eb56865SSzymon Dompke idx = 0; 343eb56865SSzymon Dompke } 353eb56865SSzymon Dompke clearAndResize(size_t newMaxSize)363eb56865SSzymon Dompke void clearAndResize(size_t newMaxSize) 373eb56865SSzymon Dompke { 383eb56865SSzymon Dompke clear(); 393eb56865SSzymon Dompke maxSize = newMaxSize; 403eb56865SSzymon Dompke } 413eb56865SSzymon Dompke isFull() const423eb56865SSzymon Dompke bool isFull() const 433eb56865SSzymon Dompke { 443eb56865SSzymon Dompke return vec.size() == maxSize; 453eb56865SSzymon Dompke } 463eb56865SSzymon Dompke begin() const473eb56865SSzymon Dompke typename std::vector<T>::const_iterator begin() const 483eb56865SSzymon Dompke { 493eb56865SSzymon Dompke return vec.begin(); 503eb56865SSzymon Dompke } 513eb56865SSzymon Dompke end() const523eb56865SSzymon Dompke typename std::vector<T>::const_iterator end() const 533eb56865SSzymon Dompke { 543eb56865SSzymon Dompke return vec.end(); 553eb56865SSzymon Dompke } 563eb56865SSzymon Dompke size() const57a8182bebSKrzysztof Grobelny size_t size() const 58a8182bebSKrzysztof Grobelny { 59a8182bebSKrzysztof Grobelny return maxSize; 60a8182bebSKrzysztof Grobelny } 61a8182bebSKrzysztof Grobelny 623eb56865SSzymon Dompke private: 63493e62ebSKrzysztof Grobelny std::vector<T>& vec; 643eb56865SSzymon Dompke size_t maxSize = 0; 653eb56865SSzymon Dompke size_t idx = 0; 663eb56865SSzymon Dompke }; 67