Skip to content

Commit 5d72f3f

Browse files
author
blake2-ppc
committed
deque: Remove rendundant field hi
The deque is determined by vec self.elts.len(), self.nelts, and self.lo, and self.hi is calculated from these. self.hi is just the raw index of element number `self.nelts`
1 parent 08dc72f commit 5d72f3f

File tree

1 file changed

+26
-22
lines changed

1 file changed

+26
-22
lines changed

src/libextra/deque.rs

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ static INITIAL_CAPACITY: uint = 32u; // 2^5
2121
pub struct Deque<T> {
2222
priv nelts: uint,
2323
priv lo: uint,
24-
priv hi: uint,
2524
priv elts: ~[Option<T>]
2625
}
2726

@@ -39,26 +38,31 @@ impl<T> Mutable for Deque<T> {
3938
for self.elts.mut_iter().advance |x| { *x = None }
4039
self.nelts = 0;
4140
self.lo = 0;
42-
self.hi = 0;
4341
}
4442
}
4543

4644
impl<T> Deque<T> {
4745
/// Create an empty Deque
4846
pub fn new() -> Deque<T> {
49-
Deque{nelts: 0, lo: 0, hi: 0,
47+
Deque{nelts: 0, lo: 0,
5048
elts: vec::from_fn(INITIAL_CAPACITY, |_| None)}
5149
}
5250

5351
/// Return a reference to the first element in the deque
5452
///
5553
/// 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)) }
5755

5856
/// Return a reference to the last element in the deque
5957
///
6058
/// Fails if the deque is empty
61-
pub fn peek_back<'a>(&'a self) -> &'a T { get(self.elts, self.hi - 1u) }
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+
}
6266

6367
/// Retrieve an element in the deque by index
6468
///
@@ -88,24 +92,28 @@ impl<T> Deque<T> {
8892
result
8993
}
9094

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+
91104
/// Remove and return the last element in the deque
92105
///
93106
/// Fails if the deque is empty
94107
pub fn pop_back(&mut self) -> T {
95-
if self.hi == 0u {
96-
self.hi = self.elts.len() - 1u;
97-
} else { self.hi -= 1u; }
98-
let result = self.elts[self.hi].swap_unwrap();
99-
self.elts[self.hi] = None;
100-
self.nelts -= 1u;
101-
result
108+
self.nelts -= 1;
109+
let hi = self.raw_index(self.nelts);
110+
self.elts[hi].swap_unwrap()
102111
}
103112

104113
/// Prepend an element to the deque
105114
pub fn add_front(&mut self, t: T) {
106115
if self.nelts == self.elts.len() {
107116
grow(self.nelts, self.lo, &mut self.elts);
108-
self.hi = self.lo + self.nelts;
109117
}
110118
if self.lo == 0u {
111119
self.lo = self.elts.len() - 1u;
@@ -116,15 +124,11 @@ impl<T> Deque<T> {
116124

117125
/// Append an element to the deque
118126
pub fn add_back(&mut self, t: T) {
119-
if self.lo == self.hi && self.nelts != 0u {
127+
if self.nelts == self.elts.len() {
120128
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;
127129
}
130+
let hi = self.raw_index(self.nelts);
131+
self.elts[hi] = Some(t);
128132
self.nelts += 1u;
129133
}
130134

@@ -165,12 +169,12 @@ impl<T> Deque<T> {
165169

166170
/// Back-to-front iterator.
167171
pub fn rev_iter<'a>(&'a self) -> DequeRevIterator<'a, T> {
168-
DequeRevIterator { idx: self.hi - 1u, 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 }
169173
}
170174

171175
/// Back-to-front iterator which returns mutable values.
172176
pub fn mut_rev_iter<'a>(&'a mut self) -> DequeMutRevIterator<'a, T> {
173-
DequeMutRevIterator { idx: self.hi - 1u, 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 }
174178
}
175179
}
176180

0 commit comments

Comments
 (0)