source: doc/theses/jiada_liang_MMath/test1.cfa@ 56ec508

Last change on this file since 56ec508 was 5ca5263, checked in by Peter A. Buhr <pabuhr@…>, 13 months ago

update test file covering problem cases

  • Property mode set to 100644
File size: 4.7 KB
Line 
1#include <fstream.hfa> // sout
2#include <stdlib.hfa> // ato
3#include <enum.hfa>
4
5// integral
6enum Letter {
7 A = 'A', B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
8 a = 'a', b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z
9};
10enum( Letter ) Greek { Alph = A, Beta = B, Gamma = G, /* more enums */ Zeta = Z }; // alphabet intersection
11
12// integral
13enum( char ) Currency { Dollar = '$', Cent = '¢', Yen = '¥', Pound = '£', Euro = 'E' }; // iso-latin-1
14enum( Currency ) Europe { Euro = Currency.Euro, Pound = Currency.Pound };
15
16enum( signed char ) srgb { Red = -1, Green = 0, Blue = 1 };
17enum( long long int ) BigNum { X = 123_456_789_012_345, Y = 345_012_789_456_123 };
18// non-integral
19enum( double ) Math { PI_2 = 1.570796, PI = 3.141597, E = 2.718282 };
20enum( _Complex ) Plane { X = 1.5+3.4i, Y = 7+3i, Z = 0+0.5i };
21// pointer
22enum( const char * ) Name { Fred = "FRED", Mary = "MARY", Jane = "JANE" };
23int i, j, k;
24enum( int * ) ptr { I = &i, J = &j, K = &k };
25//enum( int & ) ref { I = i, J = j, K = k };
26// tuple
27//enum( [int, int] ) { T = [ 1, 2 ] };
28// function
29void f() {} void g() {}
30enum( void (*)() ) funs { F = f, G = g };
31// aggregate
32struct Person { char * name; int age, height; };
33enum( Person ) friends { Liz = { "ELIZABETH", 22, 170 }, //Beth = Liz,
34 Jon = { "Jonathan", 35, 190 } };
35
36enum() Mode { O_RDONLY, O_WRONLY, O_CREAT, O_TRUNC, O_APPEND };
37Mode mode = O_RDONLY;
38void opaque() {
39bool b = mode == O_RDONLY || mode < O_APPEND; // disallowed
40//int www = mode; // disallowed
41}
42
43enum( char * ) Colour { Red = "red", Green = "green", Blue = "blue" };
44
45enum E1 { A1, B1, C1 = A1, D1 = B1 };
46enum(float) E2 { A2 = 3.5, B2 = 4.5, C2 = A, D2 = B };
47
48void fred() {
49Letter letter = A;
50Greek greek = Beta;
51letter = Beta; // allowed, letter == B
52//greek = A; // disallowed
53
54 for ( Greek l = Alph; posn(l) < posn(Gamma); l = succ( l ) ) {
55 printf( "%s %c %d\n", label( l ), value( l ), posn( l ) );
56 }
57 for ( Currency c = Dollar; posn(c) < posn(Currency.Euro); c = succ( c ) ) {
58 printf( "%s %c %d\n", label( c ), value( c ), posn( c ) );
59 }
60}
61
62enum( const char * ) Names { Fred = "FRED", Mary = "MARY", Jane = "JANE" };
63enum( const char * ) Names2 { inline Names, Jack = "JACK", Jill = "JILL" };
64enum( const char * ) Names3 { inline Names2, Sue = "SUE", Tom = "TOM" };
65void bar() {
66 Names fred = Names.Fred;
67 (Names2)fred; (Names3)fred; (Names3)Names2.Jack; // cast to super type
68 Names2 fred2 = fred; Names3 fred3 = fred2; // assign to super type
69 const char * name = fred;
70 Names name = Fred;
71 sout | name | label( name ) | posn( name ) | value( name );
72}
73void f( Names n ) { sout | "Name" | posn( n ); }
74void g( Names2 );
75void h( Names3 );
76void j( char * );
77
78enum CColour { Red, Blue, Green };
79CColour c0 = 0;
80CColour c1 = 1;
81CColour c = 2;
82int w = Red;
83
84void coo() {
85 enum(int) Color { Red, Blue, Green };
86 Colour c = Red;
87 sout | countof( Colour ) | Countof( c );
88// sout | Countof( Colour );
89 sout | countof( c );
90}
91
92// enum(int) Week ! { Mon, Tue, Wed, Thu = 10, Fri, Sat, Sun };
93// enum(int) RGB ! { Red, Green, Blue };
94
95// void foo() {
96// with ( Week, RGB ) {
97// weekday = Sun;
98// rgb = Green;
99// }
100// }
101
102void baz() {
103 enum(int) Count { First, Second, Third/* = First*/, Fourth/* = Second*/ };
104 enum CCount { First, Second, Third/* = First*/, Fourth/* = Second*/ };
105 Count cnt = Second;
106 CCount ccnt = Second;
107 if ( cnt < Third ) sout | "less than Third";
108 if ( cnt ) sout | "XXX";
109 if ( ccnt ) sout | "YYY";
110 enum(float) F {WWW = 0.0};
111 F f;
112 if ( f ) sout | "FFF";
113 bool ?!=?( Name n, zero_t ) { sout | "DDD"; return n != Fred; }
114 Name n = Mary;
115 if ( n ) sout | "NAME";
116 choose( cnt ) {
117 case First: sout | "First";
118 case Second: sout | "Second";
119 case Third: sout | "Third";
120 case Fourth: sout | "Fourth";
121 }
122// for (d; Week) { sout | d; }
123// for (p; +~=Planet) { sout | p; }
124 for ( cx; Count ) { sout | cx | nonl; } sout | nl;
125 for ( cx; +~= Count ) { sout | cx | nonl; } sout | nl;
126 for ( cx; -~= Count ) { sout | cx | nonl; } sout | nl;
127 for ( Count cx = lowerBound();; ) {
128 sout | cx | nonl;
129 if ( cx == upperBound() ) break;
130 cx = succ( cx );
131 }
132 sout | nl;
133}
134
135int main() {
136 fred();
137 Names name = Names.Fred;
138// f( name );
139
140 int jane_pos = posn( Names.Jane );
141 const char * jane_value = value( Names.Jane );
142 const char * jane_label = label( Names.Jane );
143 sout | Names.Jane | posn( Names.Jane) | label( Names.Jane ) | value( Names.Jane );
144
145 bar();
146 baz();
147 coo();
148
149 enum Ex { Ax, Bx, Cx, Nx };
150 float H1[Nx] = { [Ax] : 3.4, [Bx] : 7.1, [Cx] : 0.01 }; // C
151// float H2[Ex] = { [Ax] : 3.4, [Bx] : 7.1, [Cx] : 0.01 }; // CFA
152
153 enum(int) E { A = 3 } e = A;
154 sout | A | label( A ) | posn( A ) | value( A );
155 sout | e | label( e ) | posn( e ) | value( e );
156}
Note: See TracBrowser for help on using the repository browser.