diff options
| author | Ulrik Sverdrup <bluss@users.noreply.github.com> | 2016-11-23 23:02:30 +0100 |
|---|---|---|
| committer | Ulrik Sverdrup <bluss@users.noreply.github.com> | 2016-11-24 16:55:46 +0100 |
| commit | 7611e424a7274ab1094ceebc0381e36e81b4db72 (patch) | |
| tree | 1ba383983d5fc347c543a0da2b973e37ce635f3c /src/libcore | |
| parent | c1db77e9b99adc945ee3dbaef8d3d01f651b9b50 (diff) | |
| download | rust-7611e424a7274ab1094ceebc0381e36e81b4db72.tar.gz rust-7611e424a7274ab1094ceebc0381e36e81b4db72.zip | |
core: Add ptrdistance to slice module
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/slice.rs | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs index fca4583f049..b2bd1219997 100644 --- a/src/libcore/slice.rs +++ b/src/libcore/slice.rs @@ -833,9 +833,7 @@ macro_rules! iterator { #[inline] fn size_hint(&self) -> (usize, Option<usize>) { - let diff = (self.end as usize).wrapping_sub(self.ptr as usize); - let size = mem::size_of::<T>(); - let exact = diff / (if size == 0 {1} else {size}); + let exact = ptrdistance(self.ptr, self.end); (exact, Some(exact)) } @@ -1127,6 +1125,15 @@ impl<'a, T> FusedIterator for IterMut<'a, T> {} unsafe impl<'a, T> TrustedLen for IterMut<'a, T> {} +// Return the number of elements of `T` from `start` to `end`. +// Return the arithmetic difference if `T` is zero size. +#[inline(always)] +fn ptrdistance<T>(start: *const T, end: *const T) -> usize { + let diff = (end as usize).wrapping_sub(start as usize); + let size = mem::size_of::<T>(); + diff / (if size == 0 { 1 } else { size }) +} + // Extension methods for raw pointers, used by the iterators trait PointerExt : Copy { unsafe fn slice_offset(self, i: isize) -> Self; |
