diff options
| author | Simon Sapin <simon.sapin@exyr.org> | 2019-07-08 18:08:54 +0200 |
|---|---|---|
| committer | Simon Sapin <simon.sapin@exyr.org> | 2019-07-09 11:45:46 +0200 |
| commit | b62a77b4905150b14c8b0fd6e685f528e4f90ea7 (patch) | |
| tree | 88c53ac0e37edab1f065310f98bc8b5a45974483 /src/liballoc/slice.rs | |
| parent | 283f6762caebb723a17ce82e1fc120928697cfb9 (diff) | |
| download | rust-b62a77b4905150b14c8b0fd6e685f528e4f90ea7.tar.gz rust-b62a77b4905150b14c8b0fd6e685f528e4f90ea7.zip | |
Add joining slices of slices with a slice separator, not just a single item
Diffstat (limited to 'src/liballoc/slice.rs')
| -rw-r--r-- | src/liballoc/slice.rs | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/liballoc/slice.rs b/src/liballoc/slice.rs index 1b18dbeda9c..d475c628ff1 100644 --- a/src/liballoc/slice.rs +++ b/src/liballoc/slice.rs @@ -508,6 +508,7 @@ impl<T> [T] { /// ``` /// assert_eq!(["hello", "world"].join(" "), "hello world"); /// assert_eq!([[1, 2], [3, 4]].join(&0), [1, 2, 0, 3, 4]); + /// assert_eq!([[1, 2], [3, 4]].join(&[0, 0][..]), [1, 2, 0, 0, 3, 4]); /// ``` #[stable(feature = "rename_connect_to_join", since = "1.3.0")] pub fn join<Separator>(&self, sep: Separator) -> <Self as Join<Separator>>::Output @@ -654,7 +655,7 @@ impl<T: Clone, V: Borrow<[T]>> Join<&'_ T> for [V] { Some(first) => first, None => return vec![], }; - let size = slice.iter().map(|slice| slice.borrow().len()).sum::<usize>() + slice.len() - 1; + let size = slice.iter().map(|v| v.borrow().len()).sum::<usize>() + slice.len() - 1; let mut result = Vec::with_capacity(size); result.extend_from_slice(first.borrow()); @@ -666,6 +667,29 @@ impl<T: Clone, V: Borrow<[T]>> Join<&'_ T> for [V] { } } +#[unstable(feature = "slice_concat_ext", issue = "27747")] +impl<T: Clone, V: Borrow<[T]>> Join<&'_ [T]> for [V] { + type Output = Vec<T>; + + fn join(slice: &Self, sep: &[T]) -> Vec<T> { + let mut iter = slice.iter(); + let first = match iter.next() { + Some(first) => first, + None => return vec![], + }; + let size = slice.iter().map(|v| v.borrow().len()).sum::<usize>() + + sep.len() * (slice.len() - 1); + let mut result = Vec::with_capacity(size); + result.extend_from_slice(first.borrow()); + + for v in iter { + result.extend_from_slice(sep); + result.extend_from_slice(v.borrow()) + } + result + } +} + //////////////////////////////////////////////////////////////////////////////// // Standard trait implementations for slices //////////////////////////////////////////////////////////////////////////////// |
