Ring buffer: Add a std::initializer_list constructor

pull/590/head
Jonathan G Rennison 11 months ago
parent 73d7052732
commit 21adf399c0

@ -201,20 +201,26 @@ public:
ring_buffer() = default; ring_buffer() = default;
ring_buffer(const ring_buffer &other) template <typename U>
void construct_from(const U &other)
{ {
if (!other.empty()) { uint32 cap = round_up_size((uint32)other.size());
uint32 cap = round_up_size(other.count);
this->data.reset(MallocT<byte>(cap * sizeof(T))); this->data.reset(MallocT<byte>(cap * sizeof(T)));
this->mask = cap - 1; this->mask = cap - 1;
this->head = 0; this->head = 0;
this->count = other.size(); this->count = (uint32)other.size();
byte *ptr = this->data.get(); byte *ptr = this->data.get();
for (const T &item : other) { for (const T &item : other) {
new (ptr) T(item); new (ptr) T(item);
ptr += sizeof(T); ptr += sizeof(T);
} }
} }
ring_buffer(const ring_buffer &other)
{
if (!other.empty()) {
this->construct_from(other);
}
} }
ring_buffer(ring_buffer &&other) ring_buffer(ring_buffer &&other)
@ -225,6 +231,13 @@ public:
std::swap(this->mask, other.mask); std::swap(this->mask, other.mask);
} }
ring_buffer(std::initializer_list<T> init)
{
if (init.size() > 0) {
this->construct_from(init);
}
}
ring_buffer& operator =(const ring_buffer &other) ring_buffer& operator =(const ring_buffer &other)
{ {
if (&other != this) { if (&other != this) {

Loading…
Cancel
Save