source: doc/theses/jiada_liang_MMath/test1.cfa @ 2325b57

Last change on this file since 2325b57 was 5ca5263, checked in by Peter A. Buhr <pabuhr@…>, 3 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.