2022-03-25 00:37:13 +03:00
|
|
|
fn show_array(name string, a []int) {
|
2022-11-15 16:53:13 +03:00
|
|
|
eprintln('${name:10} .flags: ${a.flags:34} | .cap: ${a.cap:2} | .len: ${a.len:2} | .data: ${a.data} | ${a}')
|
2022-03-25 00:37:13 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
2022-11-15 16:53:13 +03:00
|
|
|
eprintln(' << ${name:10} .cap: ${a.cap} >>')
|
2022-03-25 00:37:13 +03:00
|
|
|
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
|
|
|
|
}
|
2022-12-14 10:44:14 +03:00
|
|
|
|
|
|
|
fn fixed_array_on_the_heap(len int, size int) []u8 {
|
|
|
|
data := vcalloc(size)
|
|
|
|
println(ptr_str(data))
|
|
|
|
return unsafe {
|
|
|
|
array{
|
|
|
|
element_size: 1
|
|
|
|
len: len
|
|
|
|
cap: size
|
|
|
|
data: data
|
|
|
|
flags: .noshrink | .nogrow | .nofree
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_array_fixed_growth() {
|
|
|
|
mut x := fixed_array_on_the_heap(0, 10)
|
|
|
|
println(ptr_str(x.data))
|
|
|
|
x << 5
|
|
|
|
x << 10
|
|
|
|
x << 15
|
|
|
|
x << 20
|
|
|
|
dump(x)
|
|
|
|
dump(x.flags)
|
|
|
|
assert x[2] == 15
|
|
|
|
assert x.flags == .noshrink | .nogrow | .nofree
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_array_fixed() {
|
|
|
|
mut x := fixed_array_on_the_heap(10, 10)
|
|
|
|
println(ptr_str(x.data))
|
|
|
|
x[2] = 5
|
|
|
|
dump(x)
|
|
|
|
dump(x.flags)
|
|
|
|
assert x[2] == 5
|
|
|
|
assert x.flags == .noshrink | .nogrow | .nofree
|
|
|
|
}
|