1 #include <vector>
2 
3 template <class T>
4 class CircularVector
5 {
6   public:
7     explicit CircularVector(size_t maxSizeIn) : maxSize(maxSizeIn)
8     {}
9 
10     template <class... Args>
11     void emplace(Args&&... args)
12     {
13         if (maxSize == 0)
14         {
15             return;
16         }
17         if (vec.size() == maxSize)
18         {
19             vec.at(idx) = T(std::forward<Args>(args)...);
20         }
21         else
22         {
23             vec.emplace_back(std::forward<Args>(args)...);
24         }
25         idx = (idx + 1) == maxSize ? 0 : (idx + 1);
26     }
27 
28     void clear()
29     {
30         vec.clear();
31         idx = 0;
32     }
33 
34     void clearAndResize(size_t newMaxSize)
35     {
36         clear();
37         maxSize = newMaxSize;
38     }
39 
40     bool isFull() const
41     {
42         return vec.size() == maxSize;
43     }
44 
45     typename std::vector<T>::const_iterator begin() const
46     {
47         return vec.begin();
48     }
49 
50     typename std::vector<T>::const_iterator end() const
51     {
52         return vec.end();
53     }
54 
55   private:
56     size_t maxSize = 0;
57     size_t idx = 0;
58     std::vector<T> vec;
59 };
60