Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 42 additions & 13 deletions noir_stdlib/src/collections/bounded_vec.nr
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::{cmp::Eq, convert::From};
use crate::{cmp::Eq, convert::From, runtime::is_unconstrained};

/// A `BoundedVec<T, MaxLen>` is a growable storage similar to a `Vec<T>` except that it
/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented
Expand Down Expand Up @@ -320,12 +320,18 @@ impl<T, let MaxLen: u32> BoundedVec<T, MaxLen> {
let new_len = self.len + append_len;
assert(new_len <= MaxLen, "extend_from_bounded_vec out of bounds");

let mut exceeded_len = false;
for i in 0..Len {
exceeded_len |= i == append_len;
if !exceeded_len {
if is_unconstrained() {
for i in 0..append_len {
self.storage[self.len + i] = vec.get_unchecked(i);
}
} else {
let mut exceeded_len = false;
for i in 0..Len {
exceeded_len |= i == append_len;
if !exceeded_len {
self.storage[self.len + i] = vec.get_unchecked(i);
}
}
}
self.len = new_len;
}
Expand Down Expand Up @@ -389,12 +395,19 @@ impl<T, let MaxLen: u32> BoundedVec<T, MaxLen> {
/// ```
pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {
let mut ret = false;
let mut exceeded_len = false;
for i in 0..MaxLen {
exceeded_len |= i == self.len;
if !exceeded_len {
if is_unconstrained() {
for i in 0..self.len {
ret |= predicate(self.storage[i]);
}
} else {
let mut ret = false;
let mut exceeded_len = false;
for i in 0..MaxLen {
exceeded_len |= i == self.len;
if !exceeded_len {
ret |= predicate(self.storage[i]);
}
}
}
ret
}
Expand All @@ -413,11 +426,19 @@ impl<T, let MaxLen: u32> BoundedVec<T, MaxLen> {
pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> BoundedVec<U, MaxLen> {
let mut ret = BoundedVec::new();
ret.len = self.len();
for i in 0..MaxLen {
if i < self.len() {

if is_unconstrained() {
for i in 0..self.len() {
ret.storage[i] = f(self.get_unchecked(i));
}
} else {
for i in 0..MaxLen {
if i < self.len() {
ret.storage[i] = f(self.get_unchecked(i));
}
}
}

ret
}

Expand All @@ -437,11 +458,19 @@ impl<T, let MaxLen: u32> BoundedVec<T, MaxLen> {
pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {
assert(len <= MaxLen);
let zeroed = crate::mem::zeroed();
for i in 0..MaxLen {
if i >= len {

if is_unconstrained() {
for i in len..MaxLen {
array[i] = zeroed;
}
} else {
for i in 0..MaxLen {
if i >= len {
array[i] = zeroed;
}
}
}

BoundedVec { storage: array, len }
}

Expand Down
Loading