lv-std 0.0.4

some utils for c and unsafe rust, this is for personal use for now so you can use it but don't expect any regular updates or maintaining
Documentation
use std::marker::PhantomData;
use std::ops::{Deref, DerefMut};
use crate::unsafe_std::lifetimes::{extend_lifetime, extend_lifetime_mut};
use crate::unsafe_std::ptrs::unsafe_shared::{UnsafeShared, UnsafeSharedRef};

/// # Safety
/// `Shared<T>` is a manually managed, stack-based shared smart pointer.
/// It allows you to take multiple shared references, or a single unique one,
/// but it **does not** perform any runtime checks — soundness relies on you
/// upholding aliasing rules.
#[derive(Copy, Clone)]
pub struct Shared<T> {
    value: UnsafeShared<T>,
}

impl<T> Shared<T> {
    /// Creates a new shared container for a value.
    #[inline]
    pub fn new(value: T) -> Self {
        Self {
            value: unsafe { UnsafeShared::new(value) },
        }
    }

    /// Takes a temporary shared reference to the value.
    ///
    /// # Safety
    /// This is only safe if the returned reference does not outlive `self`.
    /// The borrow checker enforces this, so in safe Rust usage, this method is sound.
    #[inline]
    pub fn take_ref(&mut self) -> SharedRef<'_, T> {
        SharedRef {
            ptr: unsafe { self.value.take_ref() },
            _marker: PhantomData,
        }
    }

    /// Internal helper if you ever need to extract the raw shared handle.
    #[inline]
    pub fn raw(&self) -> &UnsafeShared<T> {
        &self.value
    }
}

/// A reference handle returned by [`Shared::take_ref`].
/// Behaves like `&mut T` / `&T` depending on usage.
///
/// The lifetime `'b` is tied to the borrow of `&mut self` from `Shared`,
/// preventing `'static` or longer-lived references from being created.

#[derive(Copy, Clone)]
pub struct SharedRef<'b, T> {
    ptr: UnsafeSharedRef<T>,
    _marker: PhantomData<&'b T>,
}

impl<'b, T> Deref for SharedRef<'b, T> {
    type Target = T;

    #[inline]
    fn deref(&self) -> &'b T {
        unsafe { extend_lifetime(self.ptr.deref()) }
    }
}

impl<'b, T> DerefMut for SharedRef<'b, T> {
    #[inline]
    fn deref_mut(&mut self) -> &'b mut T {
        unsafe { extend_lifetime_mut(self.ptr.deref_mut()) }
    }
}