annotate orange/util/Reflection.d @ 26:78e5fef4bbf2 experimental

Third step in refactoring the API. Stating to add unit tests.
author Jacob Carlborg <doob@me.com>
date Tue, 19 Oct 2010 10:22:10 +0200
parents 99c52d46822a
children 1fef41162966
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1 /**
1
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
2 * Copyright: Copyright (c) 2009 Jacob Carlborg.
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
3 * Authors: Jacob Carlborg
1
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
4 * Version: Initial created: Oct 5, 2009
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
5 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
6 */
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
7 module orange.util.Reflection;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
8
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 9
diff changeset
9 import orange.core.string;
1
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
10 import orange.util.CTFE;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
11
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
12 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
13 * Returns the name of the given function
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
14 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
15 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
16 * func = the function alias to get the name of
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
17 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
18 * Returns: the name of the function
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
19 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
20 template functionNameOf (alias func)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
21 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
22 version(LDC)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
23 const functionNameOf = (&func).stringof[1 .. $];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
24
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
25 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
26 const functionNameOf = (&func).stringof[2 .. $];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
27 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
28
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
29 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
30 * Returns the parameter names of the given function
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
31 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
32 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
33 * func = the function alias to get the parameter names of
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
34 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
35 * Returns: an array of strings containing the parameter names
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
36 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
37 template parameterNamesOf (alias func)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
38 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
39 const parameterNamesOf = parameterNamesOfImpl!(func);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
40 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
41
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
42 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
43 * Returns the parameter names of the given function
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
44 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
45 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
46 * func = the function alias to get the parameter names of
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
47 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
48 * Returns: an array of strings containing the parameter names
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
49 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
50 private string[] parameterNamesOfImpl (alias func) ()
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
51 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
52 string funcStr = typeof(&func).stringof;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
53
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
54 auto start = funcStr.indexOf('(');
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
55 auto end = funcStr.indexOf(')');
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
56
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
57 const firstPattern = ' ';
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
58 const secondPattern = ',';
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
59
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
60 funcStr = funcStr[start + 1 .. end];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
61
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
62 if (funcStr == "")
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
63 return null;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
64
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
65 funcStr ~= secondPattern;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
66
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
67 string token;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
68 string[] arr;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
69
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
70 foreach (c ; funcStr)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
71 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
72 if (c != firstPattern && c != secondPattern)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
73 token ~= c;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
74
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
75 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
76 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
77 if (token)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
78 arr ~= token;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
79
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
80 token = null;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
81 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
82 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
83
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
84 if (arr.length == 1)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
85 return arr;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
86
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
87 string[] result;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
88 bool skip = false;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
89
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
90 foreach (str ; arr)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
91 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
92 skip = !skip;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
93
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
94 if (skip)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
95 continue;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
96
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
97 result ~= str;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
98 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
99
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
100 return result;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
101 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
102
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
103 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
104 * Helper function for callWithNamedArguments
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
105 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
106 * Returns:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
107 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
108 private string buildFunction (alias func, string args) ()
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
109 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
110 const str = split(args);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
111 string[] params;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
112 string[] values;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
113 auto mixinString = functionNameOf!(func) ~ "(";
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
114
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
115 foreach (s ; str)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
116 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
117 auto index = s.indexOf('=');
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
118 params ~= s[0 .. index];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
119 values ~= s[index + 1 .. $];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
120 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
121
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
122 const parameterNames = parameterNamesOf!(func);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
123
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
124 foreach (i, s ; parameterNames)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
125 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
126 auto index = params.indexOf(s);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
127
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
128 if (index != params.length)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
129 mixinString ~= values[index] ~ ",";
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
130 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
131
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
132 return mixinString[0 .. $ - 1] ~ ");";
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
133 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
134
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
135 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
136 * Calls the given function with named arguments
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
137 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
138 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
139 * func = an alias to the function to call
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
140 * args = a string containing the arguments to call using this syntax: `arg2=value,arg1="value"`
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
141 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
142 void callWithNamedArguments (alias func, string args) ()
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
143 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
144 mixin(buildFunction!(func, args));
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
145 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
146
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
147 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
148 * Evaluates to true if T has a instance method with the given name
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
149 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
150 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
151 * T = the type of the class/struct
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
152 * method = the name of the method
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
153 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
154 template hasInstanceMethod (T, string method)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
155 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
156 const hasInstanceMethod = is(typeof({
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
157 T t;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
158 mixin("auto f = &t." ~ method ~ ";");
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
159 }));
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
160 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
161
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
162 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
163 * Evaluates to true if T has a class method with the given name
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
164 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
165 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
166 * T = the type of the class/struct
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
167 * method = the name of the method
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
168 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
169 template hasClassMethod (T, string method)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
170 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
171 const hasClassMethod = is(typeof({
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
172 mixin("auto f = &T." ~ method ~ ";");
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
173 }));
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
174 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
175
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
176 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
177 * Evaluates to true if T has a either a class method or a instance method with the given name
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
178 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
179 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
180 * T = the type of the class/struct
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
181 * method = the name of the method
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
182 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
183 template hasMethod (T, string method)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
184 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
185 const hasMethod = hasClassMethod!(T, method) || hasInstanceMethod!(T, method);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
186 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
187
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
188 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
189 * Evaluates to true if T has a field with the given name
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
190 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
191 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
192 * T = the type of the class/struct
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
193 * field = the name of the field
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
194 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
195 template hasField (T, string field)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
196 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
197 const hasField = hasFieldImpl!(T, field, 0);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
198 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
199
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
200 private template hasFieldImpl (T, string field, size_t i)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
201 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
202 static if (T.tupleof.length == i)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
203 const hasFieldImpl = false;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
204
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
205 else static if (T.tupleof[i].stringof[1 + T.stringof.length + 2 .. $] == field)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
206 const hasFieldImpl = true;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
207
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
208 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
209 const hasFieldImpl = hasFieldImpl!(T, field, i + 1);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
210 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
211
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
212 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
213 * Evaluates to an array of strings containing the names of the fields in the given type
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
214 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
215 template fieldsOf (T)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
216 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
217 const fieldsOf = fieldsOfImpl!(T, 0);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
218 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
219
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
220 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
221 * Implementation for fieldsOf
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
222 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
223 * Returns: an array of strings containing the names of the fields in the given type
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
224 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
225 template fieldsOfImpl (T, size_t i)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
226 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
227 static if (T.tupleof.length == 0)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
228 const fieldsOfImpl = [""];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
229
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
230 else static if (T.tupleof.length - 1 == i)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
231 const fieldsOfImpl = [T.tupleof[i].stringof[1 + T.stringof.length + 2 .. $]];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
232
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
233 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
234 const fieldsOfImpl = T.tupleof[i].stringof[1 + T.stringof.length + 2 .. $] ~ fieldsOfImpl!(T, i + 1);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
235 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
236
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
237 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
238 * Evaluates to the type of the field with the given name
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
239 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
240 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
241 * T = the type of the class/struct
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
242 * field = the name of the field
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
243 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
244 template TypeOfField (T, string field)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
245 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
246 static assert(hasField!(T, field), "The given field \"" ~ field ~ "\" doesn't exist in the type \"" ~ T.stringof ~ "\"");
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
247
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
248 alias TypeOfFieldImpl!(T, field, 0) TypeOfField;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
249 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
250
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
251 private template TypeOfFieldImpl (T, string field, size_t i)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
252 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
253 static if (T.tupleof[i].stringof[1 + T.stringof.length + 2 .. $] == field)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
254 alias typeof(T.tupleof[i]) TypeOfFieldImpl;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
255
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
256 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
257 alias TypeOfFieldImpl!(T, field, i + 1) TypeOfFieldImpl;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
258 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
259
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
260 /**
7
32152d5fad4b nameOfFieldAt fails poorly if position >= tuple.length
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
261 * Evaluates to a string containing the name of the field at given position in the given type.
1
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
262 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
263 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
264 * T = the type of the class/struct
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
265 * position = the position of the field in the tupleof array
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
266 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
267 template nameOfFieldAt (T, size_t position)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
268 {
7
32152d5fad4b nameOfFieldAt fails poorly if position >= tuple.length
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
269 static assert (position < T.tupleof.length, format!(`The given position "`, position, `" is greater than the number of fields (`, T.tupleof.length, `) in the type "`, T, `"`));
32152d5fad4b nameOfFieldAt fails poorly if position >= tuple.length
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
270
1
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
271 static if (T.tupleof[position].stringof.length > T.stringof.length + 3)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
272 const nameOfFieldAt = T.tupleof[position].stringof[1 + T.stringof.length + 2 .. $];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
273
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
274 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
275 const nameOfFieldAt = "";
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
276 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
277
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
278 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
279 * Sets the given value to the filed with the given name
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
280 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
281 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
282 * t = an instance of the type that has the field
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
283 * value = the value to set
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
284 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
285 void setValueOfField (T, U, string field) (ref T t, U value)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
286 in
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
287 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
288 static assert(hasField!(T, field), "The given field \"" ~ field ~ "\" doesn't exist in the type \"" ~ T.stringof ~ "\"");
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
289 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
290 body
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
291 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
292 const len = T.stringof.length;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
293
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
294 foreach (i, dummy ; typeof(T.tupleof))
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
295 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
296 const f = T.tupleof[i].stringof[1 + len + 2 .. $];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
297
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
298 static if (f == field)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
299 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
300 t.tupleof[i] = value;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
301 break;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
302 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
303 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
304 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
305
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
306 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
307 * Gets the value of the field with the given name
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
308 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
309 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
310 * t = an instance of the type that has the field
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
311 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
312 * Returns: the value of the field
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
313 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
314 U getValueOfField (T, U, string field) (T t)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
315 in
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
316 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
317 static assert(hasField!(T, field), "The given field \"" ~ field ~ "\" doesn't exist in the type \"" ~ T.stringof ~ "\"");
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
318 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
319 body
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
320 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
321 const len = T.stringof.length;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
322
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
323 foreach (i, dummy ; typeof(T.tupleof))
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
324 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
325 const f = T.tupleof[i].stringof[1 + len + 2 .. $];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
326
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
327 static if (f == field)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
328 return t.tupleof[i];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
329 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
330 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
331
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
332 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
333 * Gets all the class names in the given string of D code
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
334 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
335 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
336 * code = a string containg the code to get the class names from
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
337 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
338 * Returns: the class names
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
339 */
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
340 string[] getClassNames (string code) ()
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
341 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
342 const fileContent = code;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
343 const classString = "class";
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
344 bool foundPossibleClass;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
345 bool foundClass;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
346 string[] classNames;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
347 string className;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
348
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
349 for (size_t i = 0; i < fileContent.length; i++)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
350 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
351 final c = fileContent[i];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
352
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
353 if (foundPossibleClass)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
354 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
355 if (c == ' ' || c == '\n')
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
356 foundClass = true;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
357
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
358 foundPossibleClass = false;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
359 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
360
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
361 else if (foundClass)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
362 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
363 if (c == '{')
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
364 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
365 classNames ~= className;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
366 foundClass = false;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
367 className = "";
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
368 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
369
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
370 else if (c != ' ' && c != '\n')
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
371 className ~= c;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
372 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
373
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
374 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
375 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
376 if (i + classString.length < fileContent.length)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
377 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
378 if (fileContent[i .. i + classString.length] == classString)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
379 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
380 if (i > 0)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
381 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
382 if (fileContent[i - 1] == ' ' || fileContent[i - 1] == '\n' || fileContent[i - 1] == ';' || fileContent[i - 1] == '}')
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
383 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
384 foundPossibleClass = true;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
385 i += classString.length - 1;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
386 continue;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
387 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
388 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
389
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
390 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
391 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
392 foundPossibleClass = true;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
393 i += classString.length - 1;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
394 continue;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
395 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
396 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
397 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
398 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
399 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
400
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
401 return classNames;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
402 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
403
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
404 /**
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
405 * Creates a new instance of class with the given name
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
406 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
407 * Params:
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
408 * name = the fully qualified name of the class
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
409 * args = the arguments to the constructor
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
410 *
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
411 * Returns: the newly created instance or null
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
412 */
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 7
diff changeset
413 T factory (T) (string name)
1
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
414 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
415 auto classInfo = ClassInfo.find(name);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
416
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
417 if (!classInfo)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
418 return null;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
419
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
420 auto object = newInstance(classInfo);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
421
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
422 if (classInfo.flags & 8 && classInfo.defaultConstructor is null)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
423 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
424 auto o = cast(T) object;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
425
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
426 static if (is(typeof(o._ctor(args))))
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
427 return o._ctor(args);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
428
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
429 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
430 return null;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
431 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
432
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
433 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
434 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
435 if (classInfo.flags & 8 && classInfo.defaultConstructor !is null)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
436 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
437 Object delegate () ctor;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
438 ctor.ptr = cast(void*) object;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
439 ctor.funcptr = cast(Object function()) classInfo.defaultConstructor;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
440
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
441 return cast(T) ctor();
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
442 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
443
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
444 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
445 return cast(T) object;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
446 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
447 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
448
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
449 private
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
450 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
451 version (LDC)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
452 extern (C) Object _d_allocclass(ClassInfo);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
453
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
454 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
455 extern (C) Object _d_newclass(ClassInfo);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
456 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
457
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
458 Object newInstance (ClassInfo classInfo)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
459 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
460 version (LDC)
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
461 {
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
462 Object object = _d_allocclass(classInfo);
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
463 (cast(byte*) object)[0 .. classInfo.init.length] = classInfo.init[];
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
464
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
465 return object;
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
466 }
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
467
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
468 else
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
469 return _d_newclass(classInfo);
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 7
diff changeset
470 }
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 7
diff changeset
471
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 7
diff changeset
472 Object newInstance (string name)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 7
diff changeset
473 {
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 7
diff changeset
474 auto classInfo = ClassInfo.find(name);
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 7
diff changeset
475
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 7
diff changeset
476 if (!classInfo)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 7
diff changeset
477 return null;
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 7
diff changeset
478
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 7
diff changeset
479 return newInstance(classInfo);
1
11a31bd929f9 Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
480 }