Mercurial > projects > dynamin
changeset 79:e7595d58f8a3
Reduce the size of an Event by sharing the mainHandler and dispatcher frame pointers.
author | Jordan Miner <jminer7@gmail.com> |
---|---|
date | Sat, 06 Feb 2010 15:45:53 -0600 |
parents | 651082a9b364 |
children | f1e176a76c00 |
files | dynamin/core/event.d |
diffstat | 1 files changed, 23 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/dynamin/core/event.d Sat Feb 06 15:12:52 2010 -0600 +++ b/dynamin/core/event.d Sat Feb 06 15:45:53 2010 -0600 @@ -70,14 +70,18 @@ public alias void delegate(ArgsType e) Dispatcher; Handler[] handlers; - /// - private Handler mainHandler; - /// - private Dispatcher dispatcher; + private void* ptr; + private void function(ArgsType e) mainHandler; + private void function(ArgsType e) dispatcher; + void setUp(Handler mainHandler, Dispatcher dispatcher = null) { - this.mainHandler = mainHandler; - this.dispatcher = dispatcher; + if(mainHandler.ptr != dispatcher.ptr && dispatcher.ptr != null) + throw new Exception("mainHandler.ptr must equal dispatcher.ptr"); + ptr = mainHandler.ptr; + this.mainHandler = mainHandler.funcptr; + this.dispatcher = dispatcher.funcptr; } + void defaultDispatch(ArgsType e) { callHandlers(e); callMainHandler(e); @@ -89,10 +93,14 @@ void opCall(ArgsType e) { if(e is null) Stdout("Warning: EventArgs null").newline; - if(!dispatcher.funcptr) + if(!dispatcher) { defaultDispatch(e); - else - dispatcher(e); + return; + } + Dispatcher dg; + dg.ptr = ptr; + dg.funcptr = dispatcher; + dg(e); } /** * Adds the specified handler to this event. The handler will be called @@ -137,8 +145,12 @@ void callMainHandler(ArgsType e) { auto stopEventArgs = cast(StopEventArgs)e; // if e is an instance of StopEventArgs, then check if it is stopped - if(stopEventArgs is null || !stopEventArgs.stopped) - mainHandler(e); + if(stopEventArgs is null || !stopEventArgs.stopped) { + Handler dg; + dg.ptr = ptr; + dg.funcptr = mainHandler; + dg(e); + } } }