mirror of
https://github.com/vlang/v.git
synced 2025-09-15 07:22:27 +03:00
arrays: add reverse_iterator/1 + tests, allowing for for child in arrays.reverse_iterator(children) {
instead of explicit C for style loop; it also avoids allocations (#24755)
This commit is contained in:
parent
29188e9849
commit
f822792a10
2 changed files with 126 additions and 0 deletions
89
vlib/arrays/reverse_iterator_test.v
Normal file
89
vlib/arrays/reverse_iterator_test.v
Normal file
|
@ -0,0 +1,89 @@
|
|||
import arrays
|
||||
|
||||
struct Compound {
|
||||
mut:
|
||||
s string
|
||||
i int
|
||||
u u64
|
||||
m map[string]i16
|
||||
}
|
||||
|
||||
fn check[T](original []T) {
|
||||
mut result := []T{cap: original.len}
|
||||
for x in arrays.reverse_iterator(original) {
|
||||
result << x
|
||||
}
|
||||
assert result.len == original.len
|
||||
assert result.first() == original.last()
|
||||
assert result.reverse() == original
|
||||
eprintln('> original: ${original}')
|
||||
eprintln('> result: ${result}')
|
||||
}
|
||||
|
||||
fn test_reverse_iterator_basic() {
|
||||
check(['abc', 'def', 'ghi', 'jkl'])
|
||||
check([10, 20, 30, 40])
|
||||
check([
|
||||
Compound{'abc', 123, 444, {
|
||||
'aa': i16(12)
|
||||
'bb': 31
|
||||
}},
|
||||
Compound{'def', 456, 555, {
|
||||
'bb': i16(22)
|
||||
'cc': 32
|
||||
}},
|
||||
Compound{'xyz', 789, 666, {
|
||||
'cc': i16(32)
|
||||
'dd': 33
|
||||
}},
|
||||
])
|
||||
}
|
||||
|
||||
fn test_reverse_iterator_with_mut() {
|
||||
mut original := [10, 20]
|
||||
mut before := []int{cap: original.len}
|
||||
mut after := []int{cap: original.len}
|
||||
for mut x in arrays.reverse_iterator(original) {
|
||||
before << *x
|
||||
(**x)++
|
||||
after << *x
|
||||
}
|
||||
assert before == [20, 10]
|
||||
assert after == [21, 11]
|
||||
assert original == [11, 21]
|
||||
}
|
||||
|
||||
fn test_reverse_iterator_with_mut_compound() {
|
||||
mut original := [Compound{
|
||||
s: 'abc'
|
||||
i: 123
|
||||
}, Compound{
|
||||
s: 'xyz'
|
||||
i: 987
|
||||
}]
|
||||
mut before := []Compound{cap: original.len}
|
||||
mut after := []Compound{cap: original.len}
|
||||
for mut x in arrays.reverse_iterator(original) {
|
||||
before << *x
|
||||
x.i++
|
||||
x.s += ' tail'
|
||||
x.u = 99
|
||||
x.m['modified'] = 1
|
||||
after << *x
|
||||
}
|
||||
assert after[0] == Compound{
|
||||
s: 'xyz tail'
|
||||
i: 988
|
||||
u: 99
|
||||
m: {
|
||||
'modified': i16(1)
|
||||
}
|
||||
}
|
||||
assert before[0] == Compound{
|
||||
s: 'xyz'
|
||||
i: 987
|
||||
u: 0
|
||||
m: {}
|
||||
}
|
||||
assert after.reverse() == original
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue