Skip to content

Commit 1e569bf

Browse files
authored
Merge a329123 into 3c3ed1e
2 parents 3c3ed1e + a329123 commit 1e569bf

File tree

23 files changed

+234
-105
lines changed

23 files changed

+234
-105
lines changed

docs/docs/noir/concepts/data_types/arrays.md

+5-3
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,9 @@ fn main() {
128128

129129
### sort_via
130130

131-
Sorts the array with a custom comparison function
131+
Sorts the array with a custom comparison function. The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.
132+
133+
Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.
132134

133135
```rust
134136
fn sort_via(self, ordering: fn(T, T) -> bool) -> [T; N]
@@ -139,10 +141,10 @@ example
139141
```rust
140142
fn main() {
141143
let arr = [42, 32]
142-
let sorted_ascending = arr.sort_via(|a, b| a < b);
144+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
143145
assert(sorted_ascending == [32, 42]); // verifies
144146

145-
let sorted_descending = arr.sort_via(|a, b| a > b);
147+
let sorted_descending = arr.sort_via(|a, b| a >= b);
146148
assert(sorted_descending == [32, 42]); // does not verify
147149
}
148150
```

docs/versioned_docs/version-v0.17.0/language_concepts/data_types/04_arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ example
130130
```rust
131131
fn main() {
132132
let arr = [42, 32]
133-
let sorted_ascending = arr.sort_via(|a, b| a < b);
133+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
134134
assert(sorted_ascending == [32, 42]); // verifies
135135

136-
let sorted_descending = arr.sort_via(|a, b| a > b);
136+
let sorted_descending = arr.sort_via(|a, b| a >= b);
137137
assert(sorted_descending == [32, 42]); // does not verify
138138
}
139139
```

docs/versioned_docs/version-v0.19.0/language_concepts/data_types/04_arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ example
130130
```rust
131131
fn main() {
132132
let arr = [42, 32]
133-
let sorted_ascending = arr.sort_via(|a, b| a < b);
133+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
134134
assert(sorted_ascending == [32, 42]); // verifies
135135

136-
let sorted_descending = arr.sort_via(|a, b| a > b);
136+
let sorted_descending = arr.sort_via(|a, b| a >= b);
137137
assert(sorted_descending == [32, 42]); // does not verify
138138
}
139139
```

docs/versioned_docs/version-v0.19.1/language_concepts/data_types/04_arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ example
130130
```rust
131131
fn main() {
132132
let arr = [42, 32]
133-
let sorted_ascending = arr.sort_via(|a, b| a < b);
133+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
134134
assert(sorted_ascending == [32, 42]); // verifies
135135

136-
let sorted_descending = arr.sort_via(|a, b| a > b);
136+
let sorted_descending = arr.sort_via(|a, b| a >= b);
137137
assert(sorted_descending == [32, 42]); // does not verify
138138
}
139139
```

docs/versioned_docs/version-v0.19.2/language_concepts/data_types/04_arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ example
130130
```rust
131131
fn main() {
132132
let arr = [42, 32]
133-
let sorted_ascending = arr.sort_via(|a, b| a < b);
133+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
134134
assert(sorted_ascending == [32, 42]); // verifies
135135

136-
let sorted_descending = arr.sort_via(|a, b| a > b);
136+
let sorted_descending = arr.sort_via(|a, b| a >= b);
137137
assert(sorted_descending == [32, 42]); // does not verify
138138
}
139139
```

docs/versioned_docs/version-v0.19.3/language_concepts/data_types/04_arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ example
130130
```rust
131131
fn main() {
132132
let arr = [42, 32]
133-
let sorted_ascending = arr.sort_via(|a, b| a < b);
133+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
134134
assert(sorted_ascending == [32, 42]); // verifies
135135

136-
let sorted_descending = arr.sort_via(|a, b| a > b);
136+
let sorted_descending = arr.sort_via(|a, b| a >= b);
137137
assert(sorted_descending == [32, 42]); // does not verify
138138
}
139139
```

docs/versioned_docs/version-v0.19.4/language_concepts/data_types/04_arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ example
130130
```rust
131131
fn main() {
132132
let arr = [42, 32]
133-
let sorted_ascending = arr.sort_via(|a, b| a < b);
133+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
134134
assert(sorted_ascending == [32, 42]); // verifies
135135

136-
let sorted_descending = arr.sort_via(|a, b| a > b);
136+
let sorted_descending = arr.sort_via(|a, b| a >= b);
137137
assert(sorted_descending == [32, 42]); // does not verify
138138
}
139139
```

docs/versioned_docs/version-v0.22.0/noir/syntax/data_types/arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,10 @@ example
131131
```rust
132132
fn main() {
133133
let arr = [42, 32]
134-
let sorted_ascending = arr.sort_via(|a, b| a < b);
134+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
135135
assert(sorted_ascending == [32, 42]); // verifies
136136

137-
let sorted_descending = arr.sort_via(|a, b| a > b);
137+
let sorted_descending = arr.sort_via(|a, b| a >= b);
138138
assert(sorted_descending == [32, 42]); // does not verify
139139
}
140140
```

docs/versioned_docs/version-v0.23.0/noir/concepts/data_types/arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,10 @@ example
137137
```rust
138138
fn main() {
139139
let arr = [42, 32]
140-
let sorted_ascending = arr.sort_via(|a, b| a < b);
140+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
141141
assert(sorted_ascending == [32, 42]); // verifies
142142

143-
let sorted_descending = arr.sort_via(|a, b| a > b);
143+
let sorted_descending = arr.sort_via(|a, b| a >= b);
144144
assert(sorted_descending == [32, 42]); // does not verify
145145
}
146146
```

docs/versioned_docs/version-v0.24.0/noir/concepts/data_types/arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ example
139139
```rust
140140
fn main() {
141141
let arr = [42, 32]
142-
let sorted_ascending = arr.sort_via(|a, b| a < b);
142+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
143143
assert(sorted_ascending == [32, 42]); // verifies
144144

145-
let sorted_descending = arr.sort_via(|a, b| a > b);
145+
let sorted_descending = arr.sort_via(|a, b| a >= b);
146146
assert(sorted_descending == [32, 42]); // does not verify
147147
}
148148
```

docs/versioned_docs/version-v0.25.0/noir/concepts/data_types/arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ example
139139
```rust
140140
fn main() {
141141
let arr = [42, 32]
142-
let sorted_ascending = arr.sort_via(|a, b| a < b);
142+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
143143
assert(sorted_ascending == [32, 42]); // verifies
144144

145-
let sorted_descending = arr.sort_via(|a, b| a > b);
145+
let sorted_descending = arr.sort_via(|a, b| a >= b);
146146
assert(sorted_descending == [32, 42]); // does not verify
147147
}
148148
```

docs/versioned_docs/version-v0.26.0/noir/concepts/data_types/arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ example
139139
```rust
140140
fn main() {
141141
let arr = [42, 32]
142-
let sorted_ascending = arr.sort_via(|a, b| a < b);
142+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
143143
assert(sorted_ascending == [32, 42]); // verifies
144144

145-
let sorted_descending = arr.sort_via(|a, b| a > b);
145+
let sorted_descending = arr.sort_via(|a, b| a >= b);
146146
assert(sorted_descending == [32, 42]); // does not verify
147147
}
148148
```

docs/versioned_docs/version-v0.27.0/noir/concepts/data_types/arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ example
139139
```rust
140140
fn main() {
141141
let arr = [42, 32]
142-
let sorted_ascending = arr.sort_via(|a, b| a < b);
142+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
143143
assert(sorted_ascending == [32, 42]); // verifies
144144

145-
let sorted_descending = arr.sort_via(|a, b| a > b);
145+
let sorted_descending = arr.sort_via(|a, b| a >= b);
146146
assert(sorted_descending == [32, 42]); // does not verify
147147
}
148148
```

docs/versioned_docs/version-v0.28.0/noir/concepts/data_types/arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ example
139139
```rust
140140
fn main() {
141141
let arr = [42, 32]
142-
let sorted_ascending = arr.sort_via(|a, b| a < b);
142+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
143143
assert(sorted_ascending == [32, 42]); // verifies
144144

145-
let sorted_descending = arr.sort_via(|a, b| a > b);
145+
let sorted_descending = arr.sort_via(|a, b| a >= b);
146146
assert(sorted_descending == [32, 42]); // does not verify
147147
}
148148
```

docs/versioned_docs/version-v0.29.0/noir/concepts/data_types/arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ example
139139
```rust
140140
fn main() {
141141
let arr = [42, 32]
142-
let sorted_ascending = arr.sort_via(|a, b| a < b);
142+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
143143
assert(sorted_ascending == [32, 42]); // verifies
144144

145-
let sorted_descending = arr.sort_via(|a, b| a > b);
145+
let sorted_descending = arr.sort_via(|a, b| a >= b);
146146
assert(sorted_descending == [32, 42]); // does not verify
147147
}
148148
```

docs/versioned_docs/version-v0.30.0/noir/concepts/data_types/arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ example
139139
```rust
140140
fn main() {
141141
let arr = [42, 32]
142-
let sorted_ascending = arr.sort_via(|a, b| a < b);
142+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
143143
assert(sorted_ascending == [32, 42]); // verifies
144144

145-
let sorted_descending = arr.sort_via(|a, b| a > b);
145+
let sorted_descending = arr.sort_via(|a, b| a >= b);
146146
assert(sorted_descending == [32, 42]); // does not verify
147147
}
148148
```

docs/versioned_docs/version-v0.31.0/noir/concepts/data_types/arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ example
139139
```rust
140140
fn main() {
141141
let arr = [42, 32]
142-
let sorted_ascending = arr.sort_via(|a, b| a < b);
142+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
143143
assert(sorted_ascending == [32, 42]); // verifies
144144

145-
let sorted_descending = arr.sort_via(|a, b| a > b);
145+
let sorted_descending = arr.sort_via(|a, b| a >= b);
146146
assert(sorted_descending == [32, 42]); // does not verify
147147
}
148148
```

docs/versioned_docs/version-v0.32.0/noir/concepts/data_types/arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ example
139139
```rust
140140
fn main() {
141141
let arr = [42, 32]
142-
let sorted_ascending = arr.sort_via(|a, b| a < b);
142+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
143143
assert(sorted_ascending == [32, 42]); // verifies
144144

145-
let sorted_descending = arr.sort_via(|a, b| a > b);
145+
let sorted_descending = arr.sort_via(|a, b| a >= b);
146146
assert(sorted_descending == [32, 42]); // does not verify
147147
}
148148
```

docs/versioned_docs/version-v0.33.0/noir/concepts/data_types/arrays.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ example
139139
```rust
140140
fn main() {
141141
let arr = [42, 32]
142-
let sorted_ascending = arr.sort_via(|a, b| a < b);
142+
let sorted_ascending = arr.sort_via(|a, b| a <= b);
143143
assert(sorted_ascending == [32, 42]); // verifies
144144

145-
let sorted_descending = arr.sort_via(|a, b| a > b);
145+
let sorted_descending = arr.sort_via(|a, b| a >= b);
146146
assert(sorted_descending == [32, 42]); // does not verify
147147
}
148148
```
+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
use crate::cmp::Eq;
2+
3+
unconstrained fn __get_shuffle_indices<T, let N: u32>(lhs: [T; N], rhs: [T; N]) -> [Field; N] where T: Eq {
4+
let mut shuffle_indices: [Field;N ] = [0; N];
5+
6+
let mut shuffle_mask: [bool; N] = [false; N];
7+
for i in 0..N {
8+
let mut found = false;
9+
for j in 0..N {
10+
if ((shuffle_mask[j] == false) & (!found)) {
11+
if (lhs[i] == rhs[j]) {
12+
found = true;
13+
shuffle_indices[i] = j as Field;
14+
shuffle_mask[j] = true;
15+
}
16+
}
17+
if (found) {
18+
continue;
19+
}
20+
}
21+
assert(found == true, "check_shuffle, lhs and rhs arrays do not contain equivalent values");
22+
}
23+
24+
shuffle_indices
25+
}
26+
27+
unconstrained fn __get_index<let N: u32>(indices: [Field; N], idx: Field) -> Field {
28+
let mut result = 0;
29+
for i in 0..N {
30+
if (indices[i] == idx) {
31+
result = i as Field;
32+
break;
33+
}
34+
}
35+
result
36+
}
37+
38+
pub(crate) fn check_shuffle<T, let N: u32>(lhs: [T; N], rhs: [T; N]) where T: Eq {
39+
unsafe {
40+
let shuffle_indices = __get_shuffle_indices(lhs, rhs);
41+
42+
for i in 0..N {
43+
let idx = __get_index(shuffle_indices, i as Field);
44+
assert_eq(shuffle_indices[idx], i as Field);
45+
}
46+
for i in 0..N {
47+
let idx = shuffle_indices[i];
48+
let expected = rhs[idx];
49+
let result = lhs[i];
50+
assert_eq(expected, result);
51+
}
52+
}
53+
}
54+
55+
mod test {
56+
use super::check_shuffle;
57+
use crate::cmp::Eq;
58+
59+
struct CompoundStruct {
60+
a: bool,
61+
b: Field,
62+
c: u64
63+
}
64+
impl Eq for CompoundStruct {
65+
fn eq(self, other: Self) -> bool {
66+
(self.a == other.a) & (self.b == other.b) & (self.c == other.c)
67+
}
68+
}
69+
70+
#[test]
71+
fn test_shuffle() {
72+
let lhs: [Field; 5] = [0, 1, 2, 3, 4];
73+
let rhs: [Field; 5] = [2, 0, 3, 1, 4];
74+
check_shuffle(lhs, rhs);
75+
}
76+
77+
#[test]
78+
fn test_shuffle_identity() {
79+
let lhs: [Field; 5] = [0, 1, 2, 3, 4];
80+
let rhs: [Field; 5] = [0, 1, 2, 3, 4];
81+
check_shuffle(lhs, rhs);
82+
}
83+
84+
#[test(should_fail_with = "check_shuffle, lhs and rhs arrays do not contain equivalent values")]
85+
fn test_shuffle_fail() {
86+
let lhs: [Field; 5] = [0, 1, 2, 3, 4];
87+
let rhs: [Field; 5] = [0, 1, 2, 3, 5];
88+
check_shuffle(lhs, rhs);
89+
}
90+
91+
#[test(should_fail_with = "check_shuffle, lhs and rhs arrays do not contain equivalent values")]
92+
fn test_shuffle_duplicates() {
93+
let lhs: [Field; 5] = [0, 1, 2, 3, 4];
94+
let rhs: [Field; 5] = [0, 1, 2, 3, 3];
95+
check_shuffle(lhs, rhs);
96+
}
97+
98+
#[test]
99+
fn test_shuffle_compound_struct() {
100+
let lhs: [CompoundStruct; 5] = [
101+
CompoundStruct { a: false, b: 0, c: 12345 },
102+
CompoundStruct { a: false, b: -100, c: 54321 },
103+
CompoundStruct { a: true, b: 5, c: 0xffffffffffffffff },
104+
CompoundStruct { a: true, b: 9814, c: 0xeeffee0011001133 },
105+
CompoundStruct { a: false, b: 0x155, c: 0 }
106+
];
107+
let rhs: [CompoundStruct; 5] = [
108+
CompoundStruct { a: false, b: 0x155, c: 0 },
109+
CompoundStruct { a: false, b: 0, c: 12345 },
110+
CompoundStruct { a: false, b: -100, c: 54321 },
111+
CompoundStruct { a: true, b: 9814, c: 0xeeffee0011001133 },
112+
CompoundStruct { a: true, b: 5, c: 0xffffffffffffffff }
113+
];
114+
check_shuffle(lhs, rhs);
115+
}
116+
}

0 commit comments

Comments
 (0)