From 423e17b9df16990411cd7afded2e09139c6c6d09 Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Sat, 25 Oct 2014 11:01:15 -0500 Subject: [PATCH 1/2] DSTify BytesContainer --- src/libstd/path/mod.rs | 55 +++++++++++++++++++++----------------- src/libstd/path/posix.rs | 11 -------- src/libstd/path/windows.rs | 19 +------------ 3 files changed, 31 insertions(+), 54 deletions(-) diff --git a/src/libstd/path/mod.rs b/src/libstd/path/mod.rs index 62105c0d90e..8949a881c9d 100644 --- a/src/libstd/path/mod.rs +++ b/src/libstd/path/mod.rs @@ -67,6 +67,7 @@ println!("path exists: {}", path.exists()); #![experimental] +use core::kinds::Sized; use c_str::CString; use clone::Clone; use fmt; @@ -626,7 +627,7 @@ pub trait GenericPath: Clone + GenericPathUnsafe { /// ``` #[inline] fn push_many(&mut self, paths: &[T]) { - let t: Option = None; + let t: Option<&T> = None; if BytesContainer::is_str(t) { for p in paths.iter() { self.push(p.container_as_str().unwrap()) @@ -791,14 +792,9 @@ pub trait GenericPath: Clone + GenericPathUnsafe { } /// A trait that represents something bytes-like (e.g. a &[u8] or a &str) -pub trait BytesContainer { +pub trait BytesContainer for Sized? { /// Returns a &[u8] representing the receiver fn container_as_bytes<'a>(&'a self) -> &'a [u8]; - /// Consumes the receiver and converts it into Vec - #[inline] - fn container_into_owned_bytes(self) -> Vec { - self.container_as_bytes().to_vec() - } /// Returns the receiver interpreted as a utf-8 string, if possible #[inline] fn container_as_str<'a>(&'a self) -> Option<&'a str> { @@ -807,7 +803,7 @@ pub trait BytesContainer { /// Returns whether .container_as_str() is guaranteed to not fail // FIXME (#8888): Remove unused arg once :: works #[inline] - fn is_str(_: Option) -> bool { false } + fn is_str(_: Option<&Self>) -> bool { false } } /// A trait that represents the unsafe operations on GenericPaths @@ -859,48 +855,44 @@ impl<'a, P: GenericPath> Display<'a, P> { } } -impl<'a> BytesContainer for &'a str { +impl BytesContainer for str { #[inline] - fn container_as_bytes<'a>(&'a self) -> &'a [u8] { + fn container_as_bytes(&self) -> &[u8] { self.as_bytes() } #[inline] - fn container_as_str<'a>(&'a self) -> Option<&'a str> { - Some(*self) + fn container_as_str(&self) -> Option<&str> { + Some(self) } #[inline] - fn is_str(_: Option<&'a str>) -> bool { true } + fn is_str(_: Option<&str>) -> bool { true } } impl BytesContainer for String { #[inline] - fn container_as_bytes<'a>(&'a self) -> &'a [u8] { + fn container_as_bytes(&self) -> &[u8] { self.as_bytes() } #[inline] - fn container_as_str<'a>(&'a self) -> Option<&'a str> { + fn container_as_str(&self) -> Option<&str> { Some(self.as_slice()) } #[inline] - fn is_str(_: Option) -> bool { true } + fn is_str(_: Option<&String>) -> bool { true } } -impl<'a> BytesContainer for &'a [u8] { +impl BytesContainer for [u8] { #[inline] - fn container_as_bytes<'a>(&'a self) -> &'a [u8] { - *self + fn container_as_bytes(&self) -> &[u8] { + self } } impl BytesContainer for Vec { #[inline] - fn container_as_bytes<'a>(&'a self) -> &'a [u8] { + fn container_as_bytes(&self) -> &[u8] { self.as_slice() } - #[inline] - fn container_into_owned_bytes(self) -> Vec { - self - } } impl BytesContainer for CString { @@ -920,7 +912,20 @@ impl<'a> BytesContainer for str::MaybeOwned<'a> { Some(self.as_slice()) } #[inline] - fn is_str(_: Option) -> bool { true } + fn is_str(_: Option<&str::MaybeOwned>) -> bool { true } +} + +impl<'a, Sized? T: BytesContainer> BytesContainer for &'a T { + #[inline] + fn container_as_bytes(&self) -> &[u8] { + (**self).container_as_bytes() + } + #[inline] + fn container_as_str(&self) -> Option<&str> { + (**self).container_as_str() + } + #[inline] + fn is_str(_: Option<& &'a T>) -> bool { BytesContainer::is_str(None::<&T>) } } #[inline(always)] diff --git a/src/libstd/path/posix.rs b/src/libstd/path/posix.rs index e090d9d7098..60cfa7a13de 100644 --- a/src/libstd/path/posix.rs +++ b/src/libstd/path/posix.rs @@ -117,17 +117,6 @@ impl BytesContainer for Path { fn container_as_bytes<'a>(&'a self) -> &'a [u8] { self.as_vec() } - #[inline] - fn container_into_owned_bytes(self) -> Vec { - self.into_vec() - } -} - -impl<'a> BytesContainer for &'a Path { - #[inline] - fn container_as_bytes<'a>(&'a self) -> &'a [u8] { - self.as_vec() - } } impl GenericPathUnsafe for Path { diff --git a/src/libstd/path/windows.rs b/src/libstd/path/windows.rs index f0d1ecf9d24..3ef142a2e82 100644 --- a/src/libstd/path/windows.rs +++ b/src/libstd/path/windows.rs @@ -149,28 +149,11 @@ impl BytesContainer for Path { self.as_vec() } #[inline] - fn container_into_owned_bytes(self) -> Vec { - self.into_vec() - } - #[inline] fn container_as_str<'a>(&'a self) -> Option<&'a str> { self.as_str() } #[inline] - fn is_str(_: Option) -> bool { true } -} - -impl<'a> BytesContainer for &'a Path { - #[inline] - fn container_as_bytes<'a>(&'a self) -> &'a [u8] { - self.as_vec() - } - #[inline] - fn container_as_str<'a>(&'a self) -> Option<&'a str> { - self.as_str() - } - #[inline] - fn is_str(_: Option<&'a Path>) -> bool { true } + fn is_str(_: Option<&Path>) -> bool { true } } impl GenericPathUnsafe for Path { From fe256f81401e7af5fb3a3ec069427fd9c52073a9 Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Fri, 31 Oct 2014 00:03:52 -0500 Subject: [PATCH 2/2] Remove unnecessary allocations --- src/compiletest/runtest.rs | 2 +- src/librustc/driver/session.rs | 2 +- src/libstd/io/process.rs | 2 +- src/libterm/terminfo/searcher.rs | 2 +- src/test/run-pass/process-spawn-with-unicode-params.rs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/compiletest/runtest.rs b/src/compiletest/runtest.rs index 283ca46a49f..55247792921 100644 --- a/src/compiletest/runtest.rs +++ b/src/compiletest/runtest.rs @@ -627,7 +627,7 @@ fn find_rust_src_root(config: &Config) -> Option { let path_postfix = Path::new("src/etc/lldb_batchmode.py"); while path.pop() { - if path.join(path_postfix.clone()).is_file() { + if path.join(&path_postfix).is_file() { return Some(path); } } diff --git a/src/librustc/driver/session.rs b/src/librustc/driver/session.rs index 55e07321c71..f8e778ce15f 100644 --- a/src/librustc/driver/session.rs +++ b/src/librustc/driver/session.rs @@ -231,7 +231,7 @@ pub fn build_session_(sopts: config::Options, if path.is_absolute() { path.clone() } else { - os::getcwd().join(path.clone()) + os::getcwd().join(&path) } ); diff --git a/src/libstd/io/process.rs b/src/libstd/io/process.rs index 4e5f8822acb..312a4c41ac9 100644 --- a/src/libstd/io/process.rs +++ b/src/libstd/io/process.rs @@ -918,7 +918,7 @@ mod tests { let prog = pwd_cmd().cwd(&parent_dir).spawn().unwrap(); let output = String::from_utf8(prog.wait_with_output().unwrap().output).unwrap(); - let child_dir = Path::new(output.as_slice().trim().into_string()); + let child_dir = Path::new(output.as_slice().trim()); let parent_stat = parent_dir.stat().unwrap(); let child_stat = child_dir.stat().unwrap(); diff --git a/src/libterm/terminfo/searcher.rs b/src/libterm/terminfo/searcher.rs index a89afab505b..61ff88a2fa3 100644 --- a/src/libterm/terminfo/searcher.rs +++ b/src/libterm/terminfo/searcher.rs @@ -41,7 +41,7 @@ pub fn get_dbpath_for_term(term: &str) -> Option> { if i == "" { dirs_to_search.push(Path::new("/usr/share/terminfo")); } else { - dirs_to_search.push(Path::new(i.to_string())); + dirs_to_search.push(Path::new(i)); } }, // Found nothing in TERMINFO_DIRS, use the default paths: diff --git a/src/test/run-pass/process-spawn-with-unicode-params.rs b/src/test/run-pass/process-spawn-with-unicode-params.rs index 9716d79f4c8..490614ef121 100644 --- a/src/test/run-pass/process-spawn-with-unicode-params.rs +++ b/src/test/run-pass/process-spawn-with-unicode-params.rs @@ -48,7 +48,7 @@ fn main() { let child_filestem = Path::new(child_name); let child_filename = child_filestem.with_extension(my_ext); - let child_path = cwd.join(child_filename.clone()); + let child_path = cwd.join(child_filename); // make a separate directory for the child drop(fs::mkdir(&cwd, io::USER_RWX).is_ok());