| /* | |
| * Copyright 2022 Rive | |
| */ | |
| #pragma once | |
| namespace rive::pls | |
| { | |
| // Fast, simple queue that does not make intermediate memory allocations. The capacity is set during | |
| // resizeAndRewind(), and push_back() may only be called up to "m_capacity" times before the queue | |
| // must be rewound again. | |
| template <typename T> class FixedQueue | |
| { | |
| public: | |
| void resizeAndRewind(size_t newCapacity) | |
| { | |
| if (newCapacity != m_capacity) | |
| { | |
| delete[] m_data; | |
| m_data = new T[newCapacity]; | |
| m_capacity = newCapacity; | |
| } | |
| rewind(); | |
| } | |
| void rewind() { m_front = m_end = m_data; } | |
| size_t capacity() const { return m_capacity; } | |
| T& push_back() | |
| { | |
| assert(m_end < m_data + m_capacity); | |
| return *m_end++; | |
| } | |
| T& push_back(const T& t) { return push_back() = t; } | |
| T* push_back_n(size_t n) | |
| { | |
| assert(m_end + n <= m_data + m_capacity); | |
| T* ptr = m_end; | |
| m_end += n; | |
| return ptr; | |
| } | |
| const T& pop_front() | |
| { | |
| assert(m_front < m_end); | |
| return *m_front++; | |
| } | |
| const T* pop_front_n(size_t n) | |
| { | |
| assert(m_front + n <= m_end); | |
| const T* ptr = m_front; | |
| m_front += n; | |
| return ptr; | |
| } | |
| private: | |
| size_t m_capacity = 0; | |
| T* m_data = nullptr; | |
| T* m_front = nullptr; | |
| T* m_end = nullptr; | |
| }; | |
| } // namespace rive::pls |