about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libcollections/ring_buf.rs25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/libcollections/ring_buf.rs b/src/libcollections/ring_buf.rs
index 1024a2828b3..359dffa0853 100644
--- a/src/libcollections/ring_buf.rs
+++ b/src/libcollections/ring_buf.rs
@@ -98,6 +98,10 @@ impl<T> RingBuf<T> {
     /// 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> {
@@ -149,7 +153,7 @@ 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
@@ -179,7 +183,7 @@ impl<T> RingBuf<T> {
     #[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
@@ -208,8 +212,8 @@ impl<T> RingBuf<T> {
     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))
         }
@@ -334,6 +338,7 @@ impl<T> RingBuf<T> {
             }
             debug_assert!(self.head < self.cap);
             debug_assert!(self.tail < self.cap);
+            debug_assert!(self.cap.count_ones() == 1);
         }
     }
 
@@ -549,7 +554,7 @@ impl<T> RingBuf<T> {
             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)) }
         }
     }
@@ -573,7 +578,7 @@ impl<T> RingBuf<T> {
             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); }
     }
@@ -604,7 +609,7 @@ impl<T> RingBuf<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) }
     }
 
@@ -633,7 +638,7 @@ impl<T> RingBuf<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)) }
         }
@@ -644,9 +649,7 @@ impl<T> RingBuf<T> {
 #[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