nstd_core/
pointer.rs

1use crate::def::{NSTDAny, NSTDAnyConst};
2
3/// Represents a reference to any type.
4#[repr(C)]
5#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
6pub struct NSTDPointer {
7    /// Raw pointer to the referenced object.
8    pub raw: NSTDAny,
9    /// Size in bytes of the referenced object.
10    pub size: usize,
11}
12/// Conversion methods.
13impl NSTDPointer {
14    /// Interprets an NSTDPointer as a byte slice.
15    #[inline]
16    pub unsafe fn as_byte_slice(&self) -> &[u8] {
17        core::slice::from_raw_parts(self.raw.cast(), self.size)
18    }
19
20    /// Interprets an NSTDPointer as a mutable byte slice.
21    #[inline]
22    pub unsafe fn as_byte_slice_mut(&mut self) -> &mut [u8] {
23        core::slice::from_raw_parts_mut(self.raw.cast(), self.size)
24    }
25}
26
27/// Creates a new instance of `NSTDPointer`.
28/// Parameters:
29///     `const NSTDAny obj` - The object to reference.
30///     `const NSTDUSize size` - The size in bytes of `obj`.
31/// Returns: `NSTDPointer ptr` - The pointer type.
32#[inline]
33#[cfg_attr(feature = "clib", no_mangle)]
34pub unsafe extern "C" fn nstd_core_pointer_new(obj: NSTDAny, size: usize) -> NSTDPointer {
35    NSTDPointer { raw: obj, size }
36}
37
38/// Overwrites the current referenced object's data with `obj`.
39/// Parameters:
40///     `NSTDPointer *const ptr` - The pointer.
41///     `NSTDAnyConst obj` - The object to overwrite with.
42#[inline]
43#[cfg_attr(feature = "clib", no_mangle)]
44pub unsafe extern "C" fn nstd_core_pointer_write(ptr: &mut NSTDPointer, obj: NSTDAnyConst) {
45    let obj_data = core::slice::from_raw_parts(obj.cast(), ptr.size);
46    ptr.as_byte_slice_mut().copy_from_slice(obj_data);
47}