strings: add Bulder.write_decimal/1 method (write a decimal number, without additional allocations) (#19625)

This commit is contained in:
Delyan Angelov 2023-10-22 23:46:25 +03:00 committed by GitHub
parent 39310a2177
commit af7a2135b7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 1 deletions

View File

@ -74,7 +74,34 @@ pub fn (mut b Builder) write_byte(data byte) {
b << data
}
// write implements the Writer interface
// write_decimal appends a decimal representation of the number `n` into the builder `b`,
// without dynamic allocation. The higher order digits come first, i.e. 6123 will be written
// with the digit `6` first, then `1`, then `2` and `3` last.
[direct_array_access]
pub fn (mut b Builder) write_decimal(n i64) {
if n == 0 {
b.write_u8(0x30)
return
}
mut buf := [25]u8{}
mut x := if n < 0 { -n } else { n }
mut i := 24
for x != 0 {
nextx := x / 10
r := x % 10
buf[i] = u8(r) + 0x30
x = nextx
i--
}
if n < 0 {
buf[i] = `-`
i--
}
unsafe { b.write_ptr(&buf[i + 1], 24 - i) }
}
// write implements the io.Writer interface, that is why it
// it returns how many bytes were written to the string builder.
pub fn (mut b Builder) write(data []u8) !int {
if data.len == 0 {
return 0

View File

@ -144,3 +144,25 @@ fn test_drain_builder() {
assert target_sb.len == 3
assert target_sb.str() == 'abc'
}
[manualfree]
fn sb_i64_str(n i64) string {
mut sb := strings.new_builder(24)
defer {
unsafe { sb.free() }
}
sb.write_decimal(n)
return sb.str()
}
fn test_write_decimal() {
assert sb_i64_str(0) == '0'
assert sb_i64_str(1) == '1'
assert sb_i64_str(-1) == '-1'
assert sb_i64_str(1001) == '1001'
assert sb_i64_str(-1001) == '-1001'
assert sb_i64_str(1234567890) == '1234567890'
assert sb_i64_str(-1234567890) == '-1234567890'
assert sb_i64_str(9223372036854775807) == '9223372036854775807'
assert sb_i64_str(-9223372036854775807) == '-9223372036854775807'
}