Skip to main content

intuicio_data/
lib.rs

1pub mod data_stack;
2pub mod lifetime;
3pub mod managed;
4pub mod shared;
5pub mod type_hash;
6
7pub trait Initialize: Sized {
8    fn initialize() -> Self;
9
10    /// # Safety
11    unsafe fn initialize_raw(data: *mut ()) {
12        unsafe { data.cast::<Self>().write(Self::initialize()) };
13    }
14}
15
16impl<T> Initialize for T
17where
18    T: Default,
19{
20    fn initialize() -> Self {
21        Self::default()
22    }
23}
24
25pub trait Finalize: Sized {
26    /// # Safety
27    unsafe fn finalize_raw(data: *mut ()) {
28        unsafe { data.cast::<Self>().read_unaligned() };
29    }
30}
31
32impl<T> Finalize for T {}
33
34#[inline]
35pub fn pointer_alignment_padding(pointer: *const u8, alignment: usize) -> usize {
36    let mut result = (pointer as usize) % alignment;
37    if result > 0 {
38        result = alignment - result;
39    }
40    result
41}
42
43/// # Safety
44pub unsafe fn non_zero_alloc(mut layout: std::alloc::Layout) -> *mut u8 {
45    unsafe {
46        if layout.size() == 0 {
47            layout = std::alloc::Layout::from_size_align_unchecked(1, layout.align());
48        }
49        let result = std::alloc::alloc(layout);
50        #[cfg(feature = "alloc-backtrace")]
51        println!(
52            "* Alloc {:p} ({:?}):\n{}",
53            result,
54            layout,
55            std::backtrace::Backtrace::force_capture()
56        );
57        result
58    }
59}
60
61/// # Safety
62pub unsafe fn non_zero_dealloc(ptr: *mut u8, mut layout: std::alloc::Layout) {
63    unsafe {
64        if layout.size() == 0 {
65            layout = std::alloc::Layout::from_size_align_unchecked(1, layout.align());
66        }
67        #[cfg(feature = "alloc-backtrace")]
68        println!(
69            "* Dealloc {:p} ({:?}):\n{}",
70            ptr,
71            layout,
72            std::backtrace::Backtrace::force_capture()
73        );
74        std::alloc::dealloc(ptr, layout);
75    }
76}
77
78/// # Safety
79pub unsafe fn non_zero_realloc(
80    ptr: *mut u8,
81    mut layout: std::alloc::Layout,
82    new_size: usize,
83) -> *mut u8 {
84    unsafe {
85        if layout.size() == 0 {
86            layout = std::alloc::Layout::from_size_align_unchecked(1, layout.align());
87        }
88        let result = std::alloc::realloc(ptr, layout, new_size);
89        #[cfg(feature = "alloc-backtrace")]
90        println!(
91            "* Realloc {:p} -> {:p} ({:?}):\n{}",
92            ptr,
93            result,
94            layout,
95            std::backtrace::Backtrace::force_capture()
96        );
97        result
98    }
99}
100
101/// # Safety
102pub unsafe fn non_zero_alloc_zeroed(mut layout: std::alloc::Layout) -> *mut u8 {
103    unsafe {
104        if layout.size() == 0 {
105            layout = std::alloc::Layout::from_size_align_unchecked(1, layout.align());
106        }
107        let result = std::alloc::alloc_zeroed(layout);
108        #[cfg(feature = "alloc-backtrace")]
109        println!(
110            "* Alloc zeroed {:p} ({:?}):\n{}",
111            result,
112            layout,
113            std::backtrace::Backtrace::force_capture()
114        );
115        result
116    }
117}