9#include "../bool/bool.hpp"
10#include "../circuit_builders/circuit_builders.hpp"
28template <
typename Builder>
31 , _max_size(maximum_size)
38 for (
size_t i = 0; i < maximum_size; ++i) {
49template <
typename Builder>
51 : _context(other._context)
52 , _max_size(other._max_size)
53 , _length(other._length)
54 , _inner_table(other._inner_table)
63template <
typename Builder>
65 : _context(other._context)
66 , _max_size(other._max_size)
67 , _length(other._length)
68 , _inner_table(other._inner_table)
97 _max_size = other._max_size;
98 _length = other._length;
99 _inner_table = other._inner_table;
123 for (
size_t i = 0; i < _max_size; ++i) {
128 field_pt index_delta = (new_length - i - 1);
132 field_pt reverse_delta = (-new_length + i);
148 field_pt index_delta = (_length - i - 1);
152 field_pt reverse_delta = (-_length + i);
159 field_pt old_value = _inner_table.read(i);
162 _inner_table.write(i, new_value);
165 _length = new_length;
177 const field_pt index_delta = (_length - index - 1);
182 _context->failure(
"DynamicArray::read access out of bounds");
185 _context->create_new_range_constraint(
189 return _inner_table.read(index);
201 const field_pt index_delta = (_length - index - 1);
206 _context->failure(
"DynamicArray::read access out of bounds");
209 _context->create_new_range_constraint(
213 _inner_table.write(index,
value);
224 if (native_size() >= _max_size) {
225 _context->failure(
"DynamicArray::push array is already at its maximum size");
228 _inner_table.write(_length,
value);
239 if (native_size() == 0) {
240 _context->failure(
"DynamicArray::pop array is already empty");
254template <
typename Builder>
257 if (native_size() >= _max_size) {
258 _context->failure(
"DynamicArray::push array is already at its maximum size");
261 _inner_table.write(_length,
value);
262 _length += predicate;
273 if (native_size() == 0) {
274 _context->failure(
"DynamicArray::pop array is already empty");
279 _length -= predicate;
#define BB_ASSERT_LTE(left, right,...)
#define ASSERT(expression,...)
A dynamic array of field elements.
DynamicArray(Builder *builder, const size_t maximum_size)
Construct a new Dynamic Array< Builder>:: Dynamic Array object.
void conditional_pop(const bool_pt &predicate)
Conditionallhy pop a field element off of the dynamic array.
ram_table< Builder > _inner_table
void write(const field_pt &index, const field_pt &value)
Write a field element into the dynamic array at an index value.
void resize(const field_pt &new_length, const field_pt default_value=0)
Resize array. Current method v. inefficient!
void push(const field_pt &index)
Push a field element onto the dynamic array.
field_pt read(const field_pt &index) const
Read a field element from the dynamic array at an index value.
void pop()
Pop a field element off of the dynamic array.
DynamicArray & operator=(const DynamicArray &other)
Assignment Operator.
void conditional_push(const bool_pt &predicate, const field_pt &index)
Conditionally push a field element onto the dynamic array.
Implements boolean logic in-circuit.
static field_t conditional_assign(const bool_t< Builder > &predicate, const field_t &lhs, const field_t &rhs)
If predicate == true then return lhs, else return rhs.
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
field_t normalize() const
Return a new element, where the in-circuit witness contains the actual represented value (multiplicat...
void assert_is_not_zero(std::string const &msg="field_t::assert_is_not_zero") const
Constrain *this to be non-zero by establishing that it has an inverse.
uint32_t get_witness_index() const
Get the witness index of the current field element.
Contains all the headers required to adequately compile the types defined in circuit_builders_fwd....
stdlib::witness_t< bb::UltraCircuitBuilder > witness_pt
stdlib::field_t< UltraCircuitBuilder > field_pt