entity_rust/helpers/
mod.rs

1#[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}