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);
+		}
 	}
 }