Skip to content
Snippets Groups Projects
Unverified Commit 041cfbac authored by John's avatar John Committed by GitHub
Browse files

Merge pull request #263 from YoshieraHuang/immutable_widget_state

Use dashmap in widget_state
parents f323612a 481370ba
No related branches found
No related tags found
No related merge requests found
use std::sync::{Arc, RwLock}; use bevy::prelude::{BuildChildren, Commands, Component, Entity, Resource};
use dashmap::DashMap;
use bevy::{ use std::sync::Arc;
prelude::{BuildChildren, Commands, Component, Entity, Resource},
utils::HashMap,
};
/// Stores mappings between widget entities and their corresponding state entities. /// Stores mappings between widget entities and their corresponding state entities.
#[derive(Resource, Default, Debug, Clone)] #[derive(Resource, Default, Debug, Clone)]
pub struct WidgetState { pub struct WidgetState {
// Widget entity to state entity // Widget entity to state entity
mapping: Arc<RwLock<HashMap<Entity, Entity>>>, mapping: Arc<DashMap<Entity, Entity>>,
// State entity to widget entity // State entity to widget entity
reverse_mapping: Arc<RwLock<HashMap<Entity, Entity>>>, reverse_mapping: Arc<DashMap<Entity, Entity>>,
} }
impl WidgetState { impl WidgetState {
...@@ -22,55 +19,38 @@ impl WidgetState { ...@@ -22,55 +19,38 @@ impl WidgetState {
widget_entity: Entity, widget_entity: Entity,
initial_state: State, initial_state: State,
) -> Entity { ) -> Entity {
if let (Ok(mut mapping), Ok(mut reverse_mapping)) = if self.mapping.contains_key(&widget_entity) {
(self.mapping.try_write(), self.reverse_mapping.try_write()) *self.mapping.get(&widget_entity).unwrap()
{
if mapping.contains_key(&widget_entity) {
*mapping.get(&widget_entity).unwrap()
} else {
let mut state_entity = None;
commands
.entity(widget_entity)
.with_children(|child_builder| {
state_entity = Some(child_builder.spawn(initial_state).id());
mapping.insert(widget_entity, state_entity.unwrap());
reverse_mapping.insert(state_entity.unwrap(), widget_entity);
});
state_entity.expect("State entity did not spawn!")
}
} else { } else {
panic!("Couldn't get mapping lock!"); let mut state_entity = None;
commands
.entity(widget_entity)
.with_children(|child_builder| {
state_entity = Some(child_builder.spawn(initial_state).id());
self.mapping.insert(widget_entity, state_entity.unwrap());
self.reverse_mapping
.insert(state_entity.unwrap(), widget_entity);
});
state_entity.expect("State entity did not spawn!")
} }
} }
/// Attempts to get a state entity /// Attempts to get a state entity
pub fn get(&self, widget_entity: Entity) -> Option<Entity> { pub fn get(&self, widget_entity: Entity) -> Option<Entity> {
if let Ok(mapping) = self.mapping.try_read() { self.mapping.get(&widget_entity).map(|entry| *entry.value())
return mapping.get(&widget_entity).copied();
}
None
} }
pub fn get_widget_entity(&self, state_entity: Entity) -> Option<Entity> { pub fn get_widget_entity(&self, state_entity: Entity) -> Option<Entity> {
if let Ok(reverse_mapping) = self.reverse_mapping.try_read() { self.reverse_mapping
return reverse_mapping.get(&state_entity).copied(); .get(&state_entity)
} .map(|entry| *entry.value())
None
} }
pub fn remove(&self, widget_entity: Entity) -> Option<Entity> { pub fn remove(&self, widget_entity: Entity) -> Option<Entity> {
if let (Ok(mut mapping), Ok(mut reverse_mapping)) = let state_entity = self.mapping.remove(&widget_entity).map(|(_, v)| v);
(self.mapping.try_write(), self.reverse_mapping.try_write()) if let Some(state_entity) = state_entity {
{ self.reverse_mapping.remove(&state_entity);
let state_entity = mapping.remove(&widget_entity);
if let Some(state_entity) = state_entity {
reverse_mapping.remove(&state_entity);
}
return state_entity;
} }
state_entity
None
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment