6 #ifndef XENIUM_FIXED_SIZE_CIRCULAR_ARRAY_HPP
7 #define XENIUM_FIXED_SIZE_CIRCULAR_ARRAY_HPP
13 namespace xenium::detail {
14 template <
class T, std::
size_t Capacity>
15 struct fixed_size_circular_array {
16 [[nodiscard]] std::size_t capacity()
const {
return Capacity; }
18 T* get(std::size_t idx, std::memory_order order) {
return _items[idx & mask].load(order); }
20 void put(std::size_t idx, T* value, std::memory_order order) { _items[idx & mask].store(value, order); }
22 [[nodiscard]] constexpr
bool can_grow()
const {
return false; }
24 void grow(std::size_t, std::size_t) {
throw std::runtime_error(
"cannot grow fixed_size_circular_array"); }
27 static constexpr std::size_t mask = Capacity - 1;
28 static_assert((Capacity & mask) == 0,
"capacity has to be a power of two");
30 std::atomic<T*> _items[Capacity];