Skip to content

Commit

Permalink
feat: simplify BoundedVec::eq (#4838)
Browse files Browse the repository at this point in the history
# Description

## Problem\*

Resolves <!-- Link to GitHub Issue -->

## Summary\*

This PR follows up on #4830 to simplify the implementation based on
discussion in that PR.

## Additional Context



## Documentation\*

Check one:
- [x] No documentation needed.
- [ ] Documentation included in this PR.
- [ ] **[For Experimental Features]** Documentation to be submitted in a
separate PR.

# PR Checklist\*

- [x] I have tested the changes locally.
- [x] I have formatted the changes with [Prettier](https://prettier.io/)
and/or `cargo fmt` on default settings.
  • Loading branch information
TomAFrench authored Apr 18, 2024
1 parent 5992436 commit 3d33a33
Showing 1 changed file with 6 additions and 31 deletions.
37 changes: 6 additions & 31 deletions noir_stdlib/src/collections/bounded_vec.nr
Original file line number Diff line number Diff line change
Expand Up @@ -98,15 +98,12 @@ impl<T, MaxLen> BoundedVec<T, MaxLen> {

impl<T, MaxLen> Eq for BoundedVec<T, MaxLen> where T: Eq {
fn eq(self, other: BoundedVec<T, MaxLen>) -> bool {
let mut ret = self.len == other.len;
let mut exceeded_len = false;
for i in 0..MaxLen {
exceeded_len |= i == self.len;
if !exceeded_len {
ret &= self.storage[i] == other.storage[i];
}
}
ret
// TODO: https://github.com/noir-lang/noir/issues/4837
//
// We make the assumption that the user has used the proper interface for working with `BoundedVec`s
// rather than directly manipulating the internal fields as this can result in an inconsistent internal state.

(self.len == other.len) & (self.storage == other.storage)
}
}

Expand All @@ -131,26 +128,4 @@ mod bounded_vec_tests {

assert(bounded_vec1 != bounded_vec2);
}

#[test]
fn equality_respects_specified_length() {
let mut bounded_vec1: BoundedVec<Field, 3> = BoundedVec::new();
bounded_vec1.push(1);

// This BoundedVec has an extra value past the end of its specified length,
// this should be ignored when checking equality so they are considered equal.
let mut bounded_vec2: BoundedVec<Field, 3> = BoundedVec { storage: [1, 2, 0], len: 1 };

assert_eq(bounded_vec1, bounded_vec2);

// Pushing another entry onto `bounded_vec1` to make the underlying arrays equal should
// result in the `BoundedVec`s being unequal as their lengths are different.
bounded_vec1.push(2);

assert(bounded_vec1 != bounded_vec2);

bounded_vec2.push(2);

assert_eq(bounded_vec1, bounded_vec2);
}
}

0 comments on commit 3d33a33

Please sign in to comment.