diff orange/util/Use.d @ 0:f7b078e85f7f

First commit
author Jacob Carlborg <doob@me.com>
date Wed, 26 May 2010 17:19:13 +0200
parents
children 11a31bd929f9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/orange/util/Use.d	Wed May 26 17:19:13 2010 +0200
@@ -0,0 +1,90 @@
+/**
+ * Copyright: Copyright (c) 2010 Jacob Carlborg.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Jan 29, 2010
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module orange.util.Use;
+
+import mambo.io;
+
+version (Tango)
+{
+	import tango.core.Tuple;
+	import tango.core.Traits;
+}
+
+else
+{
+	import std.typetuple;
+	import std.traits;
+	
+	alias ReturnType ReturnTypeOf;
+	alias ParameterTypeTuple ParameterTupleOf;
+}
+
+struct OpInStruct (ARGS...)
+{
+	static assert (ARGS.length > 0);
+	
+	private
+	{
+		alias ReturnTypeOf!(ARGS[0]) ReturnType;
+		
+		static if (ARGS.length >= 2)
+			alias Tuple!(ReturnType delegate (ARGS), ARGS[1 .. $]) NEW_ARGS;
+			
+		else
+			alias Tuple!(ReturnType delegate (ARGS)) NEW_ARGS;
+	}
+		
+	NEW_ARGS args;
+	
+	ReturnType opIn (ARGS[0] dg)
+	{
+		assert(args[0]);
+		
+		static if (NEW_ARGS.length == 1)
+			return args[0](dg);
+			
+		else
+			return args[0](dg, args[1 .. $]);
+	}
+}
+
+struct RestoreStruct (U, T)
+{
+	U delegate(U delegate (), ref T) dg; 
+	T* value;
+	
+	U opIn (U delegate () deleg)
+	{
+		return dg(deleg, *value);
+	}
+}
+RestoreStruct!(U, T) restore (U = void, T) (ref T val)
+{
+	RestoreStruct!(U, T) restoreStruct;
+	
+	restoreStruct.dg = (U delegate () dg, ref T value){
+		T t = value;
+		
+		static if (is(U == void))
+		{
+			dg();
+			value = t;
+		}
+		
+		else
+		{
+			auto result = dg();
+			value = t;
+			
+			return result;
+		}
+	};
+	
+	restoreStruct.value = &val;
+	
+	return restoreStruct;
+}
\ No newline at end of file