crayon 0.7.1

A small, portable and extensible game framework.
Documentation
use std::borrow::Borrow;

use crate::utils::handle::Handle;

#[derive(Debug)]
pub struct DataVec<T>
where
    T: Sized + Clone,
{
    pub buf: Vec<Option<T>>,
    pub versions: Vec<u32>,
}

impl<T> DataVec<T>
where
    T: Sized + Clone,
{
    pub fn new() -> Self {
        DataVec {
            buf: Vec::new(),
            versions: Vec::new(),
        }
    }

    pub fn get<H>(&self, handle: H) -> Option<&T>
    where
        H: Borrow<Handle>,
    {
        let index = handle.borrow().index() as usize;
        if let Some(&v) = self.versions.get(index) {
            if v == handle.borrow().version() {
                return self.buf[index].as_ref();
            }
        }

        None
    }

    pub fn create<H>(&mut self, handle: H, value: T)
    where
        H: Borrow<Handle>,
    {
        let handle = handle.borrow();
        let index = handle.index() as usize;

        if self.buf.len() <= index {
            self.buf.resize(index + 1, None);
            self.versions.resize(index + 1, 1);
        }

        self.buf[index] = Some(value);
        self.versions[index] = handle.version();
    }

    pub fn free<H>(&mut self, handle: H) -> Option<T>
    where
        H: Borrow<Handle>,
    {
        let handle = handle.borrow();
        if self.buf.len() <= handle.index() as usize {
            None
        } else {
            let mut value = None;
            ::std::mem::swap(&mut value, &mut self.buf[handle.index() as usize]);
            value
        }
    }
}