simple_ringbuf 0.1.2

Simple Ringbuf is a speedy lightweight fixed-size infinite-use collection optimized for straightforward single threaded use.
Documentation
//! Trait implementations for the RingBuffer, used for file size reasons.

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 {
            /* i.e. they're equal */
            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 {}