Mercurial > projects > orange
annotate orange/util/Use.d @ 1:11a31bd929f9
Removed dependency on private library
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Mon, 31 May 2010 16:06:36 +0200 |
parents | f7b078e85f7f |
children | 78e5fef4bbf2 |
rev | line source |
---|---|
0 | 1 /** |
2 * Copyright: Copyright (c) 2010 Jacob Carlborg. | |
3 * Authors: Jacob Carlborg | |
4 * Version: Initial created: Jan 29, 2010 | |
5 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0) | |
6 */ | |
7 module orange.util.Use; | |
8 | |
9 version (Tango) | |
10 { | |
11 import tango.core.Tuple; | |
12 import tango.core.Traits; | |
13 } | |
14 | |
15 else | |
16 { | |
17 import std.typetuple; | |
18 import std.traits; | |
19 | |
20 alias ReturnType ReturnTypeOf; | |
21 alias ParameterTypeTuple ParameterTupleOf; | |
22 } | |
23 | |
24 struct OpInStruct (ARGS...) | |
25 { | |
26 static assert (ARGS.length > 0); | |
27 | |
28 private | |
29 { | |
30 alias ReturnTypeOf!(ARGS[0]) ReturnType; | |
31 | |
32 static if (ARGS.length >= 2) | |
33 alias Tuple!(ReturnType delegate (ARGS), ARGS[1 .. $]) NEW_ARGS; | |
34 | |
35 else | |
36 alias Tuple!(ReturnType delegate (ARGS)) NEW_ARGS; | |
37 } | |
38 | |
39 NEW_ARGS args; | |
40 | |
41 ReturnType opIn (ARGS[0] dg) | |
42 { | |
43 assert(args[0]); | |
44 | |
45 static if (NEW_ARGS.length == 1) | |
46 return args[0](dg); | |
47 | |
48 else | |
49 return args[0](dg, args[1 .. $]); | |
50 } | |
51 } | |
52 | |
53 struct RestoreStruct (U, T) | |
54 { | |
55 U delegate(U delegate (), ref T) dg; | |
56 T* value; | |
57 | |
58 U opIn (U delegate () deleg) | |
59 { | |
60 return dg(deleg, *value); | |
61 } | |
62 } | |
1
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
63 |
0 | 64 RestoreStruct!(U, T) restore (U = void, T) (ref T val) |
65 { | |
66 RestoreStruct!(U, T) restoreStruct; | |
67 | |
68 restoreStruct.dg = (U delegate () dg, ref T value){ | |
69 T t = value; | |
70 | |
71 static if (is(U == void)) | |
72 { | |
73 dg(); | |
74 value = t; | |
75 } | |
76 | |
77 else | |
78 { | |
79 auto result = dg(); | |
80 value = t; | |
81 | |
82 return result; | |
83 } | |
84 }; | |
85 | |
86 restoreStruct.value = &val; | |
87 | |
88 return restoreStruct; | |
89 } |