Mercurial > projects > orange
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