about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorUlrik Sverdrup <bluss@users.noreply.github.com>2016-11-23 23:02:30 +0100
committerUlrik Sverdrup <bluss@users.noreply.github.com>2016-11-24 16:55:46 +0100
commit7611e424a7274ab1094ceebc0381e36e81b4db72 (patch)
tree1ba383983d5fc347c543a0da2b973e37ce635f3c /src/libcore
parentc1db77e9b99adc945ee3dbaef8d3d01f651b9b50 (diff)
downloadrust-7611e424a7274ab1094ceebc0381e36e81b4db72.tar.gz
rust-7611e424a7274ab1094ceebc0381e36e81b4db72.zip
core: Add ptrdistance to slice module
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/slice.rs13
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;