about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2015-06-15 19:24:52 +0200
committerSimon Sapin <simon.sapin@exyr.org>2015-07-13 16:21:43 +0200
commit7469914e96a511487e8248d2f8a583befb02149f (patch)
tree3f3b92e8940ad8690a72bb6c9149e79e9bf70b94 /src/libcore
parentf9005512a9d84f469b30f0d469ccc401607ce64c (diff)
downloadrust-7469914e96a511487e8248d2f8a583befb02149f.tar.gz
rust-7469914e96a511487e8248d2f8a583befb02149f.zip
Add str::split_at_mut
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/str/mod.rs15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/libcore/str/mod.rs b/src/libcore/str/mod.rs
index c8237720b0e..7e4c2ba3be8 100644
--- a/src/libcore/str/mod.rs
+++ b/src/libcore/str/mod.rs
@@ -1279,6 +1279,7 @@ pub trait StrExt {
         where P::Searcher: ReverseSearcher<'a>;
     fn find_str<'a, P: Pattern<'a>>(&'a self, pat: P) -> Option<usize>;
     fn split_at(&self, mid: usize) -> (&str, &str);
+    fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str);
     fn slice_shift_char<'a>(&'a self) -> Option<(char, &'a str)>;
     fn subslice_offset(&self, inner: &str) -> usize;
     fn as_ptr(&self) -> *const u8;
@@ -1591,6 +1592,20 @@ impl StrExt for str {
         }
     }
 
+    fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str) {
+        // is_char_boundary checks that the index is in [0, .len()]
+        if self.is_char_boundary(mid) {
+            let len = self.len();
+            unsafe {
+                let self2: &mut str = mem::transmute_copy(&self);
+                (self.slice_mut_unchecked(0, mid),
+                 self2.slice_mut_unchecked(mid, len))
+            }
+        } else {
+            slice_error_fail(self, 0, mid)
+        }
+    }
+
     #[inline]
     fn slice_shift_char(&self) -> Option<(char, &str)> {
         if self.is_empty() {