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