strings: add a `Builder.ensure_cap()` method (#13755)
parent
136f39a2d4
commit
8a2d3f6470
|
@ -176,6 +176,28 @@ pub fn (mut b Builder) str() string {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ensure_cap ensures that the buffer has enough space for at least `n` bytes by growing the buffer if necessary
|
||||||
|
pub fn (mut b Builder) ensure_cap(n int) {
|
||||||
|
// code adapted from vlib/builtin/array.v
|
||||||
|
if n <= b.cap {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
new_data := vcalloc(n * b.element_size)
|
||||||
|
if b.data != voidptr(0) {
|
||||||
|
unsafe { vmemcpy(new_data, b.data, b.len * b.element_size) }
|
||||||
|
// TODO: the old data may be leaked when no GC is used (ref-counting?)
|
||||||
|
if b.flags.has(.noslices) {
|
||||||
|
unsafe { free(b.data) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unsafe {
|
||||||
|
b.data = new_data
|
||||||
|
b.offset = 0
|
||||||
|
b.cap = n
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// free is for manually freeing the contents of the buffer
|
// free is for manually freeing the contents of the buffer
|
||||||
[unsafe]
|
[unsafe]
|
||||||
pub fn (mut b Builder) free() {
|
pub fn (mut b Builder) free() {
|
||||||
|
|
|
@ -112,3 +112,18 @@ fn test_write_runes() {
|
||||||
x := sb.str()
|
x := sb.str()
|
||||||
assert x == 'hello world'
|
assert x == 'hello world'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_ensure_cap() {
|
||||||
|
mut sb := strings.new_builder(0)
|
||||||
|
assert sb.cap == 0
|
||||||
|
sb.ensure_cap(10)
|
||||||
|
assert sb.cap == 10
|
||||||
|
sb.ensure_cap(10)
|
||||||
|
assert sb.cap == 10
|
||||||
|
sb.ensure_cap(15)
|
||||||
|
assert sb.cap == 15
|
||||||
|
sb.ensure_cap(10)
|
||||||
|
assert sb.cap == 15
|
||||||
|
sb.ensure_cap(-1)
|
||||||
|
assert sb.cap == 15
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue