use std::collections::HashMap;
use std::path::{Path, PathBuf};
#[derive(Debug, Clone, Default)]
pub struct ModelCache {
scenes: HashMap<PathBuf, bool>, textures: HashMap<PathBuf, bool>, }
impl ModelCache {
pub fn new() -> Self {
Self {
scenes: HashMap::new(),
textures: HashMap::new(),
}
}
pub fn has_scene(&self, path: &Path) -> bool {
self.scenes.contains_key(path)
}
pub fn has_texture(&self, path: &Path) -> bool {
self.textures.contains_key(path)
}
pub fn cache_scene(&mut self, path: PathBuf) {
self.scenes.insert(path, true);
}
pub fn cache_texture(&mut self, path: PathBuf) {
self.textures.insert(path, true);
}
pub fn scene_count(&self) -> usize {
self.scenes.len()
}
pub fn texture_count(&self) -> usize {
self.textures.len()
}
pub fn clear(&mut self) {
self.scenes.clear();
self.textures.clear();
}
pub fn stats(&self) -> ModelCacheStats {
ModelCacheStats {
cached_scenes: self.scenes.len(),
cached_textures: self.textures.len(),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ModelCacheStats {
pub cached_scenes: usize,
pub cached_textures: usize,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_cache_is_empty() {
let cache = ModelCache::new();
assert_eq!(cache.scene_count(), 0);
assert_eq!(cache.texture_count(), 0);
}
#[test]
fn test_cache_scene() {
let mut cache = ModelCache::new();
let path = PathBuf::from("/tmp/ycb/003_cracker_box/google_16k/textured.obj");
assert!(!cache.has_scene(&path));
cache.cache_scene(path.clone());
assert!(cache.has_scene(&path));
assert_eq!(cache.scene_count(), 1);
}
#[test]
fn test_cache_texture() {
let mut cache = ModelCache::new();
let path = PathBuf::from("/tmp/ycb/003_cracker_box/google_16k/texture_map.png");
assert!(!cache.has_texture(&path));
cache.cache_texture(path.clone());
assert!(cache.has_texture(&path));
assert_eq!(cache.texture_count(), 1);
}
#[test]
fn test_cache_multiple_items() {
let mut cache = ModelCache::new();
cache.cache_scene(PathBuf::from("scene1.obj"));
cache.cache_scene(PathBuf::from("scene2.obj"));
cache.cache_texture(PathBuf::from("texture1.png"));
assert_eq!(cache.scene_count(), 2);
assert_eq!(cache.texture_count(), 1);
}
#[test]
fn test_clear_cache() {
let mut cache = ModelCache::new();
cache.cache_scene(PathBuf::from("scene.obj"));
cache.cache_texture(PathBuf::from("texture.png"));
assert_eq!(cache.scene_count(), 1);
assert_eq!(cache.texture_count(), 1);
cache.clear();
assert_eq!(cache.scene_count(), 0);
assert_eq!(cache.texture_count(), 0);
}
#[test]
fn test_cache_stats() {
let mut cache = ModelCache::new();
cache.cache_scene(PathBuf::from("scene.obj"));
cache.cache_texture(PathBuf::from("texture.png"));
let stats = cache.stats();
assert_eq!(stats.cached_scenes, 1);
assert_eq!(stats.cached_textures, 1);
}
#[test]
fn test_duplicate_cache_entry() {
let mut cache = ModelCache::new();
let path = PathBuf::from("scene.obj");
cache.cache_scene(path.clone());
cache.cache_scene(path.clone());
assert_eq!(cache.scene_count(), 1);
}
}