logic_eval_util/
reference.rs1use std::{marker::PhantomData, ptr::NonNull};
2
3#[derive(Debug)]
12pub struct Ref<'a, T: 'a + ?Sized> {
13 ptr: NonNull<T>,
14 _marker: PhantomData<&'a T>,
15}
16
17impl<'a, T: 'a + ?Sized> Ref<'a, T> {
18 pub const fn from_ref(r: &'a T) -> Self {
19 let ptr = unsafe { NonNull::new_unchecked(r as *const T as *mut T) };
21 Self {
22 ptr,
23 _marker: PhantomData,
24 }
25 }
26
27 pub fn from_mut(r: &'a mut T) -> Self {
28 let ptr = unsafe { NonNull::new_unchecked(r as *mut T) };
30 Self {
31 ptr,
32 _marker: PhantomData,
33 }
34 }
35
36 #[allow(clippy::should_implement_trait)]
39 pub fn as_ref(&self) -> &'a T {
40 unsafe { self.ptr.as_ref() }
42 }
43
44 pub const fn as_nonnull(self) -> NonNull<T> {
45 self.ptr
46 }
47
48 pub const fn as_ptr(self) -> *mut T {
49 self.ptr.as_ptr()
50 }
51}
52
53impl<'a, T: 'a + ?Sized> Clone for Ref<'a, T> {
54 fn clone(&self) -> Self {
55 *self
56 }
57}
58
59impl<'a, T: 'a + ?Sized> Copy for Ref<'a, T> {}