annotate base/src/java/nonstandard/RuntimeTraits.d @ 112:9f4c18c268b2

Update to compile and execute with dmd 2.052.
author kntroh
date Wed, 16 Mar 2011 21:53:53 +0900
parents fcf926c91ca4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
84
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 /**
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2 * Provides runtime traits, which provide much of the functionality of tango.core.Traits and
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * is-expressions, as well as some functionality that is only available at runtime, using
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * runtime type information.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 *
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * Authors: Chris Wright (dhasenan) <dhasenan@gmail.com>
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 * License: tango license, apache 2.0
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Copyright (c) 2009, CHRISTOPHER WRIGHT
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10 module java.nonstandard.RuntimeTraits;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 import java.lang.all;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 // Only DWT
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 public bool isJavaPrimitive( TypeInfo type ){
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14 return isBool(type) || isInteger(type) || isCharacter(type) || isFloat(type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 public TypeInfo_Class getTypeInfo( ClassInfo ci ){
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 return null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 public TypeInfo_Class getSuperclass( ClassInfo ci ){
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 return getSuperclass(getTypeInfo(ci));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 public TypeInfo_Class getSuperclass( TypeInfo ti ){
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 return null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 public TypeInfo_Interface[] getInterfaces( ClassInfo ci ){
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 return getInterfaces(getTypeInfo(ci));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 public TypeInfo_Interface[] getInterfaces( TypeInfo ti ){
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 return null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 public String getName( ClassInfo ci ){
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 return ci.name;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 public String getName( TypeInfo ti ){
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 if( isClass(ti) ){
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 return getName( asClass(ti));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 return null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 // End DWT. Start Tango...
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 /// If the given type represents a typedef, return the actual type.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 TypeInfo realType (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 // TypeInfo_Typedef.next() doesn't return the actual type.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 // I think it returns TypeInfo_Typedef.base.next().
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 // So, a slightly different method.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 auto def = cast(TypeInfo_Typedef) type;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 if (def !is null)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 return def.base;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 return type;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 /// If the given type represents a class, return its ClassInfo; else return null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 ClassInfo asClass (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 if (isInterface (type))
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 auto klass = cast(TypeInfo_Interface) type;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 return klass.info;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 if (isClass (type))
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 auto klass = cast(TypeInfo_Class) type;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 return klass.info;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 return null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 /** Returns true iff one type is an ancestor of the other, or if the types are the same.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 * If either is null, returns false. */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 bool isDerived (ClassInfo derived, ClassInfo base)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 if (derived is null || base is null)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 return false;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 do
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 if (derived is base)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 return true;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 while ((derived = derived.base) !is null)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 return false;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 /** Returns true iff implementor implements the interface described
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 * by iface. This is an expensive operation (linear in the number of
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 * interfaces and base classes).
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 bool implements (ClassInfo implementor, ClassInfo iface)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95 foreach (info; applyInterfaces (implementor))
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 if (iface is info)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 return true;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 return false;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 /** Returns true iff an instance of class test is implicitly castable to target.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 * This is an expensive operation (isDerived + implements). */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 bool isImplicitly (ClassInfo test, ClassInfo target)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 // Keep isDerived first.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 // isDerived will be much faster than implements.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 return (isDerived (test, target) || implements (test, target));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 /** Returns true iff an instance of type test is implicitly castable to target.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 * If the types describe classes or interfaces, this is an expensive operation. */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 bool isImplicitly (TypeInfo test, TypeInfo target)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 // A lot of special cases. This is ugly.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 if (test is target)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 return true;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 if (isStaticArray (test) && isDynamicArray (target) && valueType (test) is valueType (target))
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 // you can implicitly cast static to dynamic (currently) if they
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 // have the same value type. Other casts should be forbidden.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 return true;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 auto klass1 = asClass (test);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 auto klass2 = asClass (target);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 if (isClass (test) && isClass (target))
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 return isDerived (klass1, klass2);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 if (isInterface (test) && isInterface (target))
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 return isDerived (klass1, klass2);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 if (klass1 && klass2)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 return isImplicitly (klass1, klass2);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 if (klass1 || klass2)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 // no casts from class to non-class
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 return false;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 if ((isSignedInteger (test) && isSignedInteger (target)) || (isUnsignedInteger (test) && isUnsignedInteger (target)) || (isFloat (
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145 test) && isFloat (target)) || (isCharacter (test) && isCharacter (target)))
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 return test.tsize () <= target.tsize ();
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 if (isSignedInteger (test) && isUnsignedInteger (target))
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 // potential loss of data
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 return false;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154 if (isUnsignedInteger (test) && isSignedInteger (target))
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 // if the sizes are the same, you could be losing data
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 // the upper half of the range wraps around to negatives
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 // if the target type is larger, you can safely hold it
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 return test.tsize () < target.tsize ();
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 // delegates and functions: no can do
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 // pointers: no
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 // structs: no
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 return false;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 ClassInfo[] baseClasses (ClassInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 if (type is null)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 return null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 ClassInfo[] types;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 while ((type = type.base) !is null)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 types ~= type;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 return types;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 /** Returns a list of all interfaces that this type implements, directly
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 * or indirectly. This includes base interfaces of types the class implements,
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 * and interfaces that base classes implement, and base interfaces of interfaces
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 * that base classes implement. This is an expensive operation. */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 ClassInfo[] baseInterfaces (ClassInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 if (type is null)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 return null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 ClassInfo[] types = directInterfaces (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 while ((type = type.base) !is null)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 types ~= interfaceGraph (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 return types;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 /** Returns all the interfaces that this type directly implements, including
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 * inherited interfaces. This is an expensive operation.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 *
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 * Examples:
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 * ---
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 * interface I1 {}
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 * interface I2 : I1 {}
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 * class A : I2 {}
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 *
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 * auto interfaces = interfaceGraph (A.classinfo);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 * // interfaces = [I1.classinfo, I2.classinfo]
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 * ---
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 *
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 * ---
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 * interface I1 {}
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 * interface I2 {}
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 * class A : I1 {}
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 * class B : A, I2 {}
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 *
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 * auto interfaces = interfaceGraph (B.classinfo);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 * // interfaces = [I2.classinfo]
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 * ---
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 ClassInfo[] interfaceGraph (ClassInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 ClassInfo[] info;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 foreach (iface; type.interfaces)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 info ~= iface.classinfo;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 info ~= interfaceGraph (iface.classinfo);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 return info;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 /** Iterate through all interfaces that type implements, directly or indirectly, including base interfaces. */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 struct applyInterfaces
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 static applyInterfaces opCall (ClassInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 applyInterfaces apply;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 apply.type = type;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 return apply;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 int opApply (int delegate (ref ClassInfo) dg)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 int result = 0;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 for (; type; type = type.base)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 foreach (iface; type.interfaces)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 result = dg (iface.classinfo);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 if (result)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 return result;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 result = applyInterfaces (iface.classinfo).opApply (dg);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 if (result)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 return result;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 return result;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 ClassInfo type;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 ClassInfo[] baseTypes (ClassInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 if (type is null)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 return null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 return baseClasses (type) ~ baseInterfaces (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 ///
112
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
270 version(Tango){
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
271 ModuleInfo moduleOf (ClassInfo type)
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
272 {
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
273 foreach (modula; ModuleInfo)
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
274 foreach (klass; modula.localClasses)
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
275 if (klass is type)
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
276 return modula;
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
277 return null;
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
278 }
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
279 } else { // Phobos
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
280 ModuleInfo* moduleOf (ClassInfo type)
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
281 {
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
282 foreach (modula; ModuleInfo)
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
283 foreach (klass; modula.localClasses)
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
284 if (klass is type)
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
285 return modula;
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
286 return null;
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 84
diff changeset
287 }
84
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 /// Returns a list of interfaces that this class directly implements.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 ClassInfo[] directInterfaces (ClassInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 ClassInfo[] types;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 foreach (iface; type.interfaces)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 types ~= iface.classinfo;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 return types;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 /** Returns a list of all types that are derived from the given type. This does not
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 * count interfaces; that is, if type is an interface, you will only get derived
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 * interfaces back. It is an expensive operations. */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 ClassInfo[] derivedTypes (ClassInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 ClassInfo[] types;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 foreach (modula; ModuleInfo)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 foreach (klass; modula.localClasses)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 if (isDerived (klass, type) && (klass !is type))
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 types ~= klass;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 return types;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 bool isDynamicArray (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 // This implementation is evil.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 // Array typeinfos are named TypeInfo_A?, and defined individually for each
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 // possible type aside from structs. For example, typeinfo for int[] is
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 // TypeInfo_Ai; for uint[], TypeInfo_Ak.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 // So any TypeInfo with length 11 and starting with TypeInfo_A is an array
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 // type.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 // Also, TypeInfo_Array is an array type.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 return ((type.classinfo.name[9] == 'A') && (type.classinfo.name.length == 11)) || ((cast(TypeInfo_Array) type) !is null);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 bool isStaticArray (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 return (cast(TypeInfo_StaticArray) type) !is null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 /** Returns true iff the given type is a dynamic or static array (false for associative
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 * arrays and non-arrays). */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 bool isArray (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 return isDynamicArray (type) || isStaticArray (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 bool isAssociativeArray (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 return (cast(TypeInfo_AssociativeArray) type) !is null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 bool isCharacter (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 return (type is typeid(char) || type is typeid(wchar) || type is typeid(dchar));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 bool isString (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359 return isArray (type) && isCharacter (valueType (type));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 bool isUnsignedInteger (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 return (type is typeid(uint) || type is typeid(ulong) || type is typeid(ushort) || type is typeid(ubyte));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 bool isSignedInteger (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 return (type is typeid(int) || type is typeid(long) || type is typeid(short) || type is typeid(byte));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 bool isInteger (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 return isSignedInteger (type) || isUnsignedInteger (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 bool isBool (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 return (type is typeid(bool));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 bool isFloat (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 return (type is typeid(float) || type is typeid(double) || type is typeid(real));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
398 bool isPrimitive (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401 return (isArray (type) || isAssociativeArray (type) || isCharacter (type) || isFloat (type) || isInteger (type));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404 /// Returns true iff the given type represents an interface.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 bool isInterface (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407 return (cast(TypeInfo_Interface) type) !is null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
408 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
410 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 bool isPointer (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
412 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414 return (cast(TypeInfo_Pointer) type) !is null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
416
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417 /// Returns true iff the type represents a class (false for interfaces).
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
418 bool isClass (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
419 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
421 return (cast(TypeInfo_Class) type) !is null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
422 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
424 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425 bool isStruct (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
428 return (cast(TypeInfo_Struct) type) !is null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
429 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
430
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
431 ///
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
432 bool isFunction (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
433 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
434 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
435 return ((cast(TypeInfo_Function) type) !is null) || ((cast(TypeInfo_Delegate) type) !is null);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
436 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
437
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
438 /** Returns true iff the given type is a reference type. */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
439 bool isReferenceType (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
440 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
441 return isClass (type) || isPointer (type) || isDynamicArray (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
442 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
443
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
444 /** Returns true iff the given type represents a user-defined type.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
445 * This does not include functions, delegates, aliases, or typedefs. */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
446 bool isUserDefined (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
447 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
448 return isClass (type) || isStruct (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
449 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
450
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
451 /** Returns true for all value types, false for all reference types.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
452 * For functions and delegates, returns false (is this the way it should be?). */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
453 bool isValueType (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
454 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
455 return !(isDynamicArray (type) || isAssociativeArray (type) || isPointer (type) || isClass (type) || isFunction (
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
456 type));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
457 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
458
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
459 /** The key type of the given type. For an array, size_t; for an associative
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
460 * array T[U], U. */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
461 TypeInfo keyType (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
462 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
463 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
464 auto assocArray = cast(TypeInfo_AssociativeArray) type;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
465 if (assocArray)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
466 return assocArray.key;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
467 if (isArray (type))
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
468 return typeid(size_t);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
469 return null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
470 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
471
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
472 /** The value type of the given type -- given T[] or T[n], T; given T[U],
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
473 * T; given T*, T; anything else, null. */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
474 TypeInfo valueType (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
475 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
476 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
477 if (isArray (type))
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
478 return type.next;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
479 auto assocArray = cast(TypeInfo_AssociativeArray) type;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
480 if (assocArray)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
481 return assocArray.value;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
482 auto pointer = cast(TypeInfo_Pointer) type;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
483 if (pointer)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
484 return pointer.m_next;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
485 return null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
486 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
487
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
488 /** If the given type represents a delegate or function, the return type
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
489 * of that function. Otherwise, null. */
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
490 TypeInfo returnType (TypeInfo type)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
491 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
492 type = realType (type);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
493 auto delegat = cast(TypeInfo_Delegate) type;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
494 if (delegat)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
495 return delegat.next;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
496 auto func = cast(TypeInfo_Function) type;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
497 if (func)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
498 return func.next;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
499 return null;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
500 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
501
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
502 debug (UnitTest)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
503 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
504
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
505 interface I1
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
506 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
507 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
508
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
509 interface I2
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
510 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
511 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
512
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
513 interface I3
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
514 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
515 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
516
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
517 interface I4
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
518 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
519 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
520
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
521 class A
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
522 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
523 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
524
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
525 class B : A, I1
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
526 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
527 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 class C : B, I2, I3
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
530 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
532
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
533 class D : A, I1
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
534 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535 int foo (int i)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
536 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
537 return i;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
538 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
539 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
540
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541 struct S1
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
542 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
543 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
544
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
545 unittest {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
546 // Struct-related stuff.
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
547 auto type = typeid(S1);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
548 assert (isStruct (type));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
549 assert (isValueType (type));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
550 assert (isUserDefined (type));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
551 assert (!isClass (type));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
552 assert (!isPointer (type));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
553 assert (null is returnType (type));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
554 assert (!isPrimitive (type));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
555 assert (valueType (type) is null);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
556 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
557
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
558 unittest {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
559 auto type = A.classinfo;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
560 assert (baseTypes (type) == [Object.classinfo]);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
561 assert (baseClasses (type) == [Object.classinfo]);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
562 assert (baseInterfaces (type).length == 0);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
563 type = C.classinfo;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
564 assert (baseClasses (type) == [B.classinfo, A.classinfo, Object.classinfo]);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
565 assert (baseInterfaces (type) == [I2.classinfo, I3.classinfo, I1.classinfo]);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
566 assert (baseTypes (type) == [B.classinfo, A.classinfo, Object.classinfo, I2.classinfo, I3.classinfo,
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
567 I1.classinfo]);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
568 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
569
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
570 unittest {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
571 assert (isPointer (typeid(S1*)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
572 assert (isArray (typeid(S1[])));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
573 assert (valueType (typeid(S1*)) is typeid(S1));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
574 auto d = new D;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
575 assert (returnType (typeid(typeof(&d.foo))) is typeid(int));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
576 assert (isFloat (typeid(real)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
577 assert (isFloat (typeid(double)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
578 assert (isFloat (typeid(float)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
579 assert (!isFloat (typeid(creal)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
580 assert (!isFloat (typeid(cdouble)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
581 assert (!isInteger (typeid(float)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
582 assert (!isInteger (typeid(creal)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
583 assert (isInteger (typeid(ulong)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
584 assert (isInteger (typeid(ubyte)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
585 assert (isCharacter (typeid(char)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
586 assert (isCharacter (typeid(wchar)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
587 assert (isCharacter (typeid(dchar)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
588 assert (!isCharacter (typeid(ubyte)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
589 assert (isArray (typeid(typeof("hello"))));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
590 assert (isCharacter (typeid(typeof("hello"[0]))));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
591 assert (valueType (typeid(typeof("hello"))) is typeid(typeof('h')));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
592 assert (isString (typeid(typeof("hello"))), typeof("hello").stringof);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
593 auto staticString = typeid(typeof("hello"d));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
594 auto dynamicString = typeid(typeof("hello"d[0 .. $]));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
595 assert (isString (staticString));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
596 assert (isStaticArray (staticString));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
597 assert (isDynamicArray (dynamicString), dynamicString.toString () ~ dynamicString.classinfo.name);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
598 assert (isString (dynamicString));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
599
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
600 auto type = typeid(int[char[]]);
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
601 assert (valueType (type) is typeid(int), valueType (type).toString ());
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
602 assert (keyType (type) is typeid(char[]), keyType (type).toString ());
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
603 void delegate (int) dg = (int i)
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
604 {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
605 };
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
606 assert (returnType (typeid(typeof(dg))) is typeid(void));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
607 assert (returnType (typeid(int delegate (int))) is typeid(int));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
608
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
609 assert (!isDynamicArray (typeid(int[4])));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
610 assert (isStaticArray (typeid(int[4])));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
611 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
612
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
613 unittest {
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
614 typedef int myint;
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
615 assert (typeid(myint) !is null, "null typeid(myint)");
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
616 assert (isInteger (typeid(myint)));
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
617 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
618
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
619 }
fcf926c91ca4 Added base classes
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
620