@@ -4,14 +4,14 @@ use crate::pyobject::{IdProtocol, PyClassImpl, PyIterable, PyObjectRef, PyRef, P
4
4
use crate :: vm:: ReprGuard ;
5
5
use crate :: VirtualMachine ;
6
6
use itertools:: Itertools ;
7
- use std:: cell:: RefCell ;
7
+ use std:: cell:: { Cell , RefCell } ;
8
8
use std:: collections:: VecDeque ;
9
9
10
10
#[ pyclass( name = "deque" ) ]
11
11
#[ derive( Debug , Clone ) ]
12
12
struct PyDeque {
13
13
deque : RefCell < VecDeque < PyObjectRef > > ,
14
- maxlen : Option < usize > ,
14
+ maxlen : Cell < Option < usize > > ,
15
15
}
16
16
17
17
impl PyValue for PyDeque {
@@ -20,7 +20,6 @@ impl PyValue for PyDeque {
20
20
}
21
21
}
22
22
23
-
24
23
#[ pyimpl]
25
24
impl PyDeque {
26
25
#[ pymethod( name = "__new__" ) ]
@@ -37,30 +36,26 @@ impl PyDeque {
37
36
} ;
38
37
PyDeque {
39
38
deque : RefCell :: new ( deque) ,
40
- maxlen : maxlen. into_option ( ) . and_then ( |x| x) ,
39
+ maxlen : maxlen. into_option ( ) . and_then ( |x| x) . into ( ) ,
41
40
}
42
41
. into_ref_with_type ( vm, cls)
43
42
}
44
43
45
44
#[ pymethod]
46
45
fn append ( & self , obj : PyObjectRef , _vm : & VirtualMachine ) {
47
46
let mut deque = self . deque . borrow_mut ( ) ;
48
- if let Some ( maxlen) = self . maxlen {
49
- if deque. len ( ) == maxlen {
47
+ if self . maxlen . get ( ) == Some ( deque. len ( ) ) {
50
48
deque. pop_front ( ) ;
51
49
}
52
- }
53
50
deque. push_back ( obj) ;
54
51
}
55
52
56
53
#[ pymethod]
57
54
fn appendleft ( & self , obj : PyObjectRef , _vm : & VirtualMachine ) {
58
55
let mut deque = self . deque . borrow_mut ( ) ;
59
- if let Some ( maxlen) = self . maxlen {
60
- if deque. len ( ) == maxlen {
56
+ if self . maxlen . get ( ) == Some ( deque. len ( ) ) {
61
57
deque. pop_back ( ) ;
62
58
}
63
- }
64
59
deque. push_front ( obj) ;
65
60
}
66
61
@@ -129,11 +124,9 @@ impl PyDeque {
129
124
fn insert ( & self , idx : i32 , obj : PyObjectRef , vm : & VirtualMachine ) -> PyResult < ( ) > {
130
125
let mut deque = self . deque . borrow_mut ( ) ;
131
126
132
- if let Some ( maxlen) = self . maxlen {
133
- if deque. len ( ) == maxlen {
127
+ if self . maxlen . get ( ) == Some ( deque. len ( ) ) {
134
128
return Err ( vm. new_index_error ( "deque already at its maximum size" . to_string ( ) ) ) ;
135
129
}
136
- }
137
130
138
131
let idx = if idx < 0 {
139
132
if -idx as usize > deque. len ( ) {
@@ -210,7 +203,12 @@ impl PyDeque {
210
203
211
204
#[ pyproperty]
212
205
fn maxlen ( & self , _vm : & VirtualMachine ) -> Option < usize > {
213
- self . maxlen
206
+ self . maxlen . get ( )
207
+ }
208
+ #[ pyproperty( setter) ]
209
+ fn set_maxlen ( & self , maxlen : Option < usize > , vm : & VirtualMachine ) -> PyResult {
210
+ self . maxlen . set ( maxlen) ;
211
+ Ok ( vm. get_none ( ) )
214
212
}
215
213
216
214
#[ pymethod( name = "__repr__" ) ]
@@ -224,6 +222,7 @@ impl PyDeque {
224
222
. collect :: < Result < Vec < _ > , _ > > ( ) ?;
225
223
let maxlen = zelf
226
224
. maxlen
225
+ . get ( )
227
226
. map ( |maxlen| format ! ( ", maxlen={}" , maxlen) )
228
227
. unwrap_or_default ( ) ;
229
228
format ! ( "deque([{}]{})" , elements. into_iter( ) . format( ", " ) , maxlen)
0 commit comments