use super::RingBuffer;
use std::cmp::{Eq, PartialEq};
use std::fmt::{Debug, Error, Formatter};
use std::ops::Index;
#[cfg(feature = "serde")]
mod serde;
impl<T> Debug for RingBuffer<T>
where
T: Debug,
{
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
if self.is_empty() {
f.write_str("RingBuffer[Empty] ( ")?;
let padding = "_, ".repeat(self.cap);
let padding = &padding[..padding.len() - 2];
f.write_str(padding)?;
f.write_str(" )")
} else if self.begin < self.end {
let empty_head = self.begin;
let empty_tail = self.cap - self.end - 1;
f.write_str("RingBuffer ( ")?;
let padding = "_, ".repeat(empty_head);
f.write_str(&padding)?;
write!(f, "[ ")?;
for (i, el) in self.iter().rev().enumerate() {
write!(f, "{:?}", el)?;
if i < self.len - 1 {
write!(f, ", ")?;
}
}
write!(f, " ]")?;
if empty_tail > 0 {
write!(f, ", ")?;
let padding = "_, ".repeat(empty_tail);
let padding = &padding[..padding.len() - 2];
f.write_str(padding)?;
}
f.write_str(" )")
} else if self.end < self.begin {
write!(f, "RingBuffer ( ")?;
for (i, el) in self.iter().rev().enumerate().skip(self.cap - self.begin) {
write!(f, "{:?}", el)?;
if i != self.len - 1 {
write!(f, ", ")?;
}
}
write!(f, " ], ")?;
println!("end {} begin {}", self.end, self.begin);
let empty_gulf = self.begin - self.end - 1;
let padding = "_, ".repeat(empty_gulf);
f.write_str(&padding)?;
write!(f, "[ ")?;
for el in self.iter().rev().take(self.cap - self.begin - 1) {
write!(f, "{:?}, ", el)?;
}
write!(
f,
"{:?} )",
self.iter()
.rev()
.skip(self.cap - self.begin - 1)
.take(1)
.next()
.unwrap()
)
} else {
debug_assert_eq!(self.len(), 1);
write!(f, "RingBuffer ( ")?;
let head = "_, ".repeat(self.begin);
f.write_str(&head)?;
write!(f, "[ {:?} ]", self[0])?;
if self.begin != self.cap - 1 {
write!(f, ", ")?;
}
let tail = "_, ".repeat(self.cap - self.begin - 1);
let tail = if !tail.is_empty() {
&tail[..tail.len() - 2]
} else {
""
};
f.write_str(tail)?;
write!(f, " )")
}
}
}
impl<T> Clone for RingBuffer<T>
where
T: Clone,
{
fn clone(&self) -> Self {
let mut new_buf = RingBuffer::new(self.cap);
for el in self.iter().rev() {
new_buf.push(el.clone());
}
new_buf
}
}
impl<T> Index<usize> for RingBuffer<T> {
type Output = T;
fn index(&self, idx: usize) -> &T {
assert!(
idx < self.len,
format!(
"Attempt to access index {} larger than current length {}",
idx, self.len
)
);
let idx = self.offset_backwards(idx);
unsafe {
let offset = self.ptr().add(idx);
offset.as_ref().unwrap()
}
}
}
impl<T> Drop for RingBuffer<T> {
fn drop(&mut self) {
while let Some(_) = self.pop() {}
}
}
impl<T> PartialEq for RingBuffer<T>
where
T: PartialEq,
{
fn eq(&self, other: &Self) -> bool {
self.len == other.len
&& self.cap == other.cap
&& self.iter().zip(other.iter()).all(|(el1, el2)| el1 == el2)
}
}
impl<T> Eq for RingBuffer<T> where T: Eq {}