1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#[inline(always)]
pub(crate) fn distance_between<T>(self_: *const T, origin: *const T) -> usize {
  let type_size: usize = core::mem::size_of::<T>();
  assert!(0 < type_size);
  let distance: usize = (self_ as usize).wrapping_sub(origin as usize);
  unsafe { core::intrinsics::exact_div(distance, type_size) }
}

#[inline(always)]
pub(crate) fn reverse_copy<T>(first: *const T, mut last: *const T, mut result: *mut T)
where T: Copy {
  while first != last {
    unsafe {
      last = last.offset(-1);
      *result = *last;
      result = result.offset(1);
    }
  }
}