autd3capi_driver/ptr/
mod.rs

1mod controller;
2mod datagram;
3mod environment;
4mod gain;
5mod geometry;
6mod link;
7mod modulation;
8mod stm;
9
10pub use controller::*;
11pub use datagram::*;
12pub use environment::*;
13pub use gain::*;
14pub use geometry::*;
15pub use link::*;
16pub use modulation::*;
17pub use stm::*;
18
19pub trait CapiResult {
20    const NULL: Self;
21}
22
23#[macro_export]
24macro_rules! impl_ptr {
25    ($name:ident) => {
26        unsafe impl Send for $name {}
27        unsafe impl Sync for $name {}
28
29        impl $name {
30            pub const NULL: Self = Self(std::ptr::null());
31        }
32    };
33    ($name:ident, $type:ty) => {
34        impl_ptr!($name);
35
36        impl From<$type> for $name {
37            fn from(v: $type) -> Self {
38                Self(Box::into_raw(Box::new(v)) as _)
39            }
40        }
41
42        impl std::ops::Deref for $name {
43            type Target = $type;
44            fn deref(&self) -> &Self::Target {
45                unsafe { (self.0 as *const $type).as_ref().unwrap() }
46            }
47        }
48
49        impl std::ops::DerefMut for $name {
50            fn deref_mut(&mut self) -> &mut Self::Target {
51                unsafe { (self.0 as *mut $type).as_mut().unwrap() }
52            }
53        }
54    };
55}