Skip to content

Commit 1655935

Browse files
committedAug 19, 2017
Optimize String::Builder#write_byte
1 parent 6278e34 commit 1655935

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed
 

‎spec/std/string_spec.cr

+11
Original file line numberDiff line numberDiff line change
@@ -2163,6 +2163,17 @@ describe "String" do
21632163
"fo\u{0000}".compare("FO", case_insensitive: true).should eq(1)
21642164
end
21652165

2166+
it "builds with write_byte" do
2167+
string = String.build do |io|
2168+
255_u8.times do |byte|
2169+
io.write_byte(byte)
2170+
end
2171+
end
2172+
255.times do |i|
2173+
string.byte_at(i).should eq(i)
2174+
end
2175+
end
2176+
21662177
it "raises if String.build negative capacity" do
21672178
expect_raises(ArgumentError, "Negative capacity") do
21682179
String.build(-1) { }

‎src/string/builder.cr

+13
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,19 @@ class String::Builder
5353
nil
5454
end
5555

56+
def write_byte(byte : UInt8)
57+
new_bytesize = real_bytesize + 1
58+
if new_bytesize > @capacity
59+
resize_to_capacity(Math.pw2ceil(new_bytesize))
60+
end
61+
62+
@buffer[real_bytesize] = byte
63+
64+
@bytesize += 1
65+
66+
nil
67+
end
68+
5669
def buffer
5770
@buffer + String::HEADER_SIZE
5871
end

0 commit comments

Comments
 (0)
Please sign in to comment.