@@ -9,12 +9,12 @@ mod _collections {
9
9
} ,
10
10
common:: lock:: { PyMutex , PyRwLock , PyRwLockReadGuard , PyRwLockWriteGuard } ,
11
11
function:: { FuncArgs , KwArgs , OptionalArg } ,
12
- protocol:: PyIterReturn ,
12
+ protocol:: { PyIterReturn , PySequenceMethods } ,
13
13
sequence:: { MutObjectSequenceOp , ObjectSequenceOp } ,
14
14
sliceable,
15
15
sliceable:: saturate_index,
16
16
types:: {
17
- Comparable , Constructor , Hashable , IterNext , IterNextIterable , Iterable ,
17
+ AsSequence , Comparable , Constructor , Hashable , IterNext , IterNextIterable , Iterable ,
18
18
PyComparisonOp , Unhashable ,
19
19
} ,
20
20
vm:: ReprGuard ,
@@ -55,7 +55,7 @@ mod _collections {
55
55
}
56
56
}
57
57
58
- #[ pyimpl( flags( BASETYPE ) , with( Comparable , Hashable , Iterable ) ) ]
58
+ #[ pyimpl( flags( BASETYPE ) , with( AsSequence , Comparable , Hashable , Iterable ) ) ]
59
59
impl PyDeque {
60
60
#[ pyslot]
61
61
fn slot_new ( cls : PyTypeRef , _args : FuncArgs , vm : & VirtualMachine ) -> PyResult {
@@ -172,9 +172,13 @@ mod _collections {
172
172
173
173
#[ pymethod]
174
174
fn extend ( & self , iter : PyObjectRef , vm : & VirtualMachine ) -> PyResult < ( ) > {
175
+ self . _extend ( & iter, vm)
176
+ }
177
+
178
+ fn _extend ( & self , iter : & PyObject , vm : & VirtualMachine ) -> PyResult < ( ) > {
175
179
self . state . fetch_add ( 1 ) ;
176
180
let max_len = self . maxlen ;
177
- let mut elements: Vec < PyObjectRef > = vm. extract_elements ( & iter) ?;
181
+ let mut elements: Vec < PyObjectRef > = vm. extract_elements ( iter) ?;
178
182
if let Some ( max_len) = max_len {
179
183
if max_len > elements. len ( ) {
180
184
let mut deque = self . borrow_deque_mut ( ) ;
@@ -383,8 +387,12 @@ mod _collections {
383
387
384
388
#[ pymethod( magic) ]
385
389
fn contains ( & self , needle : PyObjectRef , vm : & VirtualMachine ) -> PyResult < bool > {
390
+ self . _contains ( & needle, vm)
391
+ }
392
+
393
+ fn _contains ( & self , needle : & PyObject , vm : & VirtualMachine ) -> PyResult < bool > {
386
394
let start_state = self . state . load ( ) ;
387
- let ret = self . mut_contains ( vm, & needle) ?;
395
+ let ret = self . mut_contains ( vm, needle) ?;
388
396
if start_state != self . state . load ( ) {
389
397
Err ( vm. new_runtime_error ( "deque mutated during iteration" . to_owned ( ) ) )
390
398
} else {
@@ -436,6 +444,10 @@ mod _collections {
436
444
437
445
#[ pymethod( magic) ]
438
446
fn add ( & self , other : PyObjectRef , vm : & VirtualMachine ) -> PyResult < Self > {
447
+ self . concat ( & other, vm)
448
+ }
449
+
450
+ fn concat ( & self , other : & PyObject , vm : & VirtualMachine ) -> PyResult < Self > {
439
451
if let Some ( o) = other. payload_if_subclass :: < PyDeque > ( vm) {
440
452
let mut deque = self . borrow_deque ( ) . clone ( ) ;
441
453
let elements = o. borrow_deque ( ) . clone ( ) ;
@@ -498,6 +510,51 @@ mod _collections {
498
510
}
499
511
}
500
512
513
+ impl AsSequence for PyDeque {
514
+ fn as_sequence (
515
+ _zelf : & crate :: PyObjectView < Self > ,
516
+ _vm : & VirtualMachine ,
517
+ ) -> std:: borrow:: Cow < ' static , PySequenceMethods > {
518
+ std:: borrow:: Cow :: Borrowed ( & Self :: SEQUENCE_METHDOS )
519
+ }
520
+ }
521
+
522
+ impl PyDeque {
523
+ const SEQUENCE_METHDOS : PySequenceMethods = PySequenceMethods {
524
+ length : Some ( |seq, _vm| Ok ( seq. obj_as :: < Self > ( ) . len ( ) ) ) ,
525
+ concat : Some ( |seq, other, vm| {
526
+ seq. obj_as :: < Self > ( )
527
+ . concat ( other, vm)
528
+ . map ( |x| x. into_ref ( vm) . into ( ) )
529
+ } ) ,
530
+ repeat : Some ( |seq, n, vm| {
531
+ seq. obj_as :: < Self > ( )
532
+ . mul ( n as isize , vm)
533
+ . map ( |x| x. into_ref ( vm) . into ( ) )
534
+ } ) ,
535
+ item : Some ( |seq, i, vm| seq. obj_as :: < Self > ( ) . getitem ( i, vm) ) ,
536
+ ass_item : Some ( |seq, i, value, vm| {
537
+ let zelf = seq. obj_as :: < Self > ( ) ;
538
+ if let Some ( value) = value {
539
+ zelf. setitem ( i, value, vm)
540
+ } else {
541
+ zelf. delitem ( i, vm)
542
+ }
543
+ } ) ,
544
+ contains : Some ( |seq, needle, vm| seq. obj_as :: < Self > ( ) . _contains ( needle, vm) ) ,
545
+ inplace_concat : Some ( |seq, other, vm| {
546
+ let zelf = seq. obj_as :: < Self > ( ) ;
547
+ zelf. _extend ( other, vm) ?;
548
+ Ok ( zelf. to_owned ( ) . into ( ) )
549
+ } ) ,
550
+ inplace_repeat : Some ( |seq, n, vm| {
551
+ let zelf = seq. obj_as :: < Self > ( ) ;
552
+ Self :: imul ( zelf. to_owned ( ) , n as isize , vm) . map ( |x| x. into ( ) )
553
+ } ) ,
554
+ ..* PySequenceMethods :: not_implemented ( )
555
+ } ;
556
+ }
557
+
501
558
impl Comparable for PyDeque {
502
559
fn cmp (
503
560
zelf : & crate :: PyObjectView < Self > ,
0 commit comments