1 use std::{marker::PhantomData, ops::Deref};
3 pub struct Ref<'a, T> {
5 _phantom: PhantomData<&'a T>
8 impl<'a, T> Copy for Ref<'a, T> { }
10 impl<'a, T> Clone for Ref<'a, T> {
11 fn clone(&self) -> Self {
16 impl<'a, T> Ref<'a, T> {
17 pub fn new(p: &'a T) -> Self {
18 Ref { ptr: p as *const T, _phantom: PhantomData}
20 pub unsafe fn null() -> Self {
21 Ref { ptr: std::ptr::null(), _phantom: PhantomData}
23 pub fn is_null(&self) -> bool {
26 pub fn get_ref(self) -> &'a T {
31 impl<'a, T> PartialEq for Ref<'a, T> {
32 fn eq(&self, other: &Self) -> bool {
33 self.ptr == other.ptr && self._phantom == other._phantom
37 impl<'a, T> PartialOrd for Ref<'a, T> {
38 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
39 match self.ptr.partial_cmp(&other.ptr) {
40 Some(core::cmp::Ordering::Equal) => {}
43 self._phantom.partial_cmp(&other._phantom)
47 impl<'a, T> Deref for Ref<'a, T> {
50 fn deref(&self) -> &Self::Target {