1#![no_std]
2
3use core::mem::size_of;
4use core::ptr::NonNull;
5
6#[inline(always)]
7pub fn pointdist<T>(start: *const T, end: *const T) -> usize
8{
9 let size = size_of::<T>();
10 if size == 0
11 {
12 (end as usize).wrapping_sub(start as usize)
13 }
14 else
15 {
16 (end as usize - start as usize) / size
17 }
18}
19
20pub trait PointExt : Copy
21{
22 unsafe fn offset(self, i: isize) -> Self;
23 unsafe fn add(self, i: usize) -> Self
24 {
25 self.offset(i as isize)
26 }
27 unsafe fn sub(self, i: usize) -> Self
28 {
29 self.offset((i as isize).wrapping_neg())
30 }
31 #[inline(always)]
32 unsafe fn preinc(&mut self) -> Self
33 {
34 *self = self.offset(1);
35 *self
36 }
37 #[inline(always)]
38 unsafe fn postinc(&mut self) -> Self
39 {
40 let curr = *self;
41 *self = self.offset(1);
42 curr
43 }
44 #[inline(always)]
45 unsafe fn predec(&mut self) -> Self
46 {
47 *self = self.offset(-1);
48 *self
49 }
50 #[inline(always)]
51 unsafe fn postdec(&mut self) -> Self
52 {
53 let curr = *self;
54 *self = self.offset(-1);
55 curr
56 }
57 #[inline(always)]
58 unsafe fn inc(&mut self)
59 {
60 *self = self.offset(1);
61 }
62 #[inline(always)]
63 unsafe fn dec(&mut self)
64 {
65 *self = self.offset(-1);
66 }
67 #[inline(always)]
68 unsafe fn strideoffset(self, s: isize, index: usize) -> Self
69 {
70 self.offset(s * index as isize)
71 }
72}
73
74impl<T> PointExt for *const T
75{
76 #[inline(always)]
77 unsafe fn offset(self, i: isize) -> Self
78 {
79 self.offset(i)
80 }
81 #[inline]
82 unsafe fn add(self, i: usize) -> Self
83 {
84 self.add(i)
85 }
86 #[inline]
87 unsafe fn sub(self, i: usize) -> Self
88 {
89 self.sub(i)
90 }
91}
92
93impl<T> PointExt for *mut T
94{
95 #[inline(always)]
96 unsafe fn offset(self, i: isize) -> Self
97 {
98 self.offset(i)
99 }
100 #[inline]
101 unsafe fn add(self, i: usize) -> Self
102 {
103 self.add(i)
104 }
105 #[inline]
106 unsafe fn sub(self, i: usize) -> Self
107 {
108 self.sub(i)
109 }
110}
111
112impl<T> PointExt for NonNull<T>
113{
114 #[inline(always)]
115 unsafe fn offset(self, i: isize) -> Self
116 {
117 NonNull::new_unchecked(self.as_ptr().offset(i))
118 }
119}