annotate d2/qtd/meta/Runtime.d @ 364:a084e2df3776

Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
author Max Samukha <maxter@maxter.com>
date Fri, 11 Jun 2010 12:16:09 +0300
parents 59d847a814e3
children 958e8b9a89bd
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: Copyright Max Samukha, 2010
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
3 Authors: Max Samukha
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.Runtime;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
7 //TODO: Probably replace switch dispatch with pointer dispatch
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
8 //and leave switch dispatch only in C interface
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
9
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
10 import
364
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
11 qtd.Core,
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
12 qtd.meta.Compiletime,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
13
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
14 std.typetuple,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
15 std.conv,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
16 std.variant,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
17 core.sync.rwmutex;
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 private __gshared ReadWriteMutex lock;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
20 shared static this()
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
21 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
22 lock = new ReadWriteMutex;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
23 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
24
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 IDs of the built-in basic types.
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 enum BasicTypeId
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
29 {
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 void_,
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 bool_,
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 byte_,
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 ubyte_,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
38 ///
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
39 short_,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
40 ///
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
41 ushort_,
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 int_,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
44 ///
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
45 uint_,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
46 ///
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
47 long_,
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 ulong_,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
50 ///
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
51 cent_,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
52 ///
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
53 ucent_,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
54 ///
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
55 float_,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
56 ///
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
57 double_,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
58 ///
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
59 real_,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
60 ///
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
61 ifloat_,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
62 ///
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
63 idouble_,
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 ireal_,
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 cfloat_,
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 cdouble_,
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 creal_,
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 char_,
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 wchar_,
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 dchar_
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
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 Thrown on meta-system errors.
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 class MetaException : Exception
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 this(string msg)
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 super(msg);
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 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
90
364
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
91 abstract class MetaBase
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
92 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
93 alias typeof(this) This;
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 string name;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
96 MetaAttribute[] attributes;
364
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
97 MetaBase[] members;
351
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 template createImpl(M : This)
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 static M createImpl(alias symbol)()
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
102 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
103 auto m = new M;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
104 m.construct!symbol;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
105 return m;
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
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
109 private void createAttrs(alias symbol)()
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
110 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
111 alias GetAttributes!symbol attrs;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
112 enum len = attrs.length; // COMPILER BUG
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
113 foreach (i, _; Repeat!(void, len))
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 alias TypeTuple!(attrs[i].tuple) attr;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
116 // if the third element of the attribute data is a MetaAttribute subclass,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
117 // use that to create the attribute instance.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
118 static if (attr.length > 2 && (is(attr[2] : MetaAttribute)))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
119 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
120 alias attr[2] MA;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
121 alias TypeTuple!(attr[0..2], attr[3..$]) args;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
122 attributes ~= MA /*COMPILER BUG: tuple element as tuple*/[0].create!args();
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 }
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
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
127 protected void construct(alias symbol)()
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
128 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
129 createAttrs!symbol;
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 Base class for run time attributes.
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 abstract class MetaAttribute
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 alias typeof(this) This;
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 string name;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
141 AttributeOptions options;
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 This create(string name, AttributeOptions opts, A...)()
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 auto ma = new This;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
146 ma.construct!(name, opts, A)();
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
147 return ma;
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
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
150 void construct(string name, AttributeOptions opts)()
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 this.name = name;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
153 options = opts;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
154 }
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
364
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
157 abstract class MetaType : MetaBase
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
158 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
159 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
160
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
161 abstract class MetaAggregate : MetaType
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 }
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 class MetaClass : MetaAggregate
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 alias typeof(this) This;
364
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
168
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
169 private:
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
170 This base_;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
171 This firstDerived_;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
172 This next_;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
173 TypeInfo_Class classInfo_;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
174
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
175 this() {}
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
176
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
177 public:
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
178 /**
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
179 Returns the meta-object of the base class.
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
180 */
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
181 @property
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
182 This base()
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
183 {
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
184 return base_;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
185 }
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
186
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
187 /**
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
188 Returns next meta-object on this level of the derivation hierarchy.
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
189 */
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
190 @property
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
191 This next()
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
192 {
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
193 return next_;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
194 }
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
195
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
196 /**
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
197 Returns meta-object of the first derived class.
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
198 */
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
199 @property
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
200 This firstDerived()
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
201 {
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
202 return firstDerived_;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
203 }
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
204
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
205 /**
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
206 D class info.
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
207 */
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
208 @property
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
209 TypeInfo_Class classInfo()
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
210 {
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
211 return classInfo_;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
212 }
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
213
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
214 /* internal */ alias createImpl!This create;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
215
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
216 /* internal */ void construct(T : Object)()
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
217 {
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
218 static if (!is(T == Object))
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
219 {
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
220 alias BaseClassesTuple!(T)[0] Base;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
221 base_ = meta!Base;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
222 }
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
223 classInfo_ = T.classinfo;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
224 }
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
225 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
226
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
227 class MetaStruct : MetaAggregate
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 alias typeof(this) This;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
230 alias createImpl!This create;
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
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
233 @property
364
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
234 auto meta(alias symbol, M : MetaBase)()
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
235 {
364
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
236 __gshared static M sharedM;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
237 static M m;
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
238
364
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
239 if (!m)
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
240 {
364
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
241 synchronized(qtdMoLock)
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
242 {
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
243 if (!sharedM)
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
244 sharedM = M.create!symbol;
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
245 }
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
246 m = sharedM;
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
247 }
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 return m;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
250 }
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 // only classes and structs for now
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
253 @property
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
254 auto meta(T)()
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
255 {
364
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
256 static if (is(T.Meta)) // If the type defines a meta-class - use that.
a084e2df3776 Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
Max Samukha <maxter@maxter.com>
parents: 351
diff changeset
257 return meta!(T, T.Meta);
351
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
258 else static if (is(T == class))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
259 return meta!(T, MetaClass);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
260 else static if (is(T == struct))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
261 return meta!(T, MetaStruct);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
262 else
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
263 static assert(false, "No meta object for symbol " ~ T.stringof);
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 /**
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
267 A run time attribute implementation that stores the attribute data in an
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
268 array of variants.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
269 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
270 class MetaVariantAttribute : MetaAttribute
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
271 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
272 Variant[] values;
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 private this()
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 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
277
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
278 static MetaVariantAttribute create(string category, AttributeOptions opts, A...)()
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
279 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
280 auto ret = new MetaVariantAttribute;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
281 ret.construct!(category, opts)();
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
282 foreach(i, _; A)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
283 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
284 static if (__traits(compiles, { ret.values ~= Variant(A[i]); } ))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
285 ret.values ~= Variant(A[i]);
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 return ret;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
288 }
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
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 A run time attribute implementation that stores the attribute data in an
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
293 assiciative array of variants.
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
294 */
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
295 class MetaVariantDictAttribute : MetaAttribute
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
296 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
297 Variant[string] values;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
298 alias typeof(this) This;
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 private this()
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
301 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
302 }
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 static This create(string category, AttributeOptions opts, A...)()
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
305 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
306 auto ret = new This;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
307 ret.construct!(category, opts)();
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
308 foreach(i, _; A)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
309 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
310 static if (i % 2 == 0 && __traits(compiles, { ret.values[A[i]] = Variant(A[i + 1]); } ))
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
311 ret.values[A[i]] = Variant(A[i + 1]); // PHOBOS BUG: phobos asserts on this
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 return ret;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
314 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
315 }
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
316
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
317 version (QtdUnittest)
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
318 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
319 unittest
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
320 {
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
321 static void foo() {}
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
322
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
323 static class C
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 mixin InnerAttribute!("variantAttribute", MetaVariantAttribute, "22", foo, 33);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
326 mixin InnerAttribute!("variantDictAttribute", MetaVariantDictAttribute,
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
327 //"a", "33", // PHOBOS BUG: variant is unusable with AAs
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
328 "b", foo
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
329 //"c", 44
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 }
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 auto attrs = meta!(C).attributes;
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
334 assert(attrs.length == 2);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
335 auto attr = cast(MetaVariantAttribute)attrs[0];
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 assert(attr.name == "variantAttribute");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
338 assert(attr.values[0] == "22");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
339 assert(attr.values[1] == 33);
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
340
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
341 auto attr2 = cast(MetaVariantDictAttribute) attrs[1];
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
342 assert(attr2.name == "variantDictAttribute");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
343 //assert(attr2.values["a"] == "33");
59d847a814e3 added meta subdir
Max Samukha <maxter@spambox.com>
parents:
diff changeset
344 //assert(attr2.values["c"] == 44);
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 }