Skip to content

Commit

Permalink
Auto merge of #38056 - clarcharr:master, r=alexcrichton
Browse files Browse the repository at this point in the history
Add String::split_off.

This seems to match up with the latest version of the collection reform, and seems useful enough to add. First pull request!
  • Loading branch information
bors committed Dec 3, 2016
2 parents 08faff4 + cbf734f commit 24175e8
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 0 deletions.
33 changes: 33 additions & 0 deletions src/libcollections/string.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1260,6 +1260,39 @@ impl String {
self.len() == 0
}

/// Divide one string into two at an index.
///
/// The argument, `mid`, should be a byte offset from the start of the string. It must also
/// be on the boundary of a UTF-8 code point.
///
/// The two strings returned go from the start of the string to `mid`, and from `mid` to the end
/// of the string.
///
/// # Panics
///
/// Panics if `mid` is not on a `UTF-8` code point boundary, or if it is beyond the last
/// code point of the string.
///
/// # Examples
///
/// ```
/// # #![feature(string_split_off)]
/// # fn main() {
/// let mut hello = String::from("Hello, World!");
/// let world = hello.split_off(7);
/// assert_eq!(hello, "Hello, ");
/// assert_eq!(world, "World!");
/// # }
/// ```
#[inline]
#[unstable(feature = "string_split_off", issue = "38080")]
pub fn split_off(&mut self, mid: usize) -> String {
assert!(self.is_char_boundary(mid));
assert!(mid <= self.len());
let other = self.vec.split_off(mid);
unsafe { String::from_utf8_unchecked(other) }
}

/// Truncates this `String`, removing all contents.
///
/// While this means the `String` will have a length of zero, it does not
Expand Down
1 change: 1 addition & 0 deletions src/libcollectionstest/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#![feature(step_by)]
#![feature(str_escape)]
#![feature(str_replacen)]
#![feature(string_split_off)]
#![feature(test)]
#![feature(unboxed_closures)]
#![feature(unicode)]
Expand Down
39 changes: 39 additions & 0 deletions src/libcollectionstest/string.rs
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,45 @@ fn test_pop() {
assert_eq!(data, "ประเทศไทย中");
}

#[test]
fn test_split_off_empty() {
let orig = "Hello, world!";
let mut split = String::from(orig);
let empty: String = split.split_off(orig.len());
assert!(empty.is_empty());
}

#[test]
#[should_panic]
fn test_split_off_past_end() {
let orig = "Hello, world!";
let mut split = String::from(orig);
split.split_off(orig.len() + 1);
}

#[test]
#[should_panic]
fn test_split_off_mid_char() {
let mut orig = String::from("山");
orig.split_off(1);
}

#[test]
fn test_split_off_ascii() {
let mut ab = String::from("ABCD");
let cd = ab.split_off(2);
assert_eq!(ab, "AB");
assert_eq!(cd, "CD");
}

#[test]
fn test_split_off_unicode() {
let mut nihon = String::from("日本語");
let go = nihon.split_off("日本".len());
assert_eq!(nihon, "日本");
assert_eq!(go, "語");
}

#[test]
fn test_str_truncate() {
let mut s = String::from("12345");
Expand Down

0 comments on commit 24175e8

Please sign in to comment.