diff options
| author | Kevin Ballard <kevin@sb.org> | 2014-05-03 23:09:45 -0700 |
|---|---|---|
| committer | Kevin Ballard <kevin@sb.org> | 2014-05-08 12:06:22 -0700 |
| commit | 2a0dac6f58fb07d5fb6a4dfa94e10ddaa44315a7 (patch) | |
| tree | 141785eae7b1d17aa580e6cbe70dd5c3040aefdc /src/libstd | |
| parent | cc42b619362c344aacdb84ff00243b3e32168cad (diff) | |
| download | rust-2a0dac6f58fb07d5fb6a4dfa94e10ddaa44315a7.tar.gz rust-2a0dac6f58fb07d5fb6a4dfa94e10ddaa44315a7.zip | |
Handle fallout for vector addition
Adding two vectors now results in a Vec<T> instead of a ~[T]. Implement Add on Vec<T>.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/slice.rs | 20 | ||||
| -rw-r--r-- | src/libstd/unstable/dynamic_lib.rs | 9 | ||||
| -rw-r--r-- | src/libstd/vec.rs | 12 |
3 files changed, 38 insertions, 3 deletions
diff --git a/src/libstd/slice.rs b/src/libstd/slice.rs index 42ffce56e87..d260ca46513 100644 --- a/src/libstd/slice.rs +++ b/src/libstd/slice.rs @@ -279,6 +279,26 @@ impl<T: Clone> Iterator<~[T]> for Permutations<T> { } } +#[cfg(not(test))] +impl<'a,T:Clone, V: Vector<T>> Add<V, Vec<T>> for &'a [T] { + #[inline] + fn add(&self, rhs: &V) -> Vec<T> { + let rhs = rhs.as_slice(); + let mut res = Vec::with_capacity(self.len() + rhs.len()); + res.push_all(*self); + res.push_all(rhs); + res + } +} + +#[cfg(not(test))] +impl<T:Clone, V: Vector<T>> Add<V, Vec<T>> for ~[T] { + #[inline] + fn add(&self, rhs: &V) -> Vec<T> { + self.as_slice() + rhs.as_slice() + } +} + /// Extension methods for vector slices with cloneable elements pub trait CloneableVector<T> { /// Copy `self` into a new owned vector diff --git a/src/libstd/unstable/dynamic_lib.rs b/src/libstd/unstable/dynamic_lib.rs index 68f0aaab05b..e2a9f6a5c48 100644 --- a/src/libstd/unstable/dynamic_lib.rs +++ b/src/libstd/unstable/dynamic_lib.rs @@ -18,13 +18,16 @@ A simple wrapper over the platform's dynamic library facilities use c_str::ToCStr; use cast; +use iter::Iterator; use ops::*; use option::*; use os; use path::GenericPath; use path; use result::*; +use slice::{Vector,OwnedVector}; use str; +use vec::Vec; pub struct DynamicLibrary { handle: *u8} @@ -73,8 +76,10 @@ impl DynamicLibrary { ("LD_LIBRARY_PATH", ':' as u8) }; let newenv = os::getenv_as_bytes(envvar).unwrap_or(box []); - let newenv = newenv + &[sep] + path.as_vec(); - os::setenv(envvar, str::from_utf8(newenv).unwrap()); + let mut newenv = newenv.move_iter().collect::<Vec<_>>(); + newenv.push_all(&[sep]); + newenv.push_all(path.as_vec()); + os::setenv(envvar, str::from_utf8(newenv.as_slice()).unwrap()); } /// Access the value at the symbol of the dynamic library diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index d220ebd0d1e..fe122c7873a 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -22,7 +22,7 @@ use mem::{size_of, move_val_init}; use mem; use num; use num::{CheckedMul, CheckedAdd}; -use ops::Drop; +use ops::{Add, Drop}; use option::{None, Option, Some, Expect}; use ptr::RawPtr; use ptr; @@ -1370,6 +1370,16 @@ impl<T> Vector<T> for Vec<T> { } } +impl<T: Clone, V: Vector<T>> Add<V, Vec<T>> for Vec<T> { + #[inline] + fn add(&self, rhs: &V) -> Vec<T> { + let mut res = Vec::with_capacity(self.len() + rhs.as_slice().len()); + res.push_all(self.as_slice()); + res.push_all(rhs.as_slice()); + res + } +} + #[unsafe_destructor] impl<T> Drop for Vec<T> { fn drop(&mut self) { |
