/// Returns true iff the buffer is at capacity
#[inline]
fn is_full(&self) -> bool { self.cap - self.len() == 1 }
+
+ /// Returns the index in the underlying buffer for a given logical element index.
+ #[inline]
+ fn wrap_index(&self, idx: uint) -> uint { wrap_index(idx, self.cap) }
}
impl<T> RingBuf<T> {
#[unstable = "matches collection reform specification, waiting for dust to settle"]
pub fn get(&self, i: uint) -> Option<&T> {
if i < self.len() {
- let idx = wrap_index(self.tail + i, self.cap);
+ let idx = self.wrap_index(self.tail + i);
unsafe { Some(&*self.ptr.offset(idx as int)) }
} else {
None
#[unstable = "matches collection reform specification, waiting for dust to settle"]
pub fn get_mut(&mut self, i: uint) -> Option<&mut T> {
if i < self.len() {
- let idx = wrap_index(self.tail + i, self.cap);
+ let idx = self.wrap_index(self.tail + i);
unsafe { Some(&mut *self.ptr.offset(idx as int)) }
} else {
None
pub fn swap(&mut self, i: uint, j: uint) {
assert!(i < self.len());
assert!(j < self.len());
- let ri = wrap_index(self.tail + i, self.cap);
- let rj = wrap_index(self.tail + j, self.cap);
+ let ri = self.wrap_index(self.tail + i);
+ let rj = self.wrap_index(self.tail + j);
unsafe {
ptr::swap(self.ptr.offset(ri as int), self.ptr.offset(rj as int))
}
}
debug_assert!(self.head < self.cap);
debug_assert!(self.tail < self.cap);
+ debug_assert!(self.cap.count_ones() == 1);
}
}
None
} else {
let tail = self.tail;
- self.tail = wrap_index(self.tail + 1, self.cap);
+ self.tail = self.wrap_index(self.tail + 1);
unsafe { Some(self.buffer_read(tail)) }
}
}
debug_assert!(!self.is_full());
}
- self.tail = wrap_index(self.tail - 1, self.cap);
+ self.tail = self.wrap_index(self.tail - 1);
let tail = self.tail;
unsafe { self.buffer_write(tail, t); }
}
}
let head = self.head;
- self.head = wrap_index(self.head + 1, self.cap);
+ self.head = self.wrap_index(self.head + 1);
unsafe { self.buffer_write(head, t) }
}
if self.is_empty() {
None
} else {
- self.head = wrap_index(self.head - 1, self.cap);
+ self.head = self.wrap_index(self.head - 1);
let head = self.head;
unsafe { Some(self.buffer_read(head)) }
}
#[inline]
fn wrap_index(index: uint, size: uint) -> uint {
// size is always a power of 2
- let idx = index & (size - 1);
- debug_assert!(idx < size);
- idx
+ index & (size - 1)
}
/// Calculate the number of elements left to be read in the buffer