From 641910dc1340b7786fd758282bac88639a58ddcd Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Thu, 13 Jun 2013 02:56:09 +1000 Subject: [PATCH] std: make all strings Equiv-alent to each other, generalise Path.push_many to take any type of string. --- src/libstd/path.rs | 12 ++++++------ src/libstd/prelude.rs | 2 +- src/libstd/str.rs | 16 ++++++++++++++-- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/libstd/path.rs b/src/libstd/path.rs index 02772604e45c..9c4e8f083584 100644 --- a/src/libstd/path.rs +++ b/src/libstd/path.rs @@ -22,7 +22,7 @@ use iterator::IteratorUtil; use libc; use option::{None, Option, Some}; use str; -use str::{StrSlice, StrVector}; +use str::{Str, StrSlice, StrVector}; use to_str::ToStr; use ascii::{AsciiCast, AsciiStr}; use old_iter::BaseIter; @@ -102,7 +102,7 @@ pub trait GenericPath { fn push_rel(&self, (&Self)) -> Self; /// Returns a new Path consisting of the path given by the given vector /// of strings, relative to `self`. - fn push_many(&self, (&[~str])) -> Self; + fn push_many(&self, (&[S])) -> Self; /// Identical to `dir_path` except in the case where `self` has only one /// component. In this case, `pop` returns the empty path. fn pop(&self) -> Self; @@ -566,10 +566,10 @@ impl GenericPath for PosixPath { false } - fn push_many(&self, cs: &[~str]) -> PosixPath { + fn push_many(&self, cs: &[S]) -> PosixPath { let mut v = copy self.components; for cs.each |e| { - for e.split_iter(windows::is_sep).advance |s| { + for e.as_slice().split_iter(windows::is_sep).advance |s| { if !s.is_empty() { v.push(s.to_owned()) } @@ -823,10 +823,10 @@ impl GenericPath for WindowsPath { } } - fn push_many(&self, cs: &[~str]) -> WindowsPath { + fn push_many(&self, cs: &[S]) -> WindowsPath { let mut v = copy self.components; for cs.each |e| { - for e.split_iter(windows::is_sep).advance |s| { + for e.as_slice().split_iter(windows::is_sep).advance |s| { if !s.is_empty() { v.push(s.to_owned()) } diff --git a/src/libstd/prelude.rs b/src/libstd/prelude.rs index e969c5d4e3a1..4400cb5de983 100644 --- a/src/libstd/prelude.rs +++ b/src/libstd/prelude.rs @@ -64,7 +64,7 @@ pub use path::PosixPath; pub use path::WindowsPath; pub use ptr::RawPtr; pub use ascii::{Ascii, AsciiCast, OwnedAsciiCast, AsciiStr}; -pub use str::{StrVector, StrSlice, OwnedStr, StrUtil, NullTerminatedStr}; +pub use str::{Str, StrVector, StrSlice, OwnedStr, StrUtil, NullTerminatedStr}; pub use from_str::{FromStr}; pub use to_bytes::IterBytes; pub use to_str::{ToStr, ToStrConsume}; diff --git a/src/libstd/str.rs b/src/libstd/str.rs index fdf12d406e81..c928933f4a74 100644 --- a/src/libstd/str.rs +++ b/src/libstd/str.rs @@ -729,10 +729,22 @@ impl Ord for @str { } #[cfg(not(test))] -impl<'self> Equiv<~str> for &'self str { +impl<'self, S: Str> Equiv for &'self str { #[inline(always)] - fn equiv(&self, other: &~str) -> bool { eq_slice(*self, *other) } + fn equiv(&self, other: &S) -> bool { eq_slice(*self, other.as_slice()) } } +#[cfg(not(test))] +impl<'self, S: Str> Equiv for @str { + #[inline(always)] + fn equiv(&self, other: &S) -> bool { eq_slice(*self, other.as_slice()) } +} + +#[cfg(not(test))] +impl<'self, S: Str> Equiv for ~str { + #[inline(always)] + fn equiv(&self, other: &S) -> bool { eq_slice(*self, other.as_slice()) } +} + /* Section: Iterating through strings