grafo 0.15.0

A GPU-accelerated rendering library for Rust
Documentation
use crate::vertex::CustomVertex;
use lru::LruCache;
use lyon::tessellation::VertexBuffers;
use std::num::NonZeroUsize;
use std::sync::Arc;

pub(crate) struct Cache {
    tessellation_cache: LruCache<u64, Arc<VertexBuffers<CustomVertex, u16>>>,
}

impl Cache {
    pub(crate) fn new(size: NonZeroUsize) -> Self {
        Self {
            tessellation_cache: LruCache::new(size),
        }
    }

    pub fn len(&self) -> usize {
        self.tessellation_cache.len()
    }

    pub(crate) fn get_vertex_buffers(
        &mut self,
        cache_key: &u64,
    ) -> Option<Arc<VertexBuffers<CustomVertex, u16>>> {
        self.tessellation_cache.get(cache_key).cloned()
    }

    pub(crate) fn insert_vertex_buffers(
        &mut self,
        cache_key: u64,
        vertex_buffers: Arc<VertexBuffers<CustomVertex, u16>>,
    ) {
        self.tessellation_cache.put(cache_key, vertex_buffers);
    }
}

#[cfg(test)]
mod tests {
    use super::Cache;
    use crate::vertex::CustomVertex;
    use lyon::tessellation::VertexBuffers;
    use std::num::NonZeroUsize;
    use std::sync::Arc;

    #[test]
    fn cache_returns_shared_arc_without_cloning_vertex_buffers() {
        let mut cache = Cache::new(NonZeroUsize::new(4).unwrap());
        let mut vertex_buffers = VertexBuffers::<CustomVertex, u16>::new();
        vertex_buffers.vertices.push(CustomVertex {
            position: [0.0, 0.0],
            tex_coords: [0.0, 0.0],
            normal: [0.0, 0.0],
            coverage: 1.0,
        });
        vertex_buffers.indices.push(0);

        let shared_vertex_buffers = Arc::new(vertex_buffers);
        cache.insert_vertex_buffers(7, shared_vertex_buffers.clone());

        let cached_vertex_buffers = cache.get_vertex_buffers(&7).unwrap();
        assert!(Arc::ptr_eq(&shared_vertex_buffers, &cached_vertex_buffers));
    }
}