blob: f5e283c34e4a1fb38f868d10ac2cffb890067303 [file] [log] [blame]
#include <cstddef>
#include <vector>
template <class T>
class CircularVector
{
public:
explicit CircularVector(std::vector<T>& externalVec, size_t maxSizeIn) :
vec(externalVec), maxSize(maxSizeIn)
{}
template <class... Args>
void emplace(Args&&... args)
{
if (maxSize == 0)
{
return;
}
if (vec.size() == maxSize)
{
vec.at(idx) = T(std::forward<Args>(args)...);
}
else
{
vec.emplace_back(std::forward<Args>(args)...);
}
idx = (idx + 1) == maxSize ? 0 : (idx + 1);
}
void clear()
{
vec.clear();
idx = 0;
}
void clearAndResize(size_t newMaxSize)
{
clear();
maxSize = newMaxSize;
}
bool isFull() const
{
return vec.size() == maxSize;
}
typename std::vector<T>::const_iterator begin() const
{
return vec.begin();
}
typename std::vector<T>::const_iterator end() const
{
return vec.end();
}
size_t size() const
{
return maxSize;
}
private:
std::vector<T>& vec;
size_t maxSize = 0;
size_t idx = 0;
};