Skip to content

Commit b62a77b

Browse files
committed
Add joining slices of slices with a slice separator, not just a single item
1 parent 283f676 commit b62a77b

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

src/liballoc/slice.rs

+25-1
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,7 @@ impl<T> [T] {
508508
/// ```
509509
/// assert_eq!(["hello", "world"].join(" "), "hello world");
510510
/// assert_eq!([[1, 2], [3, 4]].join(&0), [1, 2, 0, 3, 4]);
511+
/// assert_eq!([[1, 2], [3, 4]].join(&[0, 0][..]), [1, 2, 0, 0, 3, 4]);
511512
/// ```
512513
#[stable(feature = "rename_connect_to_join", since = "1.3.0")]
513514
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] {
654655
Some(first) => first,
655656
None => return vec![],
656657
};
657-
let size = slice.iter().map(|slice| slice.borrow().len()).sum::<usize>() + slice.len() - 1;
658+
let size = slice.iter().map(|v| v.borrow().len()).sum::<usize>() + slice.len() - 1;
658659
let mut result = Vec::with_capacity(size);
659660
result.extend_from_slice(first.borrow());
660661

@@ -666,6 +667,29 @@ impl<T: Clone, V: Borrow<[T]>> Join<&'_ T> for [V] {
666667
}
667668
}
668669

670+
#[unstable(feature = "slice_concat_ext", issue = "27747")]
671+
impl<T: Clone, V: Borrow<[T]>> Join<&'_ [T]> for [V] {
672+
type Output = Vec<T>;
673+
674+
fn join(slice: &Self, sep: &[T]) -> Vec<T> {
675+
let mut iter = slice.iter();
676+
let first = match iter.next() {
677+
Some(first) => first,
678+
None => return vec![],
679+
};
680+
let size = slice.iter().map(|v| v.borrow().len()).sum::<usize>() +
681+
sep.len() * (slice.len() - 1);
682+
let mut result = Vec::with_capacity(size);
683+
result.extend_from_slice(first.borrow());
684+
685+
for v in iter {
686+
result.extend_from_slice(sep);
687+
result.extend_from_slice(v.borrow())
688+
}
689+
result
690+
}
691+
}
692+
669693
////////////////////////////////////////////////////////////////////////////////
670694
// Standard trait implementations for slices
671695
////////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)