entity_rust/helpers/
mod.rs1#[macro_export]
2macro_rules! static_any_vec_map {
3 ($v:ident, $t:ty) => {
4 pub mod $v {
5 use std::collections::{ HashMap };
6 use std::iter::FromIterator;
7 use std::any::Any;
8 use shared_mutex::{ SharedMutex, MappedSharedMutexReadGuard };
9
10 lazy_static! {
11 pub static ref MAP: SharedMutex<HashMap<$t, Box<Any+'static+Sync>>> = SharedMutex::new(HashMap::new());
12 }
13
14 pub fn push<T>(event_name: & $t, event: T) where T: Any+'static+Sync {
15 let mut map = MAP.write().expect("Static MAP is not initialized.");
16 let mut entry = map.entry(event_name.clone()).or_insert(Box::new(Vec::<T>::new()));
17 let mut casted_entry = &mut **entry as &mut Any;
18 let mut vec = casted_entry.downcast_mut::<Vec<T>>().expect("Could not cast created entry to Vec<T>");
19 vec.push(event);
20 }
21
22 pub fn get<T>(event_name: & $t) -> MappedSharedMutexReadGuard<Vec<T>> where T: Any+'static+Sync {
23 let map = MAP.read().expect("Static MAP is not initialized.");
24 let vec = map.into_mapped().map(|m| {
25 let entry = m.get(event_name).expect("Could not get a particular MAP entry.");
26 let casted_entry = & **entry as & Any;
27 return casted_entry.downcast_ref::<Vec<T>>().expect("Could not cast gotten entry to Vec<T>");
28 });
29 return vec;
30 }
31
32 pub fn clear<T>(event_name: & $t) where T: Any+'static+Sync {
33 let mut map = MAP.write().expect("Static MAP is not initialized.");
34 let mut entry = map.entry(event_name.clone()).or_insert(Box::new(Vec::<T>::new()));
35 let mut casted_entry = &mut **entry as &mut Any;
36 let mut vec = casted_entry.downcast_mut::<Vec<T>>().expect("Could not cast created entry to Vec<T>");
37 vec.clear();
38 }
39
40 pub fn drain<'a>() -> Vec<($t, Box<Any+'static+Sync>)> {
41 let mut map = MAP.write().expect("Static MAP is not initialized.");
42 return Vec::from_iter(map.drain());
43 }
44
45 pub fn clear_all() {
46 let mut map = MAP.write().expect("Static MAP is not initialized.");
47 map.clear();
48 }
49 }
50 }
51}