1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
use std::rc::{Rc, Weak};

use crate::rc_by_ptr::RcByPtr;

use std::hash::{Hash, Hasher};

/// A Container for comparing and hashing weakly-reference counted values by reference.
pub struct WeakByPtr<T: ?Sized> //: ?Sized
{

    contents: Weak<T>

}

impl<T: ?Sized> WeakByPtr<T> //: ?Sized
{

    pub fn new(contents: Weak<T>) -> Self
    {

        Self
        {

            contents

        }

    }

    pub fn from_rc(rc_contents: &Rc<T>) -> Self
    {

        Self
        {

            contents: Rc::downgrade(rc_contents)

        }

    }

    pub fn from_clone(contents: &Weak<T>) -> Self
    {

        Self
        {

            contents: contents.clone()

        }

    }

    pub fn get_contents_ref(&self) -> &Weak<T>
    {

        &self.contents

    }

    pub fn upgrade(&self) -> Option<Rc<T>>
    {

        self.contents.upgrade()

    }

    pub fn upgrade_eq(&self) -> Option<RcByPtr<T>>
    {

        if let Some(rc) = self.contents.upgrade()
        {

            Some(RcByPtr::new(rc))

        }
        else
        {

            None
            
        }

    }

    pub fn strong_count(&self) -> usize
    {

        self.contents.strong_count()

    }

    pub fn weak_count(&self) -> usize
    {

        self.contents.weak_count()

    }

}

impl<T: ?Sized> PartialEq for WeakByPtr<T> //: ?Sized
{

    fn eq(&self, other: &Self) -> bool
    {

        self.contents.ptr_eq(other.get_contents_ref())

    }


}

impl<T: ?Sized> Eq for WeakByPtr<T> {} //: ?Sized

impl<T: ?Sized> Hash for WeakByPtr<T>
{

    fn hash<H: Hasher>(&self, state: &mut H)
    {

        Weak::as_ptr(&self.contents).hash(state);

    }

}