#[inline]
#[stable = "function just renamed from push_char"]
pub fn push(&mut self, ch: char) {
- let cur_len = self.len();
- // This may use up to 4 bytes.
- self.vec.reserve(4);
-
- unsafe {
- // Attempt to not use an intermediate buffer by just pushing bytes
- // directly onto this string.
- let slice = RawSlice {
- data: self.vec.as_ptr().offset(cur_len as int),
- len: 4,
- };
- let used = ch.encode_utf8(mem::transmute(slice)).unwrap_or(0);
- self.vec.set_len(cur_len + used);
- }
- }
-
- #[inline]
- fn push_with_ascii_fast_path(&mut self, ch: char) {
if (ch as u32) < 0x80 {
self.vec.push(ch as u8);
return;
});
}
- #[bench]
- fn bench_push_char_one_byte_with_fast_path(b: &mut Bencher) {
- b.bytes = REPETITIONS;
- b.iter(|| {
- let mut r = String::new();
- for _ in range(0, REPETITIONS) {
- r.push_with_ascii_fast_path('a')
- }
- });
- }
-
#[bench]
fn bench_push_char_two_bytes(b: &mut Bencher) {
b.bytes = REPETITIONS * 2;
});
}
- #[bench]
- fn bench_push_char_two_bytes_with_slow_path(b: &mut Bencher) {
- b.bytes = REPETITIONS * 2;
- b.iter(|| {
- let mut r = String::new();
- for _ in range(0, REPETITIONS) {
- r.push_with_ascii_fast_path('รข')
- }
- });
- }
-
#[bench]
fn from_utf8_lossy_100_ascii(b: &mut Bencher) {
let s = b"Hello there, the quick brown fox jumped over the lazy dog! \