diff options
| author | bors <bors@rust-lang.org> | 2013-08-03 00:25:56 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-08-03 00:25:56 -0700 |
| commit | 20fad0f5fff381210bfe79b35a5fe8332ec86b34 (patch) | |
| tree | c37eb6f6c0e4cbfb1009d6d018745f22b32a93f0 /src/libstd | |
| parent | deddb009f0003734d3c73fa859826d57ec600270 (diff) | |
| parent | def88913d80e153d956ce85f8155d77455bcfe5e (diff) | |
| download | rust-20fad0f5fff381210bfe79b35a5fe8332ec86b34.tar.gz rust-20fad0f5fff381210bfe79b35a5fe8332ec86b34.zip | |
auto merge of #8257 : mozilla/rust/rollup, r=thestinger
1f9c392 r=brson 54e685d r=graydon 1992765 r=thestinger 75155cd r=bblum def8891 r=graydon
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/logging.rs | 10 | ||||
| -rw-r--r-- | src/libstd/option.rs | 29 | ||||
| -rw-r--r-- | src/libstd/vec.rs | 59 |
3 files changed, 85 insertions, 13 deletions
diff --git a/src/libstd/logging.rs b/src/libstd/logging.rs index 6e11d14aea9..c662e5997af 100644 --- a/src/libstd/logging.rs +++ b/src/libstd/logging.rs @@ -85,6 +85,16 @@ pub fn log_type<T>(level: u32, object: &T) { fn newsched_log_str(msg: ~str) { use rt::task::Task; use rt::local::Local; + use str::StrSlice; + use container::Container; + + // Truncate the string + let buf_bytes = 256; + let msg = if msg.len() > buf_bytes { + msg.slice(0, buf_bytes) + "[...]" + } else { + msg + }; unsafe { match Local::try_unsafe_borrow::<Task>() { diff --git a/src/libstd/option.rs b/src/libstd/option.rs index 7eca47743d6..547c453b02d 100644 --- a/src/libstd/option.rs +++ b/src/libstd/option.rs @@ -235,19 +235,24 @@ impl<T> Option<T> { self.take().map_consume_default(def, blk) } - /// Apply a function to the contained value or do nothing - pub fn mutate(&mut self, f: &fn(T) -> T) { + /// Apply a function to the contained value or do nothing. + /// Returns true if the contained value was mutated. + pub fn mutate(&mut self, f: &fn(T) -> T) -> bool { if self.is_some() { *self = Some(f(self.take_unwrap())); - } + true + } else { false } } - /// Apply a function to the contained value or set it to a default - pub fn mutate_default(&mut self, def: T, f: &fn(T) -> T) { + /// Apply a function to the contained value or set it to a default. + /// Returns true if the contained value was mutated, or false if set to the default. + pub fn mutate_default(&mut self, def: T, f: &fn(T) -> T) -> bool { if self.is_some() { *self = Some(f(self.take_unwrap())); + true } else { *self = Some(def); + false } } @@ -575,4 +580,18 @@ mod tests { assert_eq!(it.size_hint(), (0, Some(0))); assert!(it.next().is_none()); } + + #[test] + fn test_mutate() { + let mut x = Some(3i); + assert!(x.mutate(|i| i+1)); + assert_eq!(x, Some(4i)); + assert!(x.mutate_default(0, |i| i+1)); + assert_eq!(x, Some(5i)); + x = None; + assert!(!x.mutate(|i| i+1)); + assert_eq!(x, None); + assert!(!x.mutate_default(0i, |i| i+1)); + assert_eq!(x, Some(0i)); + } } diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index ad5ded2002a..1f6adaf040b 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -2141,11 +2141,15 @@ macro_rules! iterator { None } else { let old = self.ptr; - // purposefully don't use 'ptr.offset' because for - // vectors with 0-size elements this would return the - // same pointer. - self.ptr = cast::transmute(self.ptr as uint + - sys::nonzero_size_of::<T>()); + self.ptr = if sys::size_of::<T>() == 0 { + // purposefully don't use 'ptr.offset' because for + // vectors with 0-size elements this would return the + // same pointer. + cast::transmute(self.ptr as uint + 1) + } else { + self.ptr.offset(1) + }; + Some(cast::transmute(old)) } } @@ -2171,9 +2175,12 @@ macro_rules! double_ended_iterator { if self.end == self.ptr { None } else { - // See above for why 'ptr.offset' isn't used - self.end = cast::transmute(self.end as uint - - sys::nonzero_size_of::<T>()); + self.end = if sys::size_of::<T>() == 0 { + // See above for why 'ptr.offset' isn't used + cast::transmute(self.end as uint - 1) + } else { + self.end.offset(-1) + }; Some(cast::transmute(self.end)) } } @@ -3566,3 +3573,39 @@ mod tests { assert!(cnt == 3); } } + +#[cfg(test)] +mod bench { + use extra::test::BenchHarness; + use vec; + use option::*; + + #[bench] + fn iterator(bh: &mut BenchHarness) { + // peculiar numbers to stop LLVM from optimising the summation + // out. + let v = vec::from_fn(100, |i| i ^ (i << 1) ^ (i >> 1)); + + do bh.iter { + let mut sum = 0; + foreach x in v.iter() { + sum += *x; + } + // sum == 11806, to stop dead code elimination. + if sum == 0 {fail!()} + } + } + + #[bench] + fn mut_iterator(bh: &mut BenchHarness) { + let mut v = vec::from_elem(100, 0); + + do bh.iter { + let mut i = 0; + foreach x in v.mut_iter() { + *x = i; + i += 1; + } + } + } +} |
