From 6be25c8a0cfe28f032ce2b65f8cb07dd1a1ae148 Mon Sep 17 00:00:00 2001 From: Kevin Cantu Date: Sat, 4 Feb 2012 14:56:42 -0800 Subject: [PATCH] Adding str::reserve --- src/libcore/str.rs | 10 ++++++++++ src/rt/rust_builtin.cpp | 7 +++++++ src/rt/rustrt.def.in | 1 + 3 files changed, 18 insertions(+) diff --git a/src/libcore/str.rs b/src/libcore/str.rs index ecb9827b85e..618fa04a314 100644 --- a/src/libcore/str.rs +++ b/src/libcore/str.rs @@ -97,6 +97,7 @@ export as_buf, //buf, sbuf, + reserve, unsafe; @@ -105,6 +106,7 @@ export #[abi = "cdecl"] native mod rustrt { fn rust_str_push(&s: str, ch: u8); + fn str_reserve_shared(&ss: str, nn: ctypes::size_t); } // FIXME: add pure to a lot of functions @@ -755,6 +757,7 @@ Apply a function to each character */ fn map(ss: str, ff: fn(char) -> char) -> str { let result = ""; + reserve(result, byte_len(ss)); chars_iter(ss, {|cc| str::push_char(result, ff(cc)); @@ -1302,6 +1305,13 @@ An unsafe buffer of bytes. Corresponds to a C char pointer. */ type sbuf = *u8; +// Function: reserve +// +// Allocate more memory for a string, up to `nn` + 1 bytes +fn reserve(&ss: str, nn: uint) { + rustrt::str_reserve_shared(ss, nn); +} + // Module: unsafe // // These functions may create invalid UTF-8 strings and eat your baby. diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index 69bc88157f0..783ca43d862 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -105,6 +105,13 @@ vec_reserve_shared(type_desc* ty, rust_vec** vp, reserve_vec_exact(task, vp, n_elts * ty->size); } +extern "C" CDECL void +str_reserve_shared(rust_vec** sp, + size_t n_elts) { + rust_task *task = rust_task_thread::get_task(); + reserve_vec_exact(task, sp, n_elts + 1); +} + /** * Copies elements in an unsafe buffer to the given interior vector. The * vector must have size zero. diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in index da6026ebb23..48736ef029b 100644 --- a/src/rt/rustrt.def.in +++ b/src/rt/rustrt.def.in @@ -50,6 +50,7 @@ shape_log_str squareroot start_task vec_reserve_shared +str_reserve_shared vec_from_buf_shared unsupervise upcall_cmp_type