Skip to content

Commit d15e265

Browse files
authored
Auto merge of #34771 - murarth:string-insert-str, r=alexcrichton
Add method `String::insert_str`
2 parents 0d75975 + 0bcf64c commit d15e265

File tree

1 file changed

+53
-9
lines changed

1 file changed

+53
-9
lines changed

src/libcollections/string.rs

+53-9
Original file line numberDiff line numberDiff line change
@@ -1132,18 +1132,62 @@ impl String {
11321132
assert!(idx <= len);
11331133
assert!(self.is_char_boundary(idx));
11341134
let bits = ch.encode_utf8();
1135-
let bits = bits.as_slice();
1136-
let amt = bits.len();
1135+
1136+
unsafe {
1137+
self.insert_bytes(idx, bits.as_slice());
1138+
}
1139+
}
1140+
1141+
unsafe fn insert_bytes(&mut self, idx: usize, bytes: &[u8]) {
1142+
let len = self.len();
1143+
let amt = bytes.len();
11371144
self.vec.reserve(amt);
11381145

1146+
ptr::copy(self.vec.as_ptr().offset(idx as isize),
1147+
self.vec.as_mut_ptr().offset((idx + amt) as isize),
1148+
len - idx);
1149+
ptr::copy(bytes.as_ptr(),
1150+
self.vec.as_mut_ptr().offset(idx as isize),
1151+
amt);
1152+
self.vec.set_len(len + amt);
1153+
}
1154+
1155+
/// Inserts a string into this `String` at a byte position.
1156+
///
1157+
/// This is an `O(n)` operation as it requires copying every element in the
1158+
/// buffer.
1159+
///
1160+
/// # Panics
1161+
///
1162+
/// Panics if `idx` is larger than the `String`'s length, or if it does not
1163+
/// lie on a [`char`] boundary.
1164+
///
1165+
/// [`char`]: ../../std/primitive.char.html
1166+
///
1167+
/// # Examples
1168+
///
1169+
/// Basic usage:
1170+
///
1171+
/// ```
1172+
/// #![feature(insert_str)]
1173+
///
1174+
/// let mut s = String::from("bar");
1175+
///
1176+
/// s.insert_str(0, "foo");
1177+
///
1178+
/// assert_eq!("foobar", s);
1179+
/// ```
1180+
#[inline]
1181+
#[unstable(feature = "insert_str",
1182+
reason = "recent addition",
1183+
issue = "0")]
1184+
pub fn insert_str(&mut self, idx: usize, string: &str) {
1185+
let len = self.len();
1186+
assert!(idx <= len);
1187+
assert!(self.is_char_boundary(idx));
1188+
11391189
unsafe {
1140-
ptr::copy(self.vec.as_ptr().offset(idx as isize),
1141-
self.vec.as_mut_ptr().offset((idx + amt) as isize),
1142-
len - idx);
1143-
ptr::copy(bits.as_ptr(),
1144-
self.vec.as_mut_ptr().offset(idx as isize),
1145-
amt);
1146-
self.vec.set_len(len + amt);
1190+
self.insert_bytes(idx, string.as_bytes());
11471191
}
11481192
}
11491193

0 commit comments

Comments
 (0)