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 // Note: making this a constructor gives problems in prover_instance.cpp.
54 static RefVector from_span(const std::span<T>& span)
55 {
56 RefVector ret;
57 for (std::size_t i = 0; i < span.size(); ++i) {
58 ret.push_back(span[i]);
59 }
60 return ret;
61 }
62
63 T& operator[](std::size_t idx) const
64 {
65 ASSERT_DEBUG(idx < storage.size());
66 return *storage[idx];
67 }
68
73 class iterator {
74 public:
85
86 T& operator*() const { return (*vector)[pos]; }
87
89 {
90 pos++;
91 return *this;
92 }
93
95 {
96 iterator temp = *this;
97 ++(*this);
98 return temp;
99 }
100
101 bool operator==(iterator const& other) const { return pos == other.pos; }
102 bool operator!=(iterator const& other) const { return pos != other.pos; }
103
104 private:
107 };
108
109 std::size_t size() const { return storage.size(); }
110
111 void push_back(T& element) { storage.push_back(&element); }
112 iterator begin() const { return iterator(this, 0); }
113 iterator end() const { return iterator(this, storage.size()); }
114
115 template <typename ConvertibleFromT> operator std::vector<ConvertibleFromT>() const
116 {
117 std::vector<ConvertibleFromT> ret;
118 for (T* elem : storage) {
119 ret.push_back(*elem);
120 }
121 return ret;
122 }
123
124 std::vector<T*>& get_storage() { return storage; }
125 const std::vector<T*>& get_storage() const { return storage; }
126
127 private:
128 std::vector<T*> storage;
129};
130
135template <typename T, typename... Ts> RefVector(T&, Ts&...) -> RefVector<T>;
136
147template <typename T> RefVector<T> concatenate(const RefVector<T>& ref_vector, const auto&... ref_vectors)
148{
149 RefVector<T> concatenated;
150 // Reserve our final space
151 concatenated.get_storage().reserve(ref_vector.size() + (ref_vectors.size() + ...));
152
153 auto append = [&](const auto& vec) {
154 std::copy(vec.get_storage().begin(), vec.get_storage().end(), std::back_inserter(concatenated.get_storage()));
155 };
156
157 append(ref_vector);
158 // Unpack and append each RefVector's elements to concatenated
159 (append(ref_vectors), ...);
160
161 return concatenated;
162}
163
164/* @details Ensures a nested vector holds reference objects */
165template <typename T> static std::vector<RefVector<T>> to_vector_of_ref_vectors(std::vector<std::vector<T>>& vec)
166{
168 for (std::vector<T>& inner : vec) {
169 result.push_back(RefVector{ inner });
170 }
171 return result;
172}
173} // namespace bb
#define ASSERT_DEBUG(expression,...)
Definition assert.hpp:54
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
static RefVector from_span(const std::span< T > &span)
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