xenium
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 
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; }
17 
18  T* get(std::size_t idx, std::memory_order order) { return _items[idx & mask].load(order); }
19 
20  void put(std::size_t idx, T* value, std::memory_order order) { _items[idx & mask].store(value, order); }
21 
22  [[nodiscard]] constexpr bool can_grow() const { return false; }
23 
24  void grow(std::size_t, std::size_t) { throw std::runtime_error("cannot grow fixed_size_circular_array"); }
25 
26 private:
27  static constexpr std::size_t mask = Capacity - 1;
28  static_assert((Capacity & mask) == 0, "capacity has to be a power of two");
29 
30  std::atomic<T*> _items[Capacity];
31 };
32 } // namespace xenium::detail
33 #endif