autd3capi_driver/ptr/
mod.rs1mod 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}