Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ref_vector.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <initializer_list>
5#include <iterator>
6#include <stdexcept>
7#include <vector>
8
11
12namespace bb {
23template <typename T> class RefVector {
24 public:
25 RefVector() = default;
26 explicit RefVector(const std::vector<T*>& ptr_vector)
27 : storage(ptr_vector)
28 {}
29
30 explicit RefVector(std::vector<T>& vector)
31 : storage(vector.size())
32 {
33 for (size_t i = 0; i < vector.size(); i++) {
34 storage[i] = &vector[i];
35 }
36 }
37
38 template <typename... Ts>
39 RefVector(T& first, Ts&... refs)
40 : storage{ &first, &refs... }
41 {}
42
43 template <std::size_t N>
44 RefVector(const RefArray<T, N>& ref_array)
45 : storage(ref_array.size())
46 {
47 for (std::size_t i = 0; i < ref_array.size(); ++i) {
48 storage[i] = &ref_array[i];
49 }
50 }
51
52 T& operator[](std::size_t idx) const
53 {
54 BB_ASSERT_LT(idx, storage.size());
55 return *storage[idx];
56 }
57
62 class iterator {
63 public:
74
75 T& operator*() const { return (*vector)[pos]; }
76
78 {
79 pos++;
80 return *this;
81 }
82
84 {
85 iterator temp = *this;
86 ++(*this);
87 return temp;
88 }
89
90 bool operator==(iterator const& other) const { return pos == other.pos; }
91 bool operator!=(iterator const& other) const { return pos != other.pos; }
92
93 private:
96 };
97
98 std::size_t size() const { return storage.size(); }
99
100 void push_back(T& element) { storage.push_back(element); }
101 iterator begin() const { return iterator(this, 0); }
102 iterator end() const { return iterator(this, storage.size()); }
103
104 template <typename ConvertibleFromT> operator std::vector<ConvertibleFromT>() const
105 {
106 std::vector<ConvertibleFromT> ret;
107 for (T* elem : storage) {
108 ret.push_back(*elem);
109 }
110 return ret;
111 }
112
113 std::vector<T*>& get_storage() { return storage; }
114 const std::vector<T*>& get_storage() const { return storage; }
115
116 private:
117 std::vector<T*> storage;
118};
119
124template <typename T, typename... Ts> RefVector(T&, Ts&...) -> RefVector<T>;
125
136template <typename T> RefVector<T> concatenate(const RefVector<T>& ref_vector, const auto&... ref_vectors)
137{
138 RefVector<T> concatenated;
139 // Reserve our final space
140 concatenated.get_storage().reserve(ref_vector.size() + (ref_vectors.size() + ...));
141
142 auto append = [&](const auto& vec) {
143 std::copy(vec.get_storage().begin(), vec.get_storage().end(), std::back_inserter(concatenated.get_storage()));
144 };
145
146 append(ref_vector);
147 // Unpack and append each RefVector's elements to concatenated
148 (append(ref_vectors), ...);
149
150 return concatenated;
151}
152
153/* @details Ensures a nested vector holds reference objects */
154template <typename T> static std::vector<RefVector<T>> to_vector_of_ref_vectors(std::vector<std::vector<T>>& vec)
155{
157 for (std::vector<T>& inner : vec) {
158 result.push_back(RefVector{ inner });
159 }
160 return result;
161}
162} // namespace bb
#define BB_ASSERT_LT(left, right,...)
Definition assert.hpp:115
A template class for a reference array. Behaves as if std::array<T&, N> was possible.
Definition ref_array.hpp:22
constexpr std::size_t size() const
Nested iterator class for RefVector, based on indexing into the pointer vector. Provides semantics si...
iterator operator++(int)
iterator(RefVector const *vector, std::size_t pos)
Constructs an iterator for a given RefVector object.
RefVector const * vector
bool operator!=(iterator const &other) const
bool operator==(iterator const &other) const
A template class for a reference vector. Behaves as if std::vector<T&> was possible.
RefVector(const std::vector< T * > &ptr_vector)
std::size_t size() const
RefVector(T &first, Ts &... refs)
void push_back(T &element)
std::vector< T * > storage
RefVector(std::vector< T > &vector)
T & operator[](std::size_t idx) const
RefVector()=default
iterator begin() const
const std::vector< T * > & get_storage() const
RefVector(const RefArray< T, N > &ref_array)
iterator end() const
std::vector< T * > & get_storage()
Entry point for Barretenberg command-line interface.
RefArray< T,(Ns+...)> constexpr concatenate(const RefArray< T, Ns > &... ref_arrays)
Concatenates multiple RefArray objects into a single RefArray.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13