Mercurial > projects > dil
annotate trunk/src/TypeRules.d @ 792:05dfe88dd3bb
Added new module TypeRules.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Wed, 27 Feb 2008 02:12:59 +0100 |
parents | |
children | dcd30b0ba711 |
rev | line source |
---|---|
792
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
1 /++ |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
2 Author: Aziz Köksal |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
3 License: GPL3 |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
4 +/ |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
5 module TypeRules; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
6 |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
7 import common; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
8 |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
9 template ExpressionType(char[] T1, char[] T2, char[] expression) |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
10 { |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
11 mixin("alias "~T1~" X;"); |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
12 mixin("alias "~T2~" Y;"); |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
13 X x; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
14 Y y; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
15 static if(is(typeof(mixin(expression)) ResultType)) |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
16 const char[] result = ResultType.stringof; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
17 else |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
18 const char[] result = "Error"; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
19 } |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
20 alias ExpressionType EType; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
21 |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
22 // pragma(msg, EType!("char", "int", "&x").result); |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
23 |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
24 static const string[] basicTypes = [ |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
25 "char"[], "wchar", "dchar", "bool", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
26 "byte", "ubyte", "short", "ushort", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
27 "int", "uint", "long", "ulong", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
28 /+"cent", "ucent",+/ |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
29 "float", "double", "real", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
30 "ifloat", "idouble", "ireal", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
31 "cfloat", "cdouble", "creal"/+, "void"+/ |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
32 ]; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
33 |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
34 static const string[] unaExpressions = [ |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
35 "!x", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
36 "&x", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
37 "~x", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
38 "+x", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
39 "-x", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
40 "++x", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
41 "--x", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
42 "x++", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
43 "x--", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
44 ]; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
45 |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
46 static const string[] binExpressions = [ |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
47 "x!<>=y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
48 "x!<>y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
49 "x!<=y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
50 "x!<y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
51 "x!>=y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
52 "x!>y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
53 "x<>=y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
54 "x<>y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
55 |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
56 "x=y", "x==y", "x!=y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
57 "x<=y", "x<y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
58 "x>=y", "x>y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
59 "x<<=y", "x<<y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
60 "x>>=y","x>>y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
61 "x>>>=y", "x>>>y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
62 "x|=y", "x||y", "x|y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
63 "x&=y", "x&&y", "x&y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
64 "x+=y", "x+y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
65 "x-=y", "x-y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
66 "x/=y", "x/y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
67 "x*=y", "x*y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
68 "x%=y", "x%y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
69 "x^=y", "x^y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
70 "x~=y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
71 "x~y", |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
72 "x,y" |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
73 ]; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
74 |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
75 char[] genBinExpArray(char[] expression) |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
76 { |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
77 char[] result = "[\n"; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
78 foreach (t1; basicTypes) |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
79 { |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
80 result ~= "[\n"; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
81 foreach (t2; basicTypes) |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
82 result ~= `EType!("`~t1~`", "`~t2~`", "`~expression~`").result,`\n; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
83 result[result.length-2] = ']'; // Overwrite last comma. |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
84 result[result.length-1] = ','; // Overwrite last \n. |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
85 } |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
86 result[result.length-1] = ']'; // Overwrite last comma. |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
87 return result; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
88 } |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
89 |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
90 char[] genUnaExpArray(char[] expression) |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
91 { |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
92 char[] result = "[\n"; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
93 foreach (t1; basicTypes) |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
94 result ~= `EType!("`~t1~`", "int", "`~expression~`").result,`\n; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
95 result[result.length-2] = ']'; // Overwrite last comma. |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
96 return result; |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
97 } |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
98 |
05dfe88dd3bb
Added new module TypeRules.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
99 // pragma(msg, mixin(genBinExpArray("x+y")).stringof); |