1#include "barretenberg/common/assert.hpp"
4#include <initializer_list>
19template <
typename T, std::
size_t N>
class RefArray {
21 RefArray(
const std::array<T*, N>& ptr_array)
24 for (T& elem : ptr_array) {
28 template <
typename... Ts>
RefArray(T& ref, Ts&... rest)
32 ((storage[i++] = &rest), ...);
35 T& operator[](std::size_t idx)
const
58 T& operator*()
const {
return (*array)[pos]; }
60 iterator& operator++()
73 bool operator==(iterator
const& other)
const {
return pos == other.pos; }
74 bool operator!=(iterator
const& other)
const {
return pos != other.pos; }
81 constexpr std::size_t size()
const {
return N; }
105template <
typename T,
typename... Ts>
RefArray(T&, Ts&...) ->
RefArray<T, 1 +
sizeof...(Ts)>;
118template <
typename T, std::size_t... Ns>
RefArray<T, (Ns + ...)> concatenate(
const RefArray<T, Ns>&... ref_arrays)
121 constexpr std::size_t TotalSize = (Ns + ...);
122 std::array<T*, TotalSize> concatenated;
124 std::size_t offset = 0;
126 auto copy_into = [&](
const auto& ref_array, std::size_t& offset) {
127 for (std::size_t i = 0; i < ref_array.size(); ++i) {
128 concatenated[offset + i] = &ref_array[i];
130 offset += ref_array.size();
134 (..., copy_into(ref_arrays, offset));
Nested iterator class for RefArray, based on indexing into the pointer array. Provides semantics simi...
Definition: ref_array.hpp:45
iterator(RefArray const *array, std::size_t pos)
Constructs an iterator for a given RefArray object.
Definition: ref_array.hpp:53
A template class for a reference array. Behaves as if std::array<T&, N> was possible.
Definition: ref_array.hpp:19
iterator begin() const
Returns an iterator to the beginning of the RefArray.
Definition: ref_array.hpp:87
iterator end() const
Returns an iterator to the end of the RefArray.
Definition: ref_array.hpp:93