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 { 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