-
Notifications
You must be signed in to change notification settings - Fork 1
/
istype-operator.dua
120 lines (92 loc) · 1.62 KB
/
istype-operator.dua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
nomangle int printf(str message, ...);
// Case primitive types
// Outputs "101001"
int main()
{
int x;
int y;
long z;
printf(
"%d%d%d%d%d%d",
(int)istype(x, y),
(int)istype(y, z),
(int)istype(x, int),
(int)istype(y, long),
(int)istype(int, long),
(int)istype(long, long)
);
}
// Case Class types
// Outputs "011010"
class X {}
class Y {}
int main()
{
X x;
Y y;
printf(
"%d%d%d%d%d%d",
(int)istype(x, y),
(int)istype(y, Y),
(int)istype(x, X),
(int)istype(y, long),
(int)istype(X, X),
(int)istype(Y, X)
);
}
// Case Templated types
// Outputs "011001"
class X<T> {}
class Y<T> {}
int main()
{
X<int> xi;
X<long> xl;
Y<int> yi;
printf(
"%d%d%d%d%d%d",
(int)istype(xi, yi),
(int)istype(yi, Y<int>),
(int)istype(xi, X<int>),
(int)istype(xl, X<int>),
(int)istype(X<int>, X<long>),
(int)istype(Y<int>, Y<int>)
);
}
// Case Function types
// Outputs "10"
int main()
{
printf(
"%d%d",
(int)istype(main, int()*),
(int)istype(main, void(int, int*)*)
);
}
// Case Non-existing types
// Panics
int main()
{
istype(X, Y);
}
// Case Reference types
// Outputs "0"
int main()
{
printf("%d", (int)istype(int, int&));
}
// Case TypeAliases
// Outputs "0011"
int main()
{
typealias x = int;
typealias y = long;
typealias z = y;
printf(
"%d%d%d%d",
(int)istype(x, y),
(int)istype(x, z),
(int)istype(z, y),
(int)istype(long, y)
);
}