1pub mod io;
2pub mod processes;
3
4use core::ptr::NonNull;
5
6#[repr(C)]
7#[derive(Debug, Clone, Copy)]
8pub struct RawSlice<T> {
10 ptr: *const T,
11 len: usize,
12}
13
14impl<T> RawSlice<T> {
15 #[inline(always)]
16 pub unsafe fn from_raw_parts(ptr: *const T, len: usize) -> Self {
17 Self { ptr, len }
18 }
19 #[inline(always)]
20 pub unsafe fn from_slice(slice: &[T]) -> Self {
21 Self {
22 ptr: slice.as_ptr(),
23 len: slice.len(),
24 }
25 }
26
27 #[inline(always)]
28 pub fn len(&self) -> usize {
29 self.len
30 }
31
32 #[inline(always)]
33 pub fn as_ptr(&self) -> *const T {
34 self.ptr
35 }
36
37 #[inline(always)]
44 pub unsafe fn into_slice<'a>(self) -> Option<&'a [T]> {
45 if self.ptr.is_null() || self.len == 0 {
46 None
47 } else {
48 Some(core::slice::from_raw_parts(self.ptr, self.len))
49 }
50 }
51}
52
53impl<T> RawSliceMut<T> {
54 #[inline(always)]
55 pub unsafe fn from_raw_parts(ptr: *mut T, len: usize) -> Self {
56 Self { ptr, len }
57 }
58
59 #[inline(always)]
60 pub fn len(&self) -> usize {
61 self.len
62 }
63
64 #[inline(always)]
65 pub fn as_ptr(&self) -> *const T {
66 self.ptr
67 }
68
69 #[inline(always)]
70 pub fn as_mut_ptr(&self) -> *mut T {
71 self.ptr
72 }
73
74 #[inline(always)]
81 pub unsafe fn into_slice_mut<'a>(self) -> Option<&'a mut [T]> {
82 if self.ptr.is_null() || self.len == 0 {
83 None
84 } else {
85 Some(core::slice::from_raw_parts_mut(self.ptr, self.len))
86 }
87 }
88}
89
90impl<T> RawSliceMut<RawSlice<T>> {
91 #[inline(always)]
98 pub unsafe fn from_slices(slices: *mut [&[T]]) -> Self {
99 let old_slices = unsafe { &mut *slices };
100 let raw_slices = unsafe { &mut *(slices as *mut [RawSlice<T>]) };
101
102 for (i, slice) in old_slices.iter().enumerate() {
103 raw_slices[i] = unsafe { RawSlice::from_slice(slice) };
104 }
105 unsafe { RawSliceMut::from_raw_parts(raw_slices.as_mut_ptr(), raw_slices.len()) }
106 }
107}
108
109#[repr(C)]
110#[derive(Debug, Clone, Copy)]
111pub struct RawSliceMut<T> {
113 ptr: *mut T,
114 len: usize,
115}
116
117#[repr(C)]
118#[derive(Debug, Clone, Copy)]
119pub struct NonNullSlice<T> {
120 ptr: NonNull<T>,
121 len: usize,
122}
123
124impl<T> NonNullSlice<T> {
125 pub const unsafe fn from_raw_parts(ptr: NonNull<T>, len: usize) -> Self {
126 Self { ptr, len }
127 }
128
129 pub const fn as_non_null(&self) -> NonNull<T> {
130 self.ptr
131 }
132
133 pub const fn as_ptr(&self) -> *mut T {
134 self.ptr.as_ptr()
135 }
136
137 pub const fn len(&self) -> usize {
138 self.len
139 }
140
141 #[inline(always)]
145 pub unsafe fn into_slice_mut<'a>(self) -> &'a mut [T] {
146 unsafe { core::slice::from_raw_parts_mut(self.ptr.as_ptr(), self.len) }
147 }
148}
149
150#[derive(Debug)]
152#[repr(C)]
153pub enum Optional<T> {
154 None,
155 Some(T),
156}
157
158impl<T> From<Option<T>> for Optional<T> {
159 #[inline(always)]
160 fn from(value: Option<T>) -> Self {
161 match value {
162 None => Self::None,
163 Some(x) => Self::Some(x),
164 }
165 }
166}
167
168impl<T> From<Optional<T>> for Option<T> {
169 #[inline(always)]
170 fn from(value: Optional<T>) -> Self {
171 match value {
172 Optional::None => None,
173 Optional::Some(x) => Some(x),
174 }
175 }
176}
177
178impl<T: Clone> Clone for Optional<T> {
179 #[inline(always)]
180 fn clone(&self) -> Self {
181 match self {
182 Self::None => Self::None,
183 Self::Some(x) => Self::Some(x.clone()),
184 }
185 }
186}
187impl<T: Copy> Copy for Optional<T> {}
188
189impl<T: PartialEq> PartialEq for Optional<T> {
190 #[inline(always)]
191 fn eq(&self, other: &Self) -> bool {
192 match (self, other) {
193 (Self::None, Self::None) => true,
194 (Self::Some(x), Self::Some(y)) => x == y,
195 _ => false,
196 }
197 }
198}
199
200impl<T: Eq> Eq for Optional<T> {}