disk-based-bfs 0.1.0

Fast generic implementation of breadth-first search using disk storage, suitable for extremely large implicit graphs.
Documentation
use std::sync::Arc;

use parking_lot::Mutex;

#[derive(Clone)]
pub(crate) struct ChunkBufferList {
    buffers: Arc<Mutex<Vec<Option<Vec<u8>>>>>,
}

impl ChunkBufferList {
    pub(crate) fn new_empty(num_buffers: usize) -> Self {
        let buffers = vec![None; num_buffers];
        let buffers = Arc::new(Mutex::new(buffers));
        Self { buffers }
    }

    pub(crate) fn fill(&self, buffer_size: usize) {
        let mut lock = self.buffers.lock();
        for buf in lock.iter_mut() {
            if buf.is_none() {
                buf.replace(vec![0; buffer_size]);
            }
        }
    }

    pub(crate) fn take(&self) -> Option<Vec<u8>> {
        let mut lock = self.buffers.lock();
        lock.iter_mut().find_map(|buf| buf.take())
    }

    pub(crate) fn put(&self, buffer: Vec<u8>) {
        let mut lock = self.buffers.lock();
        for buf in lock.iter_mut() {
            if buf.is_none() {
                buf.replace(buffer);
                return;
            }
        }
    }
}