Skip to content

Commit 45b0b9a

Browse files
committed
perf(buffer): skip unnecessary capacity check
1 parent 04776c4 commit 45b0b9a

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

buffer/buffer.mbt

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -163,27 +163,40 @@ pub fn new(size_hint~ : Int = 0) -> T {
163163
}
164164
165165
///| Create a buffer from a bytes.
166-
pub fn T::from_bytes(bytes : Bytes) -> T {
167-
let buf = T::new(size_hint=bytes.length())
168-
buf.write_bytes(bytes)
166+
pub fn from_bytes(bytes : Bytes) -> T {
167+
let val_len = bytes.length()
168+
let buf = new(size_hint=val_len)
169+
// inline write_bytes, skip grow_if_necessary check
170+
// SAFETY: known bytes size
171+
buf.data.blit_from_bytes(0, bytes, 0, val_len)
172+
buf.len = val_len
169173
buf
170174
}
171175
172176
///|
173177
/// Create a buffer from an array.
174-
pub fn T::from_array(arr : Array[Byte]) -> T {
175-
let buf = T::new(size_hint=arr.length())
178+
pub fn from_array(arr : Array[Byte]) -> T {
179+
let buf = new(size_hint=arr.length())
176180
for byte in arr {
177-
buf.write_byte(byte)
181+
// inline write_byte, skip grow_if_necessary check
182+
// SAFETY: known array size
183+
buf.data[buf.len] = byte
184+
buf.len += 1
178185
}
179186
buf
180187
}
181188
182189
///|
183-
/// Create a buffer from an array.
184-
pub fn T::from_iter(iter : Iter[Byte]) -> T {
185-
let arr = iter.collect()
186-
T::from_array(arr)
190+
/// Create a buffer from an iterator.
191+
pub fn from_iter(iter : Iter[Byte]) -> T {
192+
let buf = new(size_hint=iter.count())
193+
for byte in iter {
194+
// inline write_byte, skip grow_if_necessary check
195+
// SAFETY: known iter size
196+
buf.data[buf.len] = byte
197+
buf.len += 1
198+
}
199+
buf
187200
}
188201
189202
///|

0 commit comments

Comments
 (0)