Mercurial > projects > orange
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 |
rev | line source |
---|---|
0 | 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 | 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 | 5 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0) |
6 */ | |
7 module orange.util.Reflection; | |
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 } |