feat(registry): const initialization meaning no necessary lazy_static

This commit is contained in:
Nova
2022-08-17 19:28:52 -04:00
parent 85077146d3
commit c272cfaed1
7 changed files with 17 additions and 28 deletions

View File

@@ -5,11 +5,15 @@ use std::sync::{Arc, Weak};
use core::hash::BuildHasherDefault; use core::hash::BuildHasherDefault;
use dashmap::DashMap; use dashmap::DashMap;
use once_cell::sync::Lazy;
use rustc_hash::FxHasher; use rustc_hash::FxHasher;
pub struct Registry<T>(DashMap<usize, Weak<T>, BuildHasherDefault<FxHasher>>); pub struct Registry<T>(Lazy<DashMap<usize, Weak<T>, BuildHasherDefault<FxHasher>>>);
impl<T> Registry<T> { impl<T> Registry<T> {
pub const fn new() -> Self {
Registry(Lazy::new(|| DashMap::default()))
}
pub fn add(&self, t: T) -> Arc<T> { pub fn add(&self, t: T) -> Arc<T> {
let t_arc = Arc::new(t); let t_arc = Arc::new(t);
self.add_raw(&t_arc); self.add_raw(&t_arc);
@@ -32,9 +36,3 @@ impl<T> Registry<T> {
self.0.clear(); self.0.clear();
} }
} }
impl<T> Default for Registry<T> {
fn default() -> Self {
Registry(DashMap::default())
}
}

View File

@@ -74,7 +74,7 @@ impl Node {
destroyable: AtomicBool::from(destroyable), destroyable: AtomicBool::from(destroyable),
alias: OnceCell::new(), alias: OnceCell::new(),
aliases: Default::default(), aliases: Registry::new(),
spatial: OnceCell::new(), spatial: OnceCell::new(),
field: OnceCell::new(), field: OnceCell::new(),

View File

@@ -6,16 +6,13 @@ use crate::core::nodelist::LifeLinkedNodeList;
use crate::core::registry::Registry; use crate::core::registry::Registry;
use anyhow::{anyhow, ensure, Result}; use anyhow::{anyhow, ensure, Result};
use glam::{vec3a, Mat4}; use glam::{vec3a, Mat4};
use lazy_static::lazy_static;
use libstardustxr::flex::flexbuffer_from_vector_arguments; use libstardustxr::flex::flexbuffer_from_vector_arguments;
use libstardustxr::{flex_to_quat, flex_to_vec3}; use libstardustxr::{flex_to_quat, flex_to_vec3};
use parking_lot::Mutex; use parking_lot::Mutex;
use std::sync::{Arc, Weak}; use std::sync::{Arc, Weak};
lazy_static! { static PULSE_SENDER_REGISTRY: Registry<PulseSender> = Registry::new();
static ref PULSE_SENDER_REGISTRY: Registry<PulseSender> = Default::default(); static PULSE_RECEIVER_REGISTRY: Registry<PulseReceiver> = Registry::new();
static ref PULSE_RECEIVER_REGISTRY: Registry<PulseReceiver> = Default::default();
}
fn mask_matches(mask_map_lesser: &Mask, mask_map_greater: &Mask) -> bool { fn mask_matches(mask_map_lesser: &Mask, mask_map_greater: &Mask) -> bool {
(|| -> Result<_> { (|| -> Result<_> {

View File

@@ -6,16 +6,13 @@ use crate::core::eventloop::FRAME;
use crate::core::registry::Registry; use crate::core::registry::Registry;
use anyhow::{anyhow, ensure, Result}; use anyhow::{anyhow, ensure, Result};
use glam::Mat4; use glam::Mat4;
use lazy_static::lazy_static;
use libstardustxr::schemas::input::{InputData, InputDataArgs, InputDataRaw}; use libstardustxr::schemas::input::{InputData, InputDataArgs, InputDataRaw};
use std::ops::Deref; use std::ops::Deref;
use std::sync::atomic::Ordering; use std::sync::atomic::Ordering;
use std::sync::{Arc, Weak}; use std::sync::{Arc, Weak};
lazy_static! { static INPUT_METHOD_REGISTRY: Registry<InputMethod> = Registry::new();
static ref INPUT_METHOD_REGISTRY: Registry<InputMethod> = Default::default(); static INPUT_HANDLER_REGISTRY: Registry<InputHandler> = Registry::new();
static ref INPUT_HANDLER_REGISTRY: Registry<InputHandler> = Default::default();
}
pub trait InputSpecializationTrait { pub trait InputSpecializationTrait {
fn distance(&self, space: &Arc<Spatial>, field: &Field) -> f32; fn distance(&self, space: &Arc<Spatial>, field: &Field) -> f32;

View File

@@ -29,8 +29,8 @@ lazy_static! {
aliased_remote_signals: vec![], aliased_remote_signals: vec![],
aliased_remote_methods: vec![], aliased_remote_methods: vec![],
ui: Default::default(), ui: Default::default(),
items: Default::default(), items: Registry::new(),
acceptors: Default::default(), acceptors: Registry::new(),
}; };
static ref ITEM_TYPE_INFO_PANEL: TypeInfo = TypeInfo { static ref ITEM_TYPE_INFO_PANEL: TypeInfo = TypeInfo {
type_name: "panel", type_name: "panel",
@@ -55,8 +55,8 @@ lazy_static! {
aliased_remote_signals: vec![], aliased_remote_signals: vec![],
aliased_remote_methods: vec![], aliased_remote_methods: vec![],
ui: Default::default(), ui: Default::default(),
items: Default::default(), items: Registry::new(),
acceptors: Default::default(), acceptors: Registry::new(),
}; };
} }
@@ -268,7 +268,7 @@ impl ItemAcceptor {
node: Arc::downgrade(node), node: Arc::downgrade(node),
type_info, type_info,
field: Mutex::new(field), field: Mutex::new(field),
accepted: Default::default(), accepted: Registry::new(),
}); });
if let Some(ui) = type_info.ui.lock().upgrade() { if let Some(ui) = type_info.ui.lock().upgrade() {
ui.handle_create_acceptor(&acceptor); ui.handle_create_acceptor(&acceptor);

View File

@@ -18,8 +18,8 @@ use stereokit::lifecycle::DrawContext;
use stereokit::model::Model as SKModel; use stereokit::model::Model as SKModel;
use stereokit::StereoKit; use stereokit::StereoKit;
pub static MODEL_REGISTRY: Registry<Model> = Registry::new();
lazy_static! { lazy_static! {
pub static ref MODEL_REGISTRY: Registry<Model> = Default::default();
pub static ref MODELS_TO_DROP: Mutex<Vec<SendWrapper<SKModel>>> = Default::default(); pub static ref MODELS_TO_DROP: Mutex<Vec<SendWrapper<SKModel>>> = Default::default();
} }

View File

@@ -4,14 +4,11 @@ use crate::core::client::Client;
use crate::core::registry::Registry; use crate::core::registry::Registry;
use anyhow::Result; use anyhow::Result;
use glam::Mat4; use glam::Mat4;
use lazy_static::lazy_static;
use libstardustxr::flex::flexbuffer_from_vector_arguments; use libstardustxr::flex::flexbuffer_from_vector_arguments;
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc; use std::sync::Arc;
lazy_static! { static ROOT_REGISTRY: Registry<Root> = Registry::new();
static ref ROOT_REGISTRY: Registry<Root> = Default::default();
}
pub struct Root { pub struct Root {
node: Arc<Node>, node: Arc<Node>,