@@ -21,7 +21,6 @@ static INITIAL_CAPACITY: uint = 32u; // 2^5
21
21
pub struct Deque < T > {
22
22
priv nelts : uint ,
23
23
priv lo: uint ,
24
- priv hi: uint ,
25
24
priv elts : ~[ Option < T > ]
26
25
}
27
26
@@ -39,26 +38,31 @@ impl<T> Mutable for Deque<T> {
39
38
for self . elts. mut_iter( ) . advance |x| { * x = None }
40
39
self . nelts = 0 ;
41
40
self . lo = 0 ;
42
- self . hi = 0 ;
43
41
}
44
42
}
45
43
46
44
impl <T > Deque < T > {
47
45
/// Create an empty Deque
48
46
pub fn new( ) -> Deque < T > {
49
- Deque { nelts : 0 , lo : 0 , hi : 0 ,
47
+ Deque { nelts : 0 , lo : 0 ,
50
48
elts : vec:: from_fn( INITIAL_CAPACITY , |_| None ) }
51
49
}
52
50
53
51
/// Return a reference to the first element in the deque
54
52
///
55
53
/// Fails if the deque is empty
56
- pub fn peek_front < ' a > ( & ' a self ) -> & ' a T { get ( self . elts , self . lo ) }
54
+ pub fn peek_front < ' a > ( & ' a self ) -> & ' a T { get ( self . elts , self . raw_index ( 0 ) ) }
57
55
58
56
/// Return a reference to the last element in the deque
59
57
///
60
58
/// Fails if the deque is empty
61
- pub fn peek_back < ' a > ( & ' a self ) -> & ' a T { get ( self . elts , self . hi - 1 u) }
59
+ pub fn peek_back < ' a > ( & ' a self ) -> & ' a T {
60
+ if self . nelts > 0 {
61
+ get ( self . elts , self . raw_index ( self . nelts - 1 ) )
62
+ } else {
63
+ fail ! ( "peek_back: empty deque" ) ;
64
+ }
65
+ }
62
66
63
67
/// Retrieve an element in the deque by index
64
68
///
@@ -88,24 +92,28 @@ impl<T> Deque<T> {
88
92
result
89
93
}
90
94
95
+ /// Return index in underlying vec for element index
96
+ fn raw_index ( & self , idx : uint ) -> uint {
97
+ if self . lo >= self . elts . len ( ) - idx {
98
+ ( self . lo + idx) - self . elts . len ( )
99
+ } else {
100
+ ( self . lo + idx)
101
+ }
102
+ }
103
+
91
104
/// Remove and return the last element in the deque
92
105
///
93
106
/// Fails if the deque is empty
94
107
pub fn pop_back ( & mut self ) -> T {
95
- if self . hi == 0 u {
96
- self . hi = self . elts . len ( ) - 1 u;
97
- } else { self . hi -= 1 u; }
98
- let result = self . elts [ self . hi ] . swap_unwrap ( ) ;
99
- self . elts [ self . hi ] = None ;
100
- self . nelts -= 1 u;
101
- result
108
+ self . nelts -= 1 ;
109
+ let hi = self . raw_index ( self . nelts ) ;
110
+ self . elts [ hi] . swap_unwrap ( )
102
111
}
103
112
104
113
/// Prepend an element to the deque
105
114
pub fn add_front ( & mut self , t : T ) {
106
115
if self . nelts == self . elts . len ( ) {
107
116
grow ( self . nelts , self . lo , & mut self . elts ) ;
108
- self . hi = self . lo + self . nelts ;
109
117
}
110
118
if self . lo == 0 u {
111
119
self . lo = self . elts . len ( ) - 1 u;
@@ -116,15 +124,11 @@ impl<T> Deque<T> {
116
124
117
125
/// Append an element to the deque
118
126
pub fn add_back ( & mut self , t : T ) {
119
- if self . lo == self . hi && self . nelts != 0 u {
127
+ if self . nelts == self . elts . len ( ) {
120
128
grow ( self . nelts , self . lo , & mut self . elts ) ;
121
- self . hi = self . lo + self . nelts ;
122
- }
123
- self . elts [ self . hi ] = Some ( t) ;
124
- self . hi += 1 ;
125
- if self . hi == self . elts . len ( ) {
126
- self . hi = 0 ;
127
129
}
130
+ let hi = self . raw_index ( self . nelts ) ;
131
+ self . elts [ hi] = Some ( t) ;
128
132
self . nelts += 1 u;
129
133
}
130
134
@@ -165,12 +169,12 @@ impl<T> Deque<T> {
165
169
166
170
/// Back-to-front iterator.
167
171
pub fn rev_iter < ' a > ( & ' a self ) -> DequeRevIterator < ' a , T > {
168
- DequeRevIterator { idx : self . hi - 1 u , nelts : self . nelts , used : 0 , vec : self . elts }
172
+ DequeRevIterator { idx : self . raw_index ( self . nelts - 1 ) , nelts : self . nelts , used : 0 , vec : self . elts }
169
173
}
170
174
171
175
/// Back-to-front iterator which returns mutable values.
172
176
pub fn mut_rev_iter < ' a > ( & ' a mut self ) -> DequeMutRevIterator < ' a , T > {
173
- DequeMutRevIterator { idx : self . hi - 1 u , nelts : self . nelts , used : 0 , vec : self . elts }
177
+ DequeMutRevIterator { idx : self . raw_index ( self . nelts - 1 ) , nelts : self . nelts , used : 0 , vec : self . elts }
174
178
}
175
179
}
176
180
0 commit comments