@@ -47,6 +47,7 @@ struct Node<T> {
47
47
}
48
48
49
49
/// Double-ended DList iterator
50
+ #[ deriving( Clone ) ]
50
51
pub struct DListIterator < ' self , T > {
51
52
priv head : & ' self Link < T > ,
52
53
priv tail : Rawlink < Node < T > > ,
@@ -62,6 +63,7 @@ pub struct MutDListIterator<'self, T> {
62
63
}
63
64
64
65
/// DList consuming iterator
66
+ #[ deriving( Clone ) ]
65
67
pub struct ConsumeIterator < T > {
66
68
priv list : DList < T >
67
69
}
@@ -93,6 +95,13 @@ impl<T> Rawlink<T> {
93
95
}
94
96
}
95
97
98
+ impl < T > Clone for Rawlink < T > {
99
+ #[ inline]
100
+ fn clone ( & self ) -> Rawlink < T > {
101
+ Rawlink { p : self . p }
102
+ }
103
+ }
104
+
96
105
/// Set the .prev field on `next`, then return `Some(next)`
97
106
fn link_with_prev < T > ( mut next : ~Node < T > , prev : Rawlink < Node < T > > ) -> Link < T > {
98
107
next. prev = prev;
@@ -686,6 +695,20 @@ mod tests {
686
695
assert_eq ! ( it. next( ) , None ) ;
687
696
}
688
697
698
+ #[ test]
699
+ fn test_iterator_clone ( ) {
700
+ let mut n = DList : : new( ) ;
701
+ n. push_back( 2 ) ;
702
+ n. push_back( 3 ) ;
703
+ n. push_back( 4 ) ;
704
+ let mut it = n. iter( ) ;
705
+ it. next( ) ;
706
+ let mut jt = it. clone( ) ;
707
+ assert_eq ! ( it. next( ) , jt. next( ) ) ;
708
+ assert_eq ! ( it. next_back( ) , jt. next_back( ) ) ;
709
+ assert_eq ! ( it. next( ) , jt. next( ) ) ;
710
+ }
711
+
689
712
#[ test]
690
713
fn test_iterator_double_end( ) {
691
714
let mut n = DList :: new( ) ;
0 commit comments