From 3c3e8754ad61aa31f8c93e6edd22d4000426fa02 Mon Sep 17 00:00:00 2001 From: Daniel Griffen Date: Sun, 28 Oct 2018 19:43:48 -0700 Subject: [PATCH] add multi-parenting --- src/lib.rs | 72 +++++++++++++++++++++++--------------------- tests/basic_usage.rs | 6 ++-- tests/dyn_events.rs | 4 +-- 3 files changed, 43 insertions(+), 39 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 58d854c..93825c1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -49,29 +49,30 @@ macro_rules! register_hook { macro_rules! post_event { // TODO allow multiple $t:ty at once and re-#[doc(hidden)] the low-level get_post_targets and // get_event_id - ($b:expr, $t:ty, $e:expr) => { + ($b:expr, $e:expr, $($t:ty),+) => { { // hygiene let bus: &$crate::EventBus = $b; // event setup, this may evaluate to any type. let event: &mut _ = $e; { - // event type setup - static EVENT_ID: ::std::sync::atomic::AtomicUsize = ::std::sync::atomic::ATOMIC_USIZE_INIT; - static EVENT_ID_INIT: ::std::sync::Once = ::std::sync::ONCE_INIT; - // no generics allowed. - static DUMMY: ::std::marker::PhantomData = ::std::marker::PhantomData; - EVENT_ID_INIT.call_once(|| { - EVENT_ID.store($crate::get_event_id::<$t>(), std::sync::atomic::Ordering::Relaxed); - }); - let id = EVENT_ID.load(std::sync::atomic::Ordering::Relaxed); + let _ = ($({ + // event type setup + static EVENT_ID: ::std::sync::atomic::AtomicUsize = ::std::sync::atomic::ATOMIC_USIZE_INIT; + static EVENT_ID_INIT: ::std::sync::Once = ::std::sync::ONCE_INIT; + // no generics allowed. + static DUMMY: ::std::marker::PhantomData = ::std::marker::PhantomData; + EVENT_ID_INIT.call_once(|| { + EVENT_ID.store($crate::get_event_id::<$t>(), std::sync::atomic::Ordering::Relaxed); + }); + let id = EVENT_ID.load(std::sync::atomic::Ordering::Relaxed); + let handlers = $crate::get_post_targets::<$t>(bus, event, id); + + for (_pri, fun) in handlers.iter() { + fun(event); + } + },)+); // big tuple of (Handlers, Handlers, Handlers, Handlers, ...) - // handler retrieval and invokation - let event: &mut $t = event; - let handlers = $crate::get_post_targets::<$t>(bus, event, id); - for (_pri, fun) in handlers.iter() { - fun(event); - } } } } @@ -84,7 +85,7 @@ macro_rules! post_event { macro_rules! post_event_cancellable { // TODO allow multiple $t:ty at once and re-#[doc(hidden)] the low-level get_post_targets and // get_event_id - ($b:expr, $t:ty, $e:expr) => { + ($b:expr, $e:expr, $($t:ty),+) => { { // hygiene let bus: &$crate::EventBus = $b; @@ -96,25 +97,28 @@ macro_rules! post_event_cancellable { } test(event); - // event type setup - static EVENT_ID: ::std::sync::atomic::AtomicUsize = ::std::sync::atomic::ATOMIC_USIZE_INIT; - static EVENT_ID_INIT: ::std::sync::Once = ::std::sync::ONCE_INIT; - // no generics allowed. - static DUMMY: ::std::marker::PhantomData = ::std::marker::PhantomData; - EVENT_ID_INIT.call_once(|| { - EVENT_ID.store($crate::get_event_id::<$t>(), std::sync::atomic::Ordering::Relaxed); - }); - let id = EVENT_ID.load(std::sync::atomic::Ordering::Relaxed); + let cancelled = ($({ + // event type setup + static EVENT_ID: ::std::sync::atomic::AtomicUsize = ::std::sync::atomic::ATOMIC_USIZE_INIT; + static EVENT_ID_INIT: ::std::sync::Once = ::std::sync::ONCE_INIT; + // no generics allowed. + static DUMMY: ::std::marker::PhantomData = ::std::marker::PhantomData; + EVENT_ID_INIT.call_once(|| { + EVENT_ID.store($crate::get_event_id::<$t>(), std::sync::atomic::Ordering::Relaxed); + }); + let id = EVENT_ID.load(std::sync::atomic::Ordering::Relaxed); + let handlers = $crate::get_post_targets::<$t>(bus, event, id); - // handler retrieval and invokation - let handlers = $crate::get_post_targets::<$t>(bus, event, id); - for (_pri, fun) in handlers.iter() { - fun(event as &mut $t); - if event.cancelled() { - break; + for (_pri, fun) in handlers.iter() { + fun(event as &mut $t); + if Cancellable::cancelled(event) { + break; + } } - } - event.cancelled() + + event.cancelled() + },)+); // big tuple of (Handlers, Handlers, Handlers, Handlers, ...) + } } } diff --git a/tests/basic_usage.rs b/tests/basic_usage.rs index a5ce0e2..c491b5b 100644 --- a/tests/basic_usage.rs +++ b/tests/basic_usage.rs @@ -27,12 +27,12 @@ fn test_basic_usage() { register_hook!(&event_bus, 0, MyEvent, add_handler); let mut event = MyEvent { i: 3 }; assert_eq!(event.i, 3); - post_event!(&event_bus, MyEvent, &mut event); + post_event!(&event_bus, &mut event, MyEvent); assert_eq!(event.i, 4); register_hook!(&event_bus, 1, MyEvent, no_handler); - post_event!(&event_bus, MyEvent, &mut event); + post_event!(&event_bus, &mut event, MyEvent); assert_eq!(event.i, 5); //event_bus.unregister(handler_id); - post_event!(&event_bus, MyEvent, &mut event); + post_event!(&event_bus, &mut event, MyEvent); //assert_eq!(event.i, 5); } diff --git a/tests/dyn_events.rs b/tests/dyn_events.rs index 8ea4599..0707cb1 100644 --- a/tests/dyn_events.rs +++ b/tests/dyn_events.rs @@ -55,6 +55,6 @@ fn test_dyn_usage() { //let handler_id = event_bus.register(add_handler, 0); register_hook!(&event_bus, 0, dyn MyEvent, on_myevent); register_hook!(&event_bus, 1, dyn MyExtraEvent, on_myextraevent); - post_event!(&event_bus, dyn MyEvent, &mut event); - post_event_cancellable!(&event_bus, dyn MyExtraEvent, &mut extraEvent); + post_event!(&event_bus, &mut event, dyn MyEvent); + post_event_cancellable!(&event_bus, &mut extraEvent, dyn MyExtraEvent, dyn MyEvent); }