@@ -7,22 +7,53 @@ use std::ops::Deref;
7
7
pub struct PyObjectRc < T = dyn PyObjectPayload >
8
8
where
9
9
T : ?Sized + PyObjectPayload ,
10
+ PyRc < PyObject < T > > : AsPyObjectRef ,
10
11
{
11
12
inner : PyRc < PyObject < T > > ,
12
13
}
13
14
14
15
pub type PyObjectWeak < T = dyn PyObjectPayload > = PyWeak < PyObject < T > > ;
15
16
17
+ pub trait AsPyObjectRef {
18
+ fn _as_ref ( self ) -> PyRc < PyObject < dyn PyObjectPayload > > ;
19
+ }
20
+
21
+ impl < T > AsPyObjectRef for PyRc < PyObject < T > >
22
+ where
23
+ T : PyObjectPayload ,
24
+ {
25
+ fn _as_ref ( self ) -> PyRc < PyObject < dyn PyObjectPayload > > {
26
+ self
27
+ }
28
+ }
29
+
30
+ impl AsPyObjectRef for PyRc < PyObject < dyn PyObjectPayload > > {
31
+ fn _as_ref ( self ) -> PyRc < PyObject < dyn PyObjectPayload > > {
32
+ self
33
+ }
34
+ }
35
+
16
36
impl < T > PyObjectRc < T >
17
37
where
18
38
T : ?Sized + PyObjectPayload ,
39
+ PyRc < PyObject < T > > : AsPyObjectRef ,
19
40
{
20
41
pub fn into_raw ( this : Self ) -> * const PyObject < T > {
21
42
let ptr = PyRc :: as_ptr ( & this. inner ) ;
22
43
std:: mem:: forget ( this) ;
23
44
ptr
24
45
}
25
46
47
+ unsafe fn into_rc ( this : Self ) -> PyRc < PyObject < T > > {
48
+ std:: mem:: transmute ( this)
49
+ }
50
+
51
+ pub fn into_ref ( this : Self ) -> PyObjectRc < dyn PyObjectPayload > {
52
+ PyObjectRc :: < dyn PyObjectPayload > {
53
+ inner : unsafe { Self :: into_rc ( this) } . _as_ref ( ) ,
54
+ }
55
+ }
56
+
26
57
/// # Safety
27
58
/// See PyRc::from_raw
28
59
pub unsafe fn from_raw ( ptr : * const PyObject < T > ) -> Self {
@@ -58,13 +89,24 @@ where
58
89
}
59
90
60
91
#[ cfg( feature = "threading" ) ]
61
- unsafe impl < T > Send for PyObjectRc < T > where T : ?Sized + PyObjectPayload { }
92
+ unsafe impl < T > Send for PyObjectRc < T >
93
+ where
94
+ T : ?Sized + PyObjectPayload ,
95
+ PyRc < PyObject < T > > : AsPyObjectRef ,
96
+ {
97
+ }
62
98
#[ cfg( feature = "threading" ) ]
63
- unsafe impl < T > Sync for PyObjectRc < T > where T : ?Sized + PyObjectPayload { }
99
+ unsafe impl < T > Sync for PyObjectRc < T >
100
+ where
101
+ T : ?Sized + PyObjectPayload ,
102
+ PyRc < PyObject < T > > : AsPyObjectRef ,
103
+ {
104
+ }
64
105
65
106
impl < T > Deref for PyObjectRc < T >
66
107
where
67
108
T : ?Sized + PyObjectPayload ,
109
+ PyRc < PyObject < T > > : AsPyObjectRef ,
68
110
{
69
111
type Target = PyObject < T > ;
70
112
77
119
impl < T > Clone for PyObjectRc < T >
78
120
where
79
121
T : ?Sized + PyObjectPayload ,
122
+ PyRc < PyObject < T > > : AsPyObjectRef ,
80
123
{
81
124
fn clone ( & self ) -> Self {
82
125
PyObjectRc {
88
131
impl < T > fmt:: Display for PyObjectRc < T >
89
132
where
90
133
T : ?Sized + PyObjectPayload ,
134
+ PyRc < PyObject < T > > : AsPyObjectRef ,
91
135
PyObject < T > : fmt:: Display ,
92
136
{
93
137
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
98
142
impl < T > fmt:: Debug for PyObjectRc < T >
99
143
where
100
144
T : ?Sized + PyObjectPayload ,
145
+ PyRc < PyObject < T > > : AsPyObjectRef ,
101
146
PyObject < T > : fmt:: Debug ,
102
147
{
103
148
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
@@ -108,6 +153,7 @@ where
108
153
impl < T > fmt:: Pointer for PyObjectRc < T >
109
154
where
110
155
T : ?Sized + PyObjectPayload ,
156
+ PyRc < PyObject < T > > : AsPyObjectRef ,
111
157
PyObject < T > : fmt:: Pointer ,
112
158
{
113
159
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
@@ -118,7 +164,7 @@ where
118
164
impl < T > borrow:: Borrow < T > for PyObjectRc < T >
119
165
where
120
166
T : ?Sized + PyObjectPayload ,
121
- PyRc < PyObject < T > > : borrow:: Borrow < T > ,
167
+ PyRc < PyObject < T > > : AsPyObjectRef + borrow:: Borrow < T > ,
122
168
{
123
169
fn borrow ( & self ) -> & T {
124
170
self . inner . borrow ( )
@@ -128,7 +174,7 @@ where
128
174
impl < T > AsRef < T > for PyObjectRc < T >
129
175
where
130
176
T : ?Sized + PyObjectPayload ,
131
- PyRc < PyObject < T > > : AsRef < T > ,
177
+ PyRc < PyObject < T > > : AsPyObjectRef + AsRef < T > ,
132
178
{
133
179
fn as_ref ( & self ) -> & T {
134
180
self . inner . as_ref ( )
0 commit comments