xenium
Loading...
Searching...
No Matches
fixed_size_circular_array.hpp
1//
2// Copyright (c) 2018-2020 Manuel Pöter.
3// Licensed under the MIT License. See LICENSE file in the project root for full license information.
4//
5
6#ifndef XENIUM_FIXED_SIZE_CIRCULAR_ARRAY_HPP
7#define XENIUM_FIXED_SIZE_CIRCULAR_ARRAY_HPP
8
9#include <atomic>
10#include <cstdint>
11#include <stdexcept>
12
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; }
17
18 T* get(std::size_t idx, std::memory_order order) {
19 return items[idx & mask].load(order);
20 }
21
22 void put(std::size_t idx, T* value, std::memory_order order) {
23 items[idx & mask].store(value, order);
24 }
25
26 constexpr bool can_grow() const { return false; }
27
28 void grow(std::size_t, std::size_t) {
29 throw std::runtime_error("cannot grow fixed_size_circular_array");
30 }
31 private:
32 static constexpr std::size_t mask = Capacity - 1;
33 static_assert((Capacity & mask) == 0, "capacity has to be a power of two");
34
35 std::atomic<T*> items[Capacity];
36 };
37}}
38#endif