oo_bindgen/model/
handle.rs

1use std::fmt::Debug;
2use std::hash::Hash;
3use std::ops::Deref;
4use std::ptr;
5use std::rc::Rc;
6
7pub struct Handle<T> {
8    inner: Rc<T>,
9}
10
11impl<T> Handle<T> {
12    pub(crate) fn new(inner: T) -> Self {
13        Self {
14            inner: Rc::new(inner),
15        }
16    }
17}
18
19impl<T: Debug> Debug for Handle<T> {
20    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21        self.inner.fmt(f)
22    }
23}
24
25impl<T> Clone for Handle<T> {
26    fn clone(&self) -> Self {
27        Self {
28            inner: self.inner.clone(),
29        }
30    }
31}
32
33impl<T> Hash for Handle<T> {
34    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
35        ptr::hash(&*self.inner, state)
36    }
37}
38
39impl<T> PartialEq for Handle<T> {
40    fn eq(&self, other: &Self) -> bool {
41        Rc::ptr_eq(&self.inner, &other.inner)
42    }
43}
44
45impl<T> Eq for Handle<T> {}
46
47impl<T> Deref for Handle<T> {
48    type Target = T;
49
50    fn deref(&self) -> &T {
51        &self.inner
52    }
53}