xref: /openbmc/telemetry/src/utils/circular_vector.hpp (revision daeddc7c5587933729a7a1e981b054c4c8be8069)
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