Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.13 KB | None | 0 0
  1. fn main() {
  2. let mut e = EventManager::default();
  3. e.add_listener(&foo);
  4. e.add_listener(&foo2);
  5. e.queue_event(Event(0));
  6. for _ in 0..6 {
  7. e.update();
  8. }
  9. }
  10.  
  11. trait IEventData {
  12. fn get_timestamp(&self) -> std::time::Duration;
  13. fn get_name() -> &'static str where Self: Sized;
  14. fn as_any(&self) -> &dyn std::any::Any;
  15. }
  16.  
  17. struct Event(i32);
  18. impl IEventData for Event {
  19. fn get_timestamp(&self) -> std::time::Duration {
  20. std::time::Duration::from_millis(0)
  21. }
  22. fn get_name() -> &'static str {
  23. "Event"
  24. }
  25. fn as_any(&self) -> &dyn std::any::Any {
  26. self
  27. }
  28. }
  29.  
  30. fn foo<'a>(event_manager: &mut EventManager<'a>, e: &Event) {
  31. println!("Time {:?}", e.get_timestamp());
  32. }
  33.  
  34. fn foo2<'a>(event_manager: &mut EventManager<'a>, e: &Event) {
  35. println!("Event2 {}", e.0);
  36. if e.0 < 5 {
  37. event_manager.queue_event(Event(e.0 +1));
  38. }
  39. }
  40.  
  41. struct Data(&'static str, Box<dyn IEventData>);
  42.  
  43. #[derive(Default)]
  44. struct EventManager<'a> {
  45. events: std::collections::VecDeque<Data>,
  46. listeners: std::collections::HashMap<&'static str, Vec<Box<FnMut(&mut EventManager, &std::any::Any) + 'a>>>
  47. }
  48.  
  49. impl<'a> EventManager<'a> {
  50. fn add_listener<E, F>(&mut self, mut f: F) where E: 'static + IEventData + Sized, F: 'a + FnMut(&mut EventManager, &E) {
  51. let name = E::get_name();
  52. if let Some(list) = self.listeners.get_mut(name) {
  53. list.push(Box::new(move |s, e| f(s, e.downcast_ref::<E>().unwrap())));
  54. return;
  55. }
  56. self.listeners.insert(name, vec![Box::new(move |s, e| f(s, e.downcast_ref::<E>().unwrap()))]);
  57. }
  58.  
  59. fn queue_event<E>(&mut self, e: E) where E: 'static + IEventData + Sized {
  60. self.events.push_back(Data{0: E::get_name(), 1: Box::new(e)});
  61. }
  62.  
  63. fn update(&mut self) {
  64. let d: Vec<_> = self.events.drain(..).collect();
  65. for event in d {
  66. if let Some((key, mut funcs)) = self.listeners.remove_entry(event.0) {
  67. for func in &mut funcs {
  68. func(self, event.1.as_any());
  69. }
  70. self.listeners.insert(key, funcs);
  71. }
  72. }
  73. }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement