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 <span>
7#include <stdexcept>
8#include <vector>
9
12
13namespace bb {
24template <typename T> class RefVector {
25 public:
26 RefVector() = default;
27 explicit RefVector(const std::vector<T*>& ptr_vector)
28 : storage(ptr_vector)
29 {}
30
31 explicit RefVector(std::vector<T>& vector)
32 : storage(vector.size())
33 {
34 for (size_t i = 0; i < vector.size(); i++) {
35 storage[i] = &vector[i];
36 }
37 }
38
39 template <typename... Ts>
40 RefVector(T& first, Ts&... refs)
41 : storage{ &first, &refs... }
42 {}
43
44 template <std::size_t N>
45 RefVector(const RefArray<T, N>& ref_array)
46 : storage(ref_array.size())
47 {
48 for (std::size_t i = 0; i < ref_array.size(); ++i) {
49 storage[i] = &ref_array[i];
50 }
51 }
52
53 template <std::size_t N>
55 : storage(sp.size())
56 {
57 for (std::size_t i = 0; i < sp.size(); ++i) {
58 storage[i] = &sp[i];
59 }
60 }
61
62 // Note: making this a constructor gives problems in prover_instance.cpp.
63 static RefVector from_span(const std::span<T>& span)
64 {
65 RefVector ret;
66 ret.storage.reserve(span.size());
67 for (std::size_t i = 0; i < span.size(); ++i) {
68 ret.push_back(span[i]);
69 }
70 return ret;
71 }
72
73 T& operator[](std::size_t idx) const
74 {
75 BB_ASSERT_DEBUG(idx < storage.size());
76 return *storage[idx];
77 }
78
83 class iterator {
84 public:
95
96 T& operator*() const { return (*vector)[pos]; }
97
99 {
100 pos++;
101 return *this;
102 }
103
105 {
106 iterator temp = *this;
107 ++(*this);
108 return temp;
109 }
110
111 bool operator==(iterator const& other) const { return pos == other.pos; }
112 bool operator!=(iterator const& other) const { return pos != other.pos; }
113
114 private:
117 };
118
119 std::size_t size() const { return storage.size(); }
120
121 void push_back(T& element) { storage.push_back(&element); }
122 iterator begin() const { return iterator(this, 0); }
123 iterator end() const { return iterator(this, storage.size()); }
124
125 template <typename ConvertibleFromT> operator std::vector<ConvertibleFromT>() const
126 {
127 std::vector<ConvertibleFromT> ret;
128 ret.reserve(storage.size());
129 for (T* elem : storage) {
130 ret.push_back(*elem);
131 }
132 return ret;
133 }
134
135 std::vector<T*>& get_storage() { return storage; }
136 const std::vector<T*>& get_storage() const { return storage; }
137
138 private:
139 std::vector<T*> storage;
140};
141
146template <typename T, typename... Ts> RefVector(T&, Ts&...) -> RefVector<T>;
147
158template <typename T> RefVector<T> concatenate(const RefVector<T>& ref_vector, const auto&... ref_vectors)
159{
160 RefVector<T> concatenated;
161 // Reserve our final space
162 concatenated.get_storage().reserve(ref_vector.size() + (ref_vectors.size() + ...));
163
164 auto append = [&](const auto& vec) {
165 std::copy(vec.get_storage().begin(), vec.get_storage().end(), std::back_inserter(concatenated.get_storage()));
166 };
167
168 append(ref_vector);
169 // Unpack and append each RefVector's elements to concatenated
170 (append(ref_vectors), ...);
171
172 return concatenated;
173}
174
175/* @details Ensures a nested vector holds reference objects */
176template <typename T> static std::vector<RefVector<T>> to_vector_of_ref_vectors(std::vector<std::vector<T>>& vec)
177{
179 for (std::vector<T>& inner : vec) {
180 result.push_back(RefVector{ inner });
181 }
182 return result;
183}
184} // namespace bb
#define BB_ASSERT_DEBUG(expression,...)
Definition assert.hpp:55
A template class for a reference array. Behaves as if std::array<T&, N> was possible.
Definition ref_array.hpp:23
constexpr std::size_t size() const
Nested iterator class for RefVector, based on indexing into the pointer vector. Provides semantics si...
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
static RefVector from_span(const std::span< T > &span)
RefVector(std::vector< T > &vector)
RefVector(std::span< T, N > sp)
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.
Definition api.hpp:5
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
VectorField result