Sha256: efea562398cc761ee20853c0300dffd4f6e1cca599384d967cefa5d3855d0037

Contents?: true

Size: 1.63 KB

Versions: 171

Compression:

Stored size: 1.63 KB

Contents

#[derive(Debug, PartialEq)]
pub enum Error {
    EmptyBuffer,
    FullBuffer,
}

pub struct CircularBuffer<T: Default + Clone> {
    buffer: Vec<T>,
    size: usize,
    start: usize,
    end: usize,
}

impl<T: Default + Clone> CircularBuffer<T> {
    // this circular buffer keeps an unallocated slot between the start and the end
    // when the buffer is full.
    pub fn new(size: usize) -> CircularBuffer<T> {
        CircularBuffer {
            buffer: vec![T::default(); size + 1],
            size: size + 1,
            start: 0,
            end: 0
        }
    }

    pub fn read(&mut self) -> Result<T, Error> {
        if self.is_empty() {
            return Err(Error::EmptyBuffer);
        }

        let v = self.buffer.get(self.start).unwrap().clone();
        self.advance_start();
        Ok(v)
    }

    pub fn write(&mut self, byte: T) -> Result<(), Error> {
        if self.is_full() {
            return Err(Error::FullBuffer);
        }

        self.buffer[self.end] = byte;
        self.advance_end();
        Ok(())
    }

    pub fn overwrite(&mut self, byte: T) {
        if self.is_full() {
            self.advance_start();
        }

        self.buffer[self.end] = byte;
        self.advance_end();
    }

    pub fn clear(&mut self) {
        self.start = 0;
        self.end = 0;
    }

    pub fn is_empty(&self) -> bool {
        self.start == self.end
    }

    pub fn is_full(&self) -> bool {
        (self.end + 1) % self.size == self.start
    }

    fn advance_start(&mut self) {
        self.start = (self.start + 1) % self.size;
    }

    fn advance_end(&mut self) {
        self.end = (self.end + 1) % self.size;
    }
}

Version data entries

171 entries across 171 versions & 1 rubygems

Version Path
trackler-2.2.1.97 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.96 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.95 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.94 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.93 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.92 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.91 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.90 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.89 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.88 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.87 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.86 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.85 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.84 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.83 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.82 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.81 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.80 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.79 tracks/rust/exercises/circular-buffer/example.rs
trackler-2.2.1.78 tracks/rust/exercises/circular-buffer/example.rs