rawpnt/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#![no_std]

use core::mem::size_of;
use core::ptr::NonNull;

#[inline(always)]
pub fn pointdist<T>(start: *const T, end: *const T) -> usize
{
	let size = size_of::<T>();
	if size == 0
	{
		(end as usize).wrapping_sub(start as usize)
	}
	else
	{
		(end as usize - start as usize) / size
	}
}

pub trait PointExt : Copy
{
	unsafe fn offset(self, i: isize) -> Self;
	unsafe fn add(self, i: usize) -> Self
	{
		self.offset(i as isize)
	}
	unsafe fn sub(self, i: usize) -> Self
	{
		self.offset((i as isize).wrapping_neg())
	}
	#[inline(always)]
	unsafe fn preinc(&mut self) -> Self
	{
		*self = self.offset(1);
		*self
	}
	#[inline(always)]
	unsafe fn postinc(&mut self) -> Self
	{
		let curr = *self;
		*self = self.offset(1);
		curr
	}
	#[inline(always)]
	unsafe fn predec(&mut self) -> Self
	{
		*self = self.offset(-1);
		*self
	}
	#[inline(always)]
	unsafe fn postdec(&mut self) -> Self
	{
		let curr = *self;
		*self = self.offset(-1);
		curr
	}
	#[inline(always)]
	unsafe fn inc(&mut self)
	{
		*self = self.offset(1);
	}
	#[inline(always)]
	unsafe fn dec(&mut self)
	{
		*self = self.offset(-1);
	}
	#[inline(always)]
	unsafe fn strideoffset(self, s: isize, index: usize) -> Self
	{
		self.offset(s * index as isize)
	}
}

impl<T> PointExt for *const T
{
	#[inline(always)]
	unsafe fn offset(self, i: isize) -> Self
	{
		self.offset(i)
	}
	#[inline]
	unsafe fn add(self, i: usize) -> Self
	{
		self.add(i)
	}
	#[inline]
	unsafe fn sub(self, i: usize) -> Self
	{
		self.sub(i)
	}
}

impl<T> PointExt for *mut T
{
	#[inline(always)]
	unsafe fn offset(self, i: isize) -> Self
	{
		self.offset(i)
	}
	#[inline]
	unsafe fn add(self, i: usize) -> Self
	{
		self.add(i)
	}
	#[inline]
	unsafe fn sub(self, i: usize) -> Self
	{
		self.sub(i)
	}
}

impl<T> PointExt for NonNull<T>
{
	#[inline(always)]
	unsafe fn offset(self, i: isize) -> Self
	{
		NonNull::new_unchecked(self.as_ptr().offset(i))
	}
}