8
8
class EnumMap extends SplObjectStorage
9
9
{
10
10
11
- public function __construct ($ enumClass )
11
+ const KEY_AS_INDEX = 1 ;
12
+ const KEY_AS_NAME = 2 ;
13
+ const KEY_AS_VALUE = 3 ;
14
+ const KEY_AS_ORDINAL = 4 ;
15
+ const CURRENT_AS_ENUM = 8 ;
16
+ const CURRENT_AS_DATA = 16 ;
17
+ const CURRENT_AS_NAME = 24 ;
18
+ const CURRENT_AS_VALUE = 56 ;
19
+ const CURRENT_AS_ORDINAL = 120 ;
20
+
21
+ private $ enumClass ;
22
+ private $ flags ;
23
+
24
+ public function __construct ($ enumClass , $ flags = null )
12
25
{
13
26
if (!is_subclass_of ($ enumClass , __NAMESPACE__ . '\Enum ' )) {
14
27
throw new InvalidArgumentException (sprintf (
@@ -17,6 +30,42 @@ public function __construct($enumClass)
17
30
));
18
31
}
19
32
$ this ->enumClass = $ enumClass ;
33
+
34
+ if ($ flags === null ) {
35
+ $ flags = self ::KEY_AS_INDEX | self ::CURRENT_AS_ENUM ;
36
+ }
37
+ $ this ->setFlags ($ flags );
38
+ }
39
+
40
+ public function getEnumClass ()
41
+ {
42
+ return $ this ->enumClass ;
43
+ }
44
+
45
+ public function setFlags ($ flags )
46
+ {
47
+ $ flags = (int )$ flags ;
48
+
49
+ $ keyFlags = $ flags & 7 ;
50
+ if ($ keyFlags < 1 || $ keyFlags > 4 ) {
51
+ throw new InvalidArgumentException (
52
+ "Flags have to contain one of the 'KEY_AS_*' constants "
53
+ );
54
+ }
55
+
56
+ $ currentFlags = $ flags & 120 ;
57
+ if ($ currentFlags < 8 || $ currentFlags > 120 ) {
58
+ throw new InvalidArgumentException (
59
+ "Flags have to contain one of the 'CURRENT_AS_*' constants "
60
+ );
61
+ }
62
+
63
+ $ this ->flags = $ flags ;
64
+ }
65
+
66
+ public function getFlags ()
67
+ {
68
+ return $ this ->flags ;
20
69
}
21
70
22
71
public function attach ($ enum , $ data = null )
@@ -89,4 +138,38 @@ private function initEnum(&$enum)
89
138
$ this ->enumClass
90
139
));
91
140
}
141
+
142
+ public function current ()
143
+ {
144
+ switch ($ this ->flags & 120 ) {
145
+ case self ::CURRENT_AS_ENUM :
146
+ return parent ::current ();
147
+ case self ::CURRENT_AS_DATA :
148
+ return parent ::getInfo ();
149
+ case self ::CURRENT_AS_VALUE :
150
+ return parent ::current ()->getValue ();
151
+ default :
152
+ throw new RuntimeException (
153
+ 'Invalid current flags '
154
+ );
155
+ }
156
+ }
157
+
158
+ public function key ()
159
+ {
160
+ switch ($ this ->flags & 7 ) {
161
+ case self ::KEY_AS_INDEX :
162
+ return parent ::key ();
163
+ case self ::KEY_AS_NAME :
164
+ return parent ::current ()->getName ();
165
+ case self ::KEY_AS_VALUE :
166
+ return parent ::current ()->getValue ();
167
+ case self ::KEY_AS_ORDINAL :
168
+ return parent ::current ()->getOrdinal ();
169
+ default :
170
+ throw new RuntimeException (
171
+ 'Invalid key flags '
172
+ );
173
+ }
174
+ }
92
175
}
0 commit comments