builtin: add .nogrow and .nofree flags to array (#16661)

This commit is contained in:
l-m 2022-12-14 18:44:14 +11:00 committed by GitHub
parent b07e447764
commit acbd93b54c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 0 deletions

View file

@ -1,57 +0,0 @@
fn show_array(name string, a []int) {
eprintln('${name:10} .flags: ${a.flags:34} | .cap: ${a.cap:2} | .len: ${a.len:2} | .data: ${a.data} | ${a}')
}
fn trace_delete_elements(name string, mut a []int) int {
a.delete_many(5, 3)
show_array(name, a)
a << 55
show_array(name, a)
a << 66
show_array(name, a)
a << 77
res := a.cap
eprintln(' << ${name:10} .cap: ${a.cap} >>')
show_array(name, a)
a << 88
show_array(name, a)
a << 99
show_array(name, a)
eprintln('-------------------------------')
return res
}
fn test_array_cap_shrinkage_after_deletion() {
mut a := [0]
mut middle_cap := 0
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
middle_cap = trace_delete_elements('normal', mut a)
assert middle_cap == 14
assert a.len == 12
assert a.cap == 14
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
unsafe { a.flags.set(.noslices) }
middle_cap = dump(trace_delete_elements('noslices', mut a))
assert middle_cap == 14
assert a.len == 12
assert a.cap == 14
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
unsafe { a.flags.set(.noshrink) }
middle_cap = dump(trace_delete_elements('noshrink', mut a))
assert middle_cap == 14
assert a.len == 12
assert a.cap == 14
// Note: when *both* flags are set, the memory block for the array
// should NOT shrink on deleting array elements, thus << after the
// deletion, will still have space (till .cap is reached).
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
unsafe { a.flags.set(.noslices | .noshrink) }
middle_cap = dump(trace_delete_elements('both', mut a))
assert middle_cap == 10
assert a.len == 12
assert a.cap == 20
}