From 2ca77f1c96f60b44c0d51d7d69046ad9a8532a46 Mon Sep 17 00:00:00 2001 From: Ulrik Sverdrup Date: Tue, 5 May 2015 16:34:35 +0200 Subject: [PATCH] collections: Convert SliceConcatExt to use associated types Coherence now allows this, we have SliceConcatExt for [V] where T: Sized + Clone and SliceConcatExt for [S], these don't conflict because str is never Sized. --- src/libcollections/slice.rs | 16 +++++++++++----- src/libcollections/str.rs | 4 +++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/libcollections/slice.rs b/src/libcollections/slice.rs index 6622d8a9c4063..3f9d6e64412a7 100644 --- a/src/libcollections/slice.rs +++ b/src/libcollections/slice.rs @@ -996,9 +996,13 @@ impl [T] { //////////////////////////////////////////////////////////////////////////////// // Extension traits for slices over specific kinds of data //////////////////////////////////////////////////////////////////////////////// -#[unstable(feature = "collections", reason = "U should be an associated type")] +#[unstable(feature = "collections", reason = "recently changed")] /// An extension trait for concatenating slices -pub trait SliceConcatExt { +pub trait SliceConcatExt { + #[unstable(feature = "collections", reason = "recently changed")] + /// The resulting type after concatenation + type Output; + /// Flattens a slice of `T` into a single value `U`. /// /// # Examples @@ -1011,7 +1015,7 @@ pub trait SliceConcatExt { /// println!("{}", s); // prints "helloworld" /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn concat(&self) -> U; + fn concat(&self) -> Self::Output; /// Flattens a slice of `T` into a single value `U`, placing a given separator between each. /// @@ -1025,10 +1029,12 @@ pub trait SliceConcatExt { /// println!("{}", s); // prints "hello world" /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn connect(&self, sep: &T) -> U; + fn connect(&self, sep: &T) -> Self::Output; } -impl> SliceConcatExt> for [V] { +impl> SliceConcatExt for [V] { + type Output = Vec; + fn concat(&self) -> Vec { let size = self.iter().fold(0, |acc, v| acc + v.as_ref().len()); let mut result = Vec::with_capacity(size); diff --git a/src/libcollections/str.rs b/src/libcollections/str.rs index db9f526a0f22e..fd94b00a2dc4d 100644 --- a/src/libcollections/str.rs +++ b/src/libcollections/str.rs @@ -83,7 +83,9 @@ pub use core::str::pattern; Section: Creating a string */ -impl> SliceConcatExt for [S] { +impl> SliceConcatExt for [S] { + type Output = String; + fn concat(&self) -> String { if self.is_empty() { return String::new();