use slice::CloneSliceExt;
use str;
-use str::{CharRange, CowString, FromStr, StrAllocating, Owned};
+use str::{CharRange, CowString, FromStr, StrAllocating};
+use str::MaybeOwned::Owned;
use vec::{DerefVec, Vec, as_vec};
/// A growable string stored as a UTF-8 encoded buffer.
#[inline]
#[stable = "function just renamed from push_char"]
pub fn push(&mut self, ch: char) {
+ if (ch as u32) < 0x80 {
+ self.vec.push(ch as u8);
+ return;
+ }
+
let cur_len = self.len();
// This may use up to 4 bytes.
self.vec.reserve(4);
}
}
-#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
-impl<'a> Add<String, String> for &'a str {
- fn add(self, mut other: String) -> String {
- other.push_str(self);
- other
- }
-}
-
impl ops::Slice<uint, str> for String {
#[inline]
fn as_slice_<'a>(&'a self) -> &'a str {
});
}
+ const REPETITIONS: u64 = 10_000;
+
+ #[bench]
+ fn bench_push_str_one_byte(b: &mut Bencher) {
+ b.bytes = REPETITIONS;
+ b.iter(|| {
+ let mut r = String::new();
+ for _ in range(0, REPETITIONS) {
+ r.push_str("a")
+ }
+ });
+ }
+
+ #[bench]
+ fn bench_push_char_one_byte(b: &mut Bencher) {
+ b.bytes = REPETITIONS;
+ b.iter(|| {
+ let mut r = String::new();
+ for _ in range(0, REPETITIONS) {
+ r.push('a')
+ }
+ });
+ }
+
+ #[bench]
+ fn bench_push_char_two_bytes(b: &mut Bencher) {
+ b.bytes = REPETITIONS * 2;
+ b.iter(|| {
+ let mut r = String::new();
+ for _ in range(0, REPETITIONS) {
+ r.push('รข')
+ }
+ });
+ }
+
#[bench]
fn from_utf8_lossy_100_ascii(b: &mut Bencher) {
let s = b"Hello there, the quick brown fox jumped over the lazy dog! \