annotate d2/qtd/meta/Compiletime.d @ 372:a032df77b6ab

Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
author Max Samukha <maxter@spambox.com>
date Thu, 08 Jul 2010 17:19:05 +0300
parents da4235301224
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
1 /**************************************************************************
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
2 Copyright: QtD Team, 2010
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
3 Authors: Max Samukha, Eldar Insafutdinov
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
4 License: Boost Software License 1.0
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
5 **************************************************************************/
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
6 module qtd.meta.Compiletime;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
7
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
8 import
366
da4235301224 Fixed VoidFunc. Updated to dmd.2.047.
Max Samukha <maxter@spambox.com>
parents: 365
diff changeset
9 qtd.String,
365
958e8b9a89bd Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents: 364
diff changeset
10 std.traits,
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
11 std.conv,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
12 std.variant,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
13 std.typetuple;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
14
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
15 /**
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
16 */
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
17 enum standardNamespace = "qtd";
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
18
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
19 template Alias(A...) if (A.length == 1)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
20 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
21 static if (__traits(compiles, { alias A[0] x; }))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
22 alias A[0] Alias;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
23 else
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
24 enum Alias = A[0];
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
25 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
26
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
27 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
28 Encapsulates a static tuple. Useful for preventing tuples from
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
29 flattening when they are passed to a variadic template.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
30 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
31 template TypeTupleWrapper(A...)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
32 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
33 alias A tuple;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
34 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
35
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
36
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
37 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
38 Returns a tuple with T repeated count times.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
39 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
40 // TODO: generalize to accept any symbol
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
41 template Repeat(T, size_t count)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
42 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
43 static if (count)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
44 alias TypeTuple!(count, Repeat!(T, count - 1)) Repeat;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
45 else
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
46 alias TypeTuple!() Repeat;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
47 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
48
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
49 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
50 Returns the required number of function arguments, optional arguments excluded
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
51 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
52 int requiredArgCount(alias fn)() {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
53 alias ParameterTypeTuple!(typeof(&fn)) P;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
54 P p;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
55 static if (P.length == 0)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
56 return 0;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
57
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
58 foreach(i, _; P)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
59 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
60 static if (!__traits(compiles, fn(p[0..$-i-1])))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
61 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
62 return p.length - i;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
63 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
64 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
65 return 0;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
66 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
67
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
68 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
69 Returns true if is a delegate type.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
70 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
71 template isDelegate(T)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
72 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
73 enum isDelegate = is(T == delegate);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
74 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
75
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
76 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
77 Returns true if T is a function pointer type.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
78 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
79 template isFunctionPointer(T)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
80 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
81 enum isFuntionPointer = is(typeof(*T.init) == function);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
82 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
83
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
84 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
85 Returns true if entity is a function or function type.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
86 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
87 template isFunction(alias entity)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
88 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
89 static if (is(entity))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
90 alias isFunction!(entity, void) isFunction;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
91 else
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
92 enum isFunction = is(typeof(entity) == function);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
93 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
94
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
95 template isFunction(T, Dummy = void)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
96 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
97 enum isFunction = is(T == function);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
98 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
99
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
100
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
101 //TODO: hack
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
102 uint isModule(string str)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
103 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
104 return startsWith(str, "module ");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
105 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
106
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
107
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
108 template qualifiedCppName(T)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
109 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
110 static if(!isModule(__traits(parent, T).stringof))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
111 enum qualifiedCppName = qualifiedCppName!(__traits(parent, T)) ~ "::" ~ T.stringof;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
112 else
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
113 enum qualifiedCppName = T.stringof;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
114 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
115
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
116 template qualifiedName(T)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
117 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
118 static if (!isModule(__traits(parent, T).stringof))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
119 enum qualifiedName = qualifiedName!(__traits(parent, T)) ~ "." ~ T.stringof;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
120 else
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
121 enum qualifiedName = T.stringof;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
122 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
123
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
124 template fullName(T)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
125 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
126 static if (is(T == enum))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
127 enum fullName = qualifiedName!T;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
128 else
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
129 enum fullName = T.stringof;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
130 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
131
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
132 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
133 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
134 enum AttributeOptions
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
135 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
136 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
137 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
138 none,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
139
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
140 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
141 Allows multiple equally named attributes to be associated with the symbol.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
142 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
143 allowMultiple = 0x0000_0001,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
144
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
145 /* internal */ inner = 0x0000_0002,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
146 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
147
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
148 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
149 When mixed in an aggregate, converts a compile-time tuple to
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
150 members of that aggregate.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
151 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
152 mixin template tupleToMembers(string nameSpace, size_t index, A...)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
153 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
154 static if (index < A.length)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
155 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
156 enum indexStr = to!string(index);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
157
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
158 static if (is(typeof( { typeof(A[index]) x; }() )))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
159 mixin("typeof(A[" ~ indexStr ~ "]) " ~ nameSpace ~ indexStr ~ " = A[" ~ indexStr ~"];\n");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
160 else
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
161 mixin("alias Alias!(A[" ~ indexStr ~ "]) " ~ nameSpace ~ indexStr ~ ";\n");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
162
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
163 mixin tupleToMembers!(nameSpace, index + 1, A);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
164 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
165 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
166
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
167 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
168 When mixed in an aggregate, converts a compile-time tuple of name-value pairs to
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
169 members of that aggregate.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
170 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
171 mixin template NameValueTupleToFields(A...)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
172 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
173
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
174 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
175
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
176 version (QtdUnittest)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
177 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
178 unittest
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
179 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
180 static int foo()
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
181 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
182 return 42;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
183 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
184
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
185 static struct S
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
186 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
187 mixin tupleToMembers!("member", 0,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
188 int,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
189 "a",
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
190 22,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
191 foo);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
192 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
193
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
194 static assert(is(S.member0 == int));
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
195 S s;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
196 assert(s.member1 == "a");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
197 assert(s.member2 == 22);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
198 assert(S.member3() == 42);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
199 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
200 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
201
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
202 private template attributeId(alias symbol, uint index = 0)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
203 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
204 enum attributeId = standardNamespace ~ "_attr_" ~ uniqueId!symbol ~ "_" ~ to!string(index);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
205 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
206
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
207 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
208 Attributes allow to associate arbitrary compile-time data
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
209 with a declaration and optionaly make that data available at run-time.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
210
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
211 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
212 class A
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
213 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
214 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
215 mixin Attribute!(C, "someAttribute", "B");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
216 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
217
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
218 The example above associates the string "B" with class A under the attribute name "someAttribute".
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
219 Multiple attributes with the same name can be associated with a single declaration.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
220
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
221 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
222 class A
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
223 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
224 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
225 mixin Attribute!(C, "someAttribute", "B");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
226 mixin Attribute!(C, "someAttribute", AttributeOptions.allowMultiple, "C");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
227 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
228
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
229 Attributes can be accessed at compile-time as follows:
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
230
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
231 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
232 alias GetAttributes!(C, "someAttribute") attrs;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
233 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
234
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
235 GetAttribute returns a static tuple, which contains "someAttribute" attributes in the form
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
236 of TypeTupleWrapper instances. The wrapped tuples have the following layout:
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
237
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
238 [0] - attribute name
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
239 [1] - attribute options
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
240 [2..$] - attribute data
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
241
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
242 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
243 alias attrs[0] attr0;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
244 alias attrs[1] attr1;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
245
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
246 static assert(attrs0.tuple[0] == "someAttribute" && attrs0.tuple[2] == "B");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
247 static assert(attrs1.tuple[0] == "someAttribute" && attrs1.tuple[2] == "C");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
248 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
249
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
250 Attributes can be inserted inside the body of a declaration.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
251 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
252 class A
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
253 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
254 mixin Attribute!("someAttribute", "B");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
255 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
256 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
257
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
258 Attributes can be made available at run time by means of the declaration's meta-object
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
259 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
260 // prints names of all attributes associated with class A
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
261 auto a = new A;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
262 foreach (attr; a.metaObject.attributes)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
263 writeln(attr.name);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
264 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
265
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
266 Attributes can be specialized
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
267
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
268 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
269 mixin template DbFieldAttribute(alias prop, string columnName)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
270 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
271 mixin Attribute!(prop, "DbFieldAttribute", columnName);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
272 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
273
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
274 class A
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
275 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
276 int value;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
277 mixin DbFieldAttribute!(value, "Value");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
278
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
279 int anotherValue;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
280 mixin DbFieldAttribute!(anotherValue, "Value2");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
281 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
282
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
283 assert(GetAttributes!(A.value, "DbFieldAttribute")[0].tuple[1] == "Value");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
284 assert(GetAttributes!(A.anotherValue, "DbFieldAttribute")[0].tuple[1] == "Value2");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
285 ----
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
286
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
287 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
288 mixin template Attribute(alias symbol, string attrClass, A...)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
289 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
290 mixin Attribute!(symbol, attrClass, AttributeOptions.none, A);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
291 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
292
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
293 /// ditto
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
294 mixin template Attribute(alias symbol, string attrClass, AttributeOptions opts, A...)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
295 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
296 mixin AttributeImpl!(symbol, attrClass, opts, 0, A);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
297 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
298
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
299
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
300 /// ditto
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
301 // TODO: probably make this an overload of Attribute
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
302 mixin template InnerAttribute(string attrClass, AttributeOptions opts, A...)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
303 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
304 // BUG: needs to be generalized to accept any parent
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
305 mixin Attribute!(typeof(this), attrClass, opts | AttributeOptions.inner, A);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
306 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
307
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
308 /// ditto
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
309 mixin template InnerAttribute(string attrClass, A...)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
310 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
311 mixin InnerAttribute!(attrClass, AttributeOptions.none, A);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
312 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
313
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
314 private mixin template AttributeImpl(alias symbol, string attrClass, AttributeOptions opts, size_t index, A...)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
315 {
372
a032df77b6ab Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents: 366
diff changeset
316 import std.typetuple;
a032df77b6ab Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents: 366
diff changeset
317
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
318 private enum attrId = attributeId!(symbol, index) ~ (opts & AttributeOptions.inner ? "_inner" : "");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
319
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
320 static if (is(typeof(mixin(attrId))))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
321 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
322 mixin ("alias " ~ attrId ~ " attr;");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
323 static if (!(opts & AttributeOptions.allowMultiple))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
324 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
325 static assert (attr[0] != attrClass, "Multiple " ~ attrClass ~ " attributes are not allowed for "
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
326 ~ __traits(parent, symbol).stringof ~ "." ~ stringOf!symbol);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
327 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
328
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
329 mixin AttributeImpl!(symbol, attrClass, opts, index + 1, A);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
330 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
331 else
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
332 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
333 mixin ("alias TypeTuple!(attrClass, opts, A) " ~ attrId ~ ";");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
334 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
335 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
336
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
337 private string stringOfFunction(alias symbol)()
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
338 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
339 auto ptrType = typeof(&symbol).stringof;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
340 auto paramList = ParameterTypeTuple!(symbol).stringof;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
341
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
342 string result = ReturnType!(symbol).stringof ~ " " ~ __traits(identifier, symbol) ~ paramList;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
343
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
344 if (ptrType[$ - 1] != ')')
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
345 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
346 for (size_t i = ptrType.length - 2;; --i)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
347 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
348 if (ptrType[i] == ')')
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
349 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
350 result ~= ptrType[i + 1..$];
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
351 break;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
352 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
353 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
354 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
355
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
356 return result;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
357 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
358
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
359 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
360 String of any symbol, including functions
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
361 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
362 template stringOf(alias symbol)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
363 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
364 static if (isFunction!symbol)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
365 enum stringOf = stringOfFunction!symbol;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
366 else
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
367 enum stringOf = symbol.stringof;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
368 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
369
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
370 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
371 Returns the string uniquely identifying the
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
372 symbol in its container.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
373 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
374 template uniqueName(alias symbol)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
375 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
376 enum uniqueName = stringOf!symbol;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
377 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
378
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
379 // TODO: works only for simple types. implement
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
380 string uniqueIdImpl(string symbol)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
381 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
382 char[] r = symbol.dup;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
383 foreach (i, c; symbol)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
384 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
385 if (c == '(' || c == ')' || c == ' ')
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
386 r[i] = '_';
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
387 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
388
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
389 return cast(immutable)r;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
390 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
391
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
392 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
393 Returns a valid D identifier uniquely
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
394 identifying symbol in its container.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
395 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
396 template uniqueId(alias symbol)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
397 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
398 enum uniqueId = uniqueIdImpl(stringOf!symbol);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
399 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
400
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
401 version (QtdUnittest)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
402 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
403 unittest
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
404 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
405 static class C
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
406 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
407 void foo() const {};
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
408 bool bar(int) { return true; };
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
409 int x;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
410 static assert (stringOf!foo == "void foo() const");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
411 static assert (uniqueName!foo == "void foo() const");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
412 static assert (stringOf!bar == "bool bar(int)");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
413 static assert (uniqueName!bar == "bool bar(int)");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
414 static assert (stringOf!x == "x");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
415 static assert (uniqueName!x == "x");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
416 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
417
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
418 static assert (stringOf!(C.foo) == "void foo() const");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
419 static assert (uniqueName!(C.foo) == "void foo() const");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
420 static assert (stringOf!(C.bar) == "bool bar(int)");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
421 static assert (uniqueName!(C.bar) == "bool bar(int)");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
422
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
423 static assert (stringOf!(C.x) == "x");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
424 static assert (uniqueName!(C.x) == "x");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
425 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
426 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
427
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
428 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
429 Predicate that always evaluates to true regardless of arguments.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
430 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
431 template truePred(A...)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
432 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
433 enum truePred = true;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
434 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
435
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
436 private template attrNamePred(string name)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
437 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
438 template attrNamePred(A...)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
439 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
440 enum attrNamePred = A[0] == name;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
441 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
442 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
443
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
444 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
445 Returns a compile-time tuple of attributes that
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
446 match pred.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
447 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
448 template GetAttributes(alias symbol, alias pred = truePred)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
449 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
450 alias GetAttributesImpl!(symbol, 0, pred).result GetAttributes;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
451 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
452
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
453 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
454 Returns a compile-time tuple of attributes
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
455 matching the specified attribute name.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
456 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
457 template GetAttributes(alias symbol, string attrName)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
458 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
459 alias GetAttributes!(symbol, attrNamePred!attrName) GetAttributes;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
460 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
461
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
462
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
463 template GetAttributesImpl(alias symbol, size_t index, alias pred)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
464 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
465 //pragma(msg, mixin("symbol." ~ attributeId!(symbol, index) ~ "_inner").stringof);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
466 static if (is(typeof(mixin("__traits(parent, symbol)." ~ attributeId!(symbol, index)))))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
467 mixin ("alias Alias!(__traits(parent, symbol))." ~ attributeId!(symbol, index) ~ " attr;");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
468 else static if (is(typeof(mixin("symbol." ~ attributeId!(symbol, index) ~ "_inner"))))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
469 mixin ("alias symbol." ~ attributeId!(symbol, index) ~ "_inner attr;");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
470
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
471 static if (is(typeof(attr)))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
472 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
473 alias GetAttributesImpl!(symbol, index + 1, pred).result next;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
474
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
475 static if (pred!attr)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
476 alias TypeTuple!(TypeTupleWrapper!attr, next) result;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
477 else
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
478 alias next result;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
479 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
480 else
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
481 alias TypeTuple!() result;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
482 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
483
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
484 version (QtdUnittest)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
485 {
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
486 mixin template QtdCustomAttribute(alias symbol, A...)
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
487 {
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
488 mixin Attribute!(symbol, "QtdCustomAttribute", AttributeOptions.allowMultiple, A);
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
489 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
490
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
491 mixin template QtdCustomInnerAttribute(string name, alias value)
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
492 {
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
493 mixin InnerAttribute!("QtdCustomInnerAttribute", AttributeOptions.allowMultiple, name, value);
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
494 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
495
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
496 unittest
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
497 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
498 static class C
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
499 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
500 // inner C attributes
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
501 mixin InnerAttribute!("Inner", 33); // generic
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
502 mixin QtdCustomInnerAttribute!("version", 123);
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
503 mixin QtdCustomInnerAttribute!("author", "James Bond");
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
504
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
505
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
506 void foo() {};
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
507 // foo attributes
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
508 mixin Attribute!(foo, "SomeAttribute", 42);
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
509 mixin QtdCustomAttribute!(foo, 1, 2);
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
510 mixin QtdCustomAttribute!(foo, 3, 4);
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
511
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
512 alias GetAttributes!(typeof(this), "Inner") innerAttrs;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
513 static assert(innerAttrs[0].tuple[0] == "Inner");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
514 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
515 // outer C attribute
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
516 mixin QtdCustomAttribute!(C, 24);
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
517
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
518 alias GetAttributes!(C, "Inner") innerAttrs;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
519 static assert(innerAttrs[0].tuple[0] == "Inner" && innerAttrs[0].tuple[2] == 33);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
520
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
521 alias GetAttributes!(C, "QtdCustomInnerAttribute") ciAttrs;
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
522 static assert(ciAttrs[0].tuple[2] == "version" && ciAttrs[0].tuple[3] == 123);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
523
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
524 /+ Fails on Windows but passes on Linux
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
525 alias GetAttributes!(C.foo, "SomeAttribute") someAttr;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
526 static assert(someAttr.length == 1);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
527 static assert(someAttr[0].tuple[0] == "SomeAttribute");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
528
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
529 alias GetAttributes!(C.foo, "QtdCustomAttribute") myAttrs;
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
530
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
531 //COMPILER BUG: cannot 'alias myAttrs[0].tuple myAttrs_0';
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
532
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
533 static assert(myAttrs[0].tuple[0] == "QtdCustomAttribute");
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
534 static assert(myAttrs[0].tuple[2] == 1 && myAttrs[0].tuple[3] == 2);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
535
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
536 static assert(myAttrs[1].tuple[0] == "QtdCustomAttribute");
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
537 static assert(myAttrs[1].tuple[2] == 3 && myAttrs[1].tuple[3] == 4);
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
538 +/
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
539
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
540 /+ BUG: Fails: local declarations cannot be accessed as parent.localDecl
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
541 alias GetAttributes!(C, "QtdCustomAttribute") myAttrs2;
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
542 static assert(myAttrs2[0].tuple[0] == "QtdCustomAttribute");
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
543 static assert(myAttrs2[0].tuple[1] == 24);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
544 +/
357
9784459f0750 An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents: 351
diff changeset
545
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
546 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
547 }