diff options
| author | Huon Wilson <dbau.pp+github@gmail.com> | 2013-08-02 23:34:11 +1000 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2013-08-03 03:13:11 -0400 |
| commit | fbb7cd32c3be0c36ff50046325a6e958d5980393 (patch) | |
| tree | 21d8d0a0119164499f7a3d2e44c0834d2c4ae2ff /src/libstd/vec.rs | |
| parent | 54e685d4fd70eeb607668fed2026ac6cafec6107 (diff) | |
| download | rust-fbb7cd32c3be0c36ff50046325a6e958d5980393.tar.gz rust-fbb7cd32c3be0c36ff50046325a6e958d5980393.zip | |
std: use ptr.offset where possible in the vec iterator.
Closes #8212.
Diffstat (limited to 'src/libstd/vec.rs')
| -rw-r--r-- | src/libstd/vec.rs | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index ad5ded2002a..5f66d93b6d9 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,26 @@ 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!()} + } + } +} |
