source: libcfa/src/enum.hfa@ b797fe36

Last change on this file since b797fe36 was 2dd5c6d, checked in by JiadaL <j82liang@…>, 14 months ago

Update +=/-= for enums

  • Property mode set to 100644
File size: 1.9 KB
Line 
1#pragma once
2
3#include "iostream.hfa"
4
5forall( E ) trait Bounded {
6 E lowerBound();
7 E upperBound();
8};
9
10forall( E | Bounded( E ) ) trait Serial {
11 unsigned fromInstance( E e );
12 E fromInt_unsafe( unsigned i );
13 E succ_unsafe( E e );
14 E pred_unsafe( E e );
15};
16
17forall( E | Serial( E ) ) {
18 E fromInt( unsigned i );
19 E succ( E e );
20 E pred( E e );
21 int Countof( E e );
22}
23
24// forall( E | Bounded(E) ) trait SafeSerial {
25// // unsigned fromInstance( E e );
26// E fromInt_unsafe( unsigned i );
27// // E succ_unsafe( E e );
28// //E pred_unsafe( E e );
29
30// unsigned fromInstance( E e );
31// E fromInt( unsigned i );
32// E succ( E e );
33// E pred( E e );
34// };
35
36forall( E ) trait CfaEnum {
37 const char * label( E e );
38 unsigned int posn( E e );
39};
40
41forall( E, V | CfaEnum( E ) ) trait TypedEnum {
42 V value( E e );
43};
44
45// I/O
46
47forall( istype & | istream( istype ), E | CfaEnum( E ) | Serial(E) )
48istype & ?|?( istype &, E & );
49
50forall( ostype & | ostream( ostype ), E | CfaEnum( E ) ) {
51 ostype & ?|?( ostype &, E );
52 OSTYPE_VOID( E );
53}
54
55static inline
56forall( E | Serial(E) | CfaEnum(E) ) {
57 int ?==?( E l, E r ) { return posn( l ) == posn( r ); } // relational operators
58 int ?!=?( E l, E r ) { return posn( l ) != posn( r ); }
59 int ?<?( E l, E r ) { return posn( l ) < posn( r ); }
60 int ?<=?( E l, E r ) { return posn( l ) <= posn( r ); }
61 int ?>?( E l, E r ) { return posn( l ) > posn( r ); }
62 int ?>=?( E l, E r ) { return posn( l ) >= posn( r ); }
63
64 E ++?( E & l ) { // increment operators
65 l = succ( l );
66 return l;
67 }
68
69 E ?+=? ( E & l, one_t ) {
70 l = succ(l);
71 return l;
72 }
73
74 E ?-=? ( E & l, one_t ) {
75 l = pred(l);
76 return l;
77 }
78
79 E ?+=? ( E & l, int i ) {
80 int pos = posn(l) + i;
81 return fromInt(pos);
82 }
83
84 E ?-=? ( E & l, int i ) {
85 int pos = posn(l) - i;
86 return fromInt(pos);
87 }
88
89 E ?++( E & l ) {
90 E ret = l;
91 l = succ( l );
92 return ret;
93 }
94
95 E --?( E & l ) {
96 l = pred( l );
97 return l;
98 }
99
100 E ?--( E & l ) {
101 E ret = l;
102 l = pred( l );
103 return ret;
104 }
105}
Note: See TracBrowser for help on using the repository browser.