From 30a03f638ff3b8fa0950b1b210ed76797059cbd1 Mon Sep 17 00:00:00 2001 From: Nova Date: Sat, 11 Jun 2022 22:43:50 -0400 Subject: [PATCH] feat: basic registry --- src/core/mod.rs | 1 + src/core/registry.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/core/registry.rs diff --git a/src/core/mod.rs b/src/core/mod.rs index 91c4c83..a38a168 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -1,3 +1,4 @@ pub mod client; pub mod eventloop; +pub mod registry; pub mod scenegraph; diff --git a/src/core/registry.rs b/src/core/registry.rs new file mode 100644 index 0000000..81bb528 --- /dev/null +++ b/src/core/registry.rs @@ -0,0 +1,40 @@ +use anyhow::{anyhow, Result}; +use slab::{Iter, Slab}; +use std::sync::RwLock; + +struct Registry(RwLock>); + +impl Registry { + pub fn add(&self, t: T) -> Result { + Ok(self + .0 + .write() + .ok() + .ok_or_else(|| anyhow!("Registry has been poisoned"))? + .insert(t)) + } + pub fn iterate)>(&self, index: usize, closure: F) -> Result<()> { + closure( + self.0 + .read() + .ok() + .ok_or_else(|| anyhow!("Registry has been poisoned"))? + .iter(), + ); + Ok(()) + } + pub fn remove(&self, index: usize) -> Result { + Ok(self + .0 + .write() + .ok() + .ok_or_else(|| anyhow!("Registry has been poisoned"))? + .remove(index)) + } +} + +impl Default for Registry { + fn default() -> Self { + Registry::(RwLock::new(Slab::new())) + } +}