1 | #include <fstream.hfa> |
---|
2 | #include <enum.hfa> |
---|
3 | |
---|
4 | enum(int) A !{ |
---|
5 | a = 10 |
---|
6 | }; |
---|
7 | |
---|
8 | enum(int) B { |
---|
9 | b = 20 |
---|
10 | }; |
---|
11 | |
---|
12 | enum(int) AB { |
---|
13 | inline A, |
---|
14 | inline B, |
---|
15 | ab = 30 |
---|
16 | }; |
---|
17 | |
---|
18 | enum(int) C { |
---|
19 | c = 40 |
---|
20 | }; |
---|
21 | |
---|
22 | enum(int) D { |
---|
23 | d = 50 |
---|
24 | }; |
---|
25 | |
---|
26 | enum(int) CD { |
---|
27 | inline C, |
---|
28 | inline D, |
---|
29 | cd = 60 |
---|
30 | }; |
---|
31 | |
---|
32 | enum(int) ACD { |
---|
33 | inline A, |
---|
34 | inline CD, |
---|
35 | acd = 70 |
---|
36 | }; |
---|
37 | |
---|
38 | // Note: variable name (cat in this case) cannot be overloaded with those declared in enum, |
---|
39 | // Probably for the same reason as const overloading problem |
---|
40 | // i.e. int identity_t(enum ACD a) would not work as the valueE(a) is ambigious currently |
---|
41 | int identity_t(enum ACD cat) { |
---|
42 | return valueE(cat); |
---|
43 | } |
---|
44 | |
---|
45 | int main() { |
---|
46 | // Note: We need to use qualified name syntax even if no ! hidding |
---|
47 | // Because Inline introduce ambiguity on symbols |
---|
48 | sout | "Symbols (enumerator) should have the same values:" |nl; |
---|
49 | sout | "Symbol a: (10) " | valueE(A.a) | "," | valueE(AB.a) | "," | valueE(ACD.a) | nl; |
---|
50 | sout | "Symbol b: (20) " | valueE(B.b) | "," | valueE(AB.b) | nl; |
---|
51 | sout | "Symbol ab: (30) " | valueE(AB.ab) | nl; |
---|
52 | sout | "Symbol c: (40) " | valueE(C.c) | "," | valueE(CD.c) | "," | valueE(ACD.c) | nl; |
---|
53 | sout | "Symbol d: (50) " | valueE(D.d) | "," | valueE(CD.d) | "," | valueE(ACD.d) | nl; |
---|
54 | sout | "Symbol cd: (60) " | valueE(CD.cd) | "," | valueE(ACD.cd) | nl; |
---|
55 | sout | "Symbol acd: (70) " | valueE(ACD.acd) | nl; |
---|
56 | |
---|
57 | sout | "Casting/Upcasting:" | nl; |
---|
58 | sout | "Symbol a: (10) " | valueE((A)A.a) | "," | valueE((AB)A.a) | "," | valueE((ACD)A.a) | nl; |
---|
59 | sout | "Symbol b: (20) " | valueE((B)B.b) | "," | valueE((AB)B.b) | nl; |
---|
60 | sout | "Symbol ab: (30) " | valueE((AB)AB.ab) | nl; |
---|
61 | sout | "Symbol c: (40) " | valueE((C)C.c) | "," | valueE((CD)C.c) | "," | valueE((ACD)C.c) | "," | valueE((CD)CD.c)| "," | valueE((ACD)CD.c) | nl; |
---|
62 | sout | "Symbol d: (50) " | valueE((D)D.d) | "," | valueE((CD)D.d) | "," | valueE((ACD)D.d) | "," | valueE((ACD)CD.d) | nl; |
---|
63 | sout | "Symbol cd: (60) " | valueE((CD)CD.cd) | "," | valueE((ACD)CD.cd) | nl; |
---|
64 | sout | "Symbol acd: (70) " | valueE((ACD)ACD.acd) | nl; |
---|
65 | |
---|
66 | sout | "Function Call:" | nl; |
---|
67 | sout | "Symbol a: (10) " | identity_t(A.a) | "," | identity_t(ACD.a) | nl; |
---|
68 | sout | "Symbol c: (40) " | identity_t(C.c) | "," | identity_t(ACD.c) | nl; |
---|
69 | sout | "Symbol d: (50) " | identity_t(D.d) | "," | identity_t(ACD.d) | nl; |
---|
70 | sout | "Symbol cd: (60) " | identity_t(CD.cd) | "," | identity_t(ACD.cd) | nl; |
---|
71 | sout | "Symbol acd: (70) " | identity_t(ACD.acd) | nl; |
---|
72 | } |
---|