Skip to main content

rawpnt/
lib.rs

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}