@@ -4,45 +4,36 @@ use std::borrow;
4
4
use std:: fmt;
5
5
use std:: ops:: Deref ;
6
6
7
- pub struct PyObjectRc < T = dyn PyObjectPayload >
8
- where
9
- T : ?Sized + PyObjectPayload ,
10
- PyRc < PyObject < T > > : AsPyObjectRef ,
11
- {
7
+ pub struct PyObjectRc < T : ?Sized + AsPyObjectPayload = dyn PyObjectPayload > {
12
8
inner : PyRc < PyObject < T > > ,
13
9
}
14
10
15
- pub struct PyObjectWeak < T = dyn PyObjectPayload >
16
- where
17
- T : ?Sized + PyObjectPayload ,
18
- {
11
+ pub struct PyObjectWeak < T : ?Sized + PyObjectPayload = dyn PyObjectPayload > {
19
12
inner : PyWeak < PyObject < T > > ,
20
13
}
21
14
22
- pub trait AsPyObjectRef {
23
- fn _as_ref ( self ) -> PyRc < PyObject < dyn PyObjectPayload > > ;
15
+ // invariant: must never be constructed directly, as a &PyObjectRcB<T> should always be
16
+ // the result of PyRc<PyObject<T>>.deref()
17
+ #[ repr( transparent) ]
18
+ pub struct PyObjectRcB < T : ?Sized + AsPyObjectPayload = dyn PyObjectPayload > ( PyObject < T > ) ;
19
+
20
+ pub trait AsPyObjectPayload : PyObjectPayload {
21
+ fn rc_to_pyobj ( rc : PyRc < PyObject < Self > > ) -> PyRc < PyObject < dyn PyObjectPayload > > ;
24
22
}
25
23
26
- impl < T > AsPyObjectRef for PyRc < PyObject < T > >
27
- where
28
- T : PyObjectPayload ,
29
- {
30
- fn _as_ref ( self ) -> PyRc < PyObject < dyn PyObjectPayload > > {
31
- self
24
+ impl < T : PyObjectPayload > AsPyObjectPayload for T {
25
+ fn rc_to_pyobj ( rc : PyRc < PyObject < Self > > ) -> PyRc < PyObject < dyn PyObjectPayload > > {
26
+ rc
32
27
}
33
28
}
34
29
35
- impl AsPyObjectRef for PyRc < PyObject < dyn PyObjectPayload > > {
36
- fn _as_ref ( self ) -> PyRc < PyObject < dyn PyObjectPayload > > {
37
- self
30
+ impl AsPyObjectPayload for dyn PyObjectPayload {
31
+ fn rc_to_pyobj ( rc : PyRc < PyObject < Self > > ) -> PyRc < PyObject < dyn PyObjectPayload > > {
32
+ rc
38
33
}
39
34
}
40
35
41
- impl < T > PyObjectRc < T >
42
- where
43
- T : ?Sized + PyObjectPayload ,
44
- PyRc < PyObject < T > > : AsPyObjectRef ,
45
- {
36
+ impl < T : ?Sized + AsPyObjectPayload > PyObjectRc < T > {
46
37
pub fn into_raw ( this : Self ) -> * const PyObject < T > {
47
38
let ptr = PyRc :: as_ptr ( & this. inner ) ;
48
39
std:: mem:: forget ( this) ;
55
46
}
56
47
57
48
pub fn into_ref ( this : Self ) -> PyObjectRc < dyn PyObjectPayload > {
49
+ let rc = unsafe { Self :: into_rc ( this) } ;
58
50
PyObjectRc :: < dyn PyObjectPayload > {
59
- inner : unsafe { Self :: into_rc ( this ) } . _as_ref ( ) ,
51
+ inner : T :: rc_to_pyobj ( rc ) ,
60
52
}
61
53
}
62
54
@@ -92,50 +84,19 @@ where
92
84
}
93
85
}
94
86
95
- impl < T : ?Sized + PyObjectPayload > IdProtocol for PyObjectRc < T >
96
- where
97
- PyRc < PyObject < T > > : IdProtocol + AsPyObjectRef ,
98
- {
87
+ impl < T : ?Sized + AsPyObjectPayload > IdProtocol for PyObjectRc < T > {
99
88
fn get_id ( & self ) -> usize {
100
89
self . inner . get_id ( )
101
90
}
102
91
}
103
92
104
- impl < T > PyObjectWeak < T >
105
- where
106
- T : ?Sized + PyObjectPayload ,
107
- PyRc < PyObject < T > > : AsPyObjectRef ,
108
- {
93
+ impl < T : ?Sized + AsPyObjectPayload > PyObjectWeak < T > {
109
94
pub fn upgrade ( & self ) -> Option < PyObjectRc < T > > {
110
95
self . inner . upgrade ( ) . map ( |inner| PyObjectRc { inner } )
111
96
}
112
97
}
113
98
114
- #[ cfg( feature = "threading" ) ]
115
- unsafe impl < T > Send for PyObjectRc < T >
116
- where
117
- T : ?Sized + PyObjectPayload ,
118
- PyRc < PyObject < T > > : AsPyObjectRef ,
119
- {
120
- }
121
- #[ cfg( feature = "threading" ) ]
122
- unsafe impl < T > Sync for PyObjectRc < T >
123
- where
124
- T : ?Sized + PyObjectPayload ,
125
- PyRc < PyObject < T > > : AsPyObjectRef ,
126
- {
127
- }
128
-
129
- #[ cfg( feature = "threading" ) ]
130
- unsafe impl < T > Send for PyObjectWeak < T > where T : ?Sized + PyObjectPayload { }
131
- #[ cfg( feature = "threading" ) ]
132
- unsafe impl < T > Sync for PyObjectWeak < T > where T : ?Sized + PyObjectPayload { }
133
-
134
- impl < T > Drop for PyObjectRc < T >
135
- where
136
- T : ?Sized + PyObjectPayload ,
137
- PyRc < PyObject < T > > : AsPyObjectRef ,
138
- {
99
+ impl < T : ?Sized + AsPyObjectPayload > Drop for PyObjectRc < T > {
139
100
fn drop ( & mut self ) {
140
101
use crate :: pyobject:: BorrowValue ;
141
102
@@ -174,141 +135,105 @@ where
174
135
}
175
136
}
176
137
177
- impl < T > Deref for PyObjectRc < T >
178
- where
179
- T : ?Sized + PyObjectPayload ,
180
- PyRc < PyObject < T > > : AsPyObjectRef ,
181
- {
138
+ impl < T : ?Sized + AsPyObjectPayload > Deref for PyObjectRc < T > {
139
+ type Target = PyObjectRcB < T > ;
140
+
141
+ #[ inline]
142
+ fn deref ( & self ) -> & Self :: Target {
143
+ unsafe { & * ( self . inner . deref ( ) as * const PyObject < T > as * const PyObjectRcB < T > ) }
144
+ }
145
+ }
146
+
147
+ impl < T : ?Sized + AsPyObjectPayload > Deref for PyObjectRcB < T > {
182
148
type Target = PyObject < T > ;
183
149
184
150
#[ inline]
185
151
fn deref ( & self ) -> & PyObject < T > {
186
- self . inner . deref ( )
152
+ & self . 0
187
153
}
188
154
}
189
155
190
- impl < T > Clone for PyObjectRc < T >
191
- where
192
- T : ?Sized + PyObjectPayload ,
193
- PyRc < PyObject < T > > : AsPyObjectRef ,
194
- {
156
+ impl < T : ?Sized + AsPyObjectPayload > ToOwned for PyObjectRcB < T > {
157
+ type Owned = PyObjectRc < T > ;
158
+ fn to_owned ( & self ) -> PyObjectRc < T > {
159
+ let x = unsafe { PyObjectRc :: from_raw ( & self . 0 ) } ;
160
+ std:: mem:: forget ( x. clone ( ) ) ;
161
+ x
162
+ }
163
+ }
164
+
165
+ impl < T : ?Sized + AsPyObjectPayload > Clone for PyObjectRc < T > {
195
166
fn clone ( & self ) -> Self {
196
167
PyObjectRc {
197
168
inner : self . inner . clone ( ) ,
198
169
}
199
170
}
200
171
}
201
172
202
- impl < T > fmt:: Display for PyObjectRc < T >
173
+ impl < T : ? Sized + AsPyObjectPayload > fmt:: Display for PyObjectRc < T >
203
174
where
204
- T : ?Sized + PyObjectPayload ,
205
- PyRc < PyObject < T > > : AsPyObjectRef ,
206
175
PyObject < T > : fmt:: Display ,
207
176
{
208
177
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
209
178
self . inner . fmt ( f)
210
179
}
211
180
}
212
181
213
- impl < T > fmt:: Debug for PyObjectRc < T >
182
+ impl < T : ? Sized + AsPyObjectPayload > fmt:: Debug for PyObjectRc < T >
214
183
where
215
- T : ?Sized + PyObjectPayload ,
216
- PyRc < PyObject < T > > : AsPyObjectRef ,
217
184
PyObject < T > : fmt:: Debug ,
218
185
{
219
186
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
220
187
self . inner . fmt ( f)
221
188
}
222
189
}
223
190
224
- impl < T > fmt:: Pointer for PyObjectRc < T >
191
+ impl < T : ? Sized + AsPyObjectPayload > fmt:: Pointer for PyObjectRc < T >
225
192
where
226
- T : ?Sized + PyObjectPayload ,
227
- PyRc < PyObject < T > > : AsPyObjectRef ,
228
193
PyObject < T > : fmt:: Pointer ,
229
194
{
230
195
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
231
196
self . inner . fmt ( f)
232
197
}
233
198
}
234
199
235
- impl < T > borrow:: Borrow < T > for PyObjectRc < T >
236
- where
237
- T : ?Sized + PyObjectPayload ,
238
- PyRc < PyObject < T > > : AsPyObjectRef + borrow:: Borrow < T > ,
239
- {
240
- fn borrow ( & self ) -> & T {
241
- self . inner . borrow ( )
200
+ impl < T : ?Sized + AsPyObjectPayload > borrow:: Borrow < PyObjectRcB < T > > for PyObjectRc < T > {
201
+ fn borrow ( & self ) -> & PyObjectRcB < T > {
202
+ self
242
203
}
243
204
}
244
205
245
- impl < T > borrow:: BorrowMut < T > for PyObjectRc < T >
206
+ impl < T : ? Sized + AsPyObjectPayload > borrow:: Borrow < T > for PyObjectRc < T >
246
207
where
247
- T : ?Sized + PyObjectPayload ,
248
- PyRc < PyObject < T > > : AsPyObjectRef + borrow:: BorrowMut < T > ,
208
+ PyRc < PyObject < T > > : borrow:: Borrow < T > ,
249
209
{
250
- fn borrow_mut ( & mut self ) -> & mut T {
251
- self . inner . borrow_mut ( )
210
+ fn borrow ( & self ) -> & T {
211
+ self . inner . borrow ( )
252
212
}
253
213
}
254
214
255
- impl < T > AsRef < T > for PyObjectRc < T >
215
+ impl < T : ? Sized + AsPyObjectPayload > AsRef < T > for PyObjectRc < T >
256
216
where
257
- T : ?Sized + PyObjectPayload ,
258
- PyRc < PyObject < T > > : AsPyObjectRef + AsRef < T > ,
217
+ PyRc < PyObject < T > > : AsRef < T > ,
259
218
{
260
219
fn as_ref ( & self ) -> & T {
261
220
self . inner . as_ref ( )
262
221
}
263
222
}
264
223
265
- impl < T > Clone for PyObjectWeak < T >
266
- where
267
- T : ?Sized + PyObjectPayload ,
268
- {
224
+ impl < T : ?Sized + PyObjectPayload > Clone for PyObjectWeak < T > {
269
225
fn clone ( & self ) -> Self {
270
226
PyObjectWeak {
271
227
inner : self . inner . clone ( ) ,
272
228
}
273
229
}
274
230
}
275
231
276
- impl < T > fmt:: Debug for PyObjectWeak < T >
232
+ impl < T : ? Sized + PyObjectPayload > fmt:: Debug for PyObjectWeak < T >
277
233
where
278
- T : ?Sized + PyObjectPayload ,
279
234
PyObject < T > : fmt:: Debug ,
280
235
{
281
236
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
282
237
self . inner . fmt ( f)
283
238
}
284
239
}
285
-
286
- impl < T > borrow:: Borrow < T > for PyObjectWeak < T >
287
- where
288
- T : ?Sized + PyObjectPayload ,
289
- PyWeak < PyObject < T > > : borrow:: Borrow < T > ,
290
- {
291
- fn borrow ( & self ) -> & T {
292
- self . inner . borrow ( )
293
- }
294
- }
295
-
296
- impl < T > borrow:: BorrowMut < T > for PyObjectWeak < T >
297
- where
298
- T : ?Sized + PyObjectPayload ,
299
- PyWeak < PyObject < T > > : borrow:: BorrowMut < T > ,
300
- {
301
- fn borrow_mut ( & mut self ) -> & mut T {
302
- self . inner . borrow_mut ( )
303
- }
304
- }
305
-
306
- impl < T > AsRef < T > for PyObjectWeak < T >
307
- where
308
- T : ?Sized + PyObjectPayload ,
309
- PyWeak < PyObject < T > > : AsRef < T > ,
310
- {
311
- fn as_ref ( & self ) -> & T {
312
- self . inner . as_ref ( )
313
- }
314
- }
0 commit comments