@@ -18,47 +18,50 @@ object Flags {
18
18
opaque type Flag <: FlagSet = Long
19
19
private [Flags ] def Flag (bits : Long ): Flag = bits
20
20
}
21
- export opaques .FlagSet
21
+ import opaques .toBits
22
22
23
23
type Flag = opaques.Flag
24
24
25
+ type FlagSet = opaques.FlagSet
26
+ def FlagSet (bits : Long ): FlagSet = opaques.FlagSet (bits)
27
+
25
28
extension (x : FlagSet ) {
26
29
27
- def bits : Long = opaques. toBits(x)
30
+ def bits : Long = toBits(x)
28
31
29
32
/** The union of the given flag sets.
30
33
* Combining two FlagSets with `|` will give a FlagSet
31
34
* that has the intersection of the applicability to terms/types
32
35
* of the two flag sets. It is checked that the intersection is not empty.
33
36
*/
34
37
def | (y : FlagSet ): FlagSet =
35
- if (x.bits == 0 ) y
36
- else if (y.bits == 0 ) x
38
+ if (toBits(x) == 0 ) y
39
+ else if (toBits(y) == 0 ) x
37
40
else {
38
- val tbits = x.bits & y.bits & KINDFLAGS
41
+ val tbits = toBits(x) & toBits(y) & KINDFLAGS
39
42
if (tbits == 0 )
40
43
assert(false , s " illegal flagset combination: ${x.flagsString} and ${y.flagsString}" )
41
- FlagSet (tbits | ((x.bits | y.bits ) & ~ KINDFLAGS ))
44
+ FlagSet (tbits | ((toBits(x) | toBits(y) ) & ~ KINDFLAGS ))
42
45
}
43
46
44
47
/** The intersection of the given flag sets */
45
- def & (y : FlagSet ): FlagSet = FlagSet (x.bits & y.bits )
48
+ def & (y : FlagSet ): FlagSet = FlagSet (toBits(x) & toBits(y) )
46
49
47
50
/** The intersection of a flag set with the complement of another flag set */
48
51
def &~ (y : FlagSet ): FlagSet = {
49
- val tbits = x.bits & KINDFLAGS
50
- if ((tbits & y.bits ) == 0 ) x
51
- else FlagSet (tbits | ((x.bits & ~ y.bits ) & ~ KINDFLAGS ))
52
+ val tbits = toBits(x) & KINDFLAGS
53
+ if ((tbits & toBits(y) ) == 0 ) x
54
+ else FlagSet (tbits | ((toBits(x) & ~ toBits(y) ) & ~ KINDFLAGS ))
52
55
}
53
56
54
57
def ^ (y : FlagSet ) =
55
- FlagSet ((x.bits | y.bits) & KINDFLAGS | (x.bits ^ y.bits ) & ~ KINDFLAGS )
58
+ FlagSet ((toBits(x) | toBits(y)) & KINDFLAGS | (toBits(x) ^ toBits(y) ) & ~ KINDFLAGS )
56
59
57
60
/** Does the given flag set contain the given flag?
58
61
* This means that both the kind flags and the carrier bits have non-empty intersection.
59
62
*/
60
63
def is (flag : Flag ): Boolean = {
61
- val fs = x.bits & flag.bits
64
+ val fs = toBits(x) & toBits( flag)
62
65
(fs & KINDFLAGS ) != 0 && (fs & ~ KINDFLAGS ) != 0
63
66
}
64
67
@@ -71,7 +74,7 @@ object Flags {
71
74
* This means that both the kind flags and the carrier bits have non-empty intersection.
72
75
*/
73
76
def isOneOf (flags : FlagSet ): Boolean = {
74
- val fs = x.bits & flags.bits
77
+ val fs = toBits(x) & toBits( flags)
75
78
(fs & KINDFLAGS ) != 0 && (fs & ~ KINDFLAGS ) != 0
76
79
}
77
80
@@ -84,9 +87,9 @@ object Flags {
84
87
* Pre: The intersection of the term/type flags of both sets must be non-empty.
85
88
*/
86
89
def isAllOf (flags : FlagSet ): Boolean = {
87
- val fs = x.bits & flags.bits
88
- ((fs & KINDFLAGS ) != 0 || flags.bits == 0 ) &&
89
- (fs >>> TYPESHIFT ) == (flags.bits >>> TYPESHIFT )
90
+ val fs = toBits(x) & toBits( flags)
91
+ ((fs & KINDFLAGS ) != 0 || toBits( flags) == 0 ) &&
92
+ (fs >>> TYPESHIFT ) == (toBits( flags) >>> TYPESHIFT )
90
93
}
91
94
92
95
/** Does a given flag set have all of the flags in another flag set
@@ -95,35 +98,35 @@ object Flags {
95
98
*/
96
99
def isAllOf (flags : FlagSet , butNot : FlagSet ): Boolean = x.isAllOf(flags) && ! x.isOneOf(butNot)
97
100
98
- def isEmpty : Boolean = (x.bits & ~ KINDFLAGS ) == 0
101
+ def isEmpty : Boolean = (toBits(x) & ~ KINDFLAGS ) == 0
99
102
100
103
/** Is a given flag set a subset of another flag set? */
101
- def <= (y : FlagSet ): Boolean = (x.bits & y.bits) == x.bits
104
+ def <= (y : FlagSet ): Boolean = (toBits(x) & toBits(y)) == toBits(x)
102
105
103
106
/** Does the given flag set apply to terms? */
104
- def isTermFlags : Boolean = (x.bits & TERMS ) != 0
107
+ def isTermFlags : Boolean = (toBits(x) & TERMS ) != 0
105
108
106
109
/** Does the given flag set apply to terms? */
107
- def isTypeFlags : Boolean = (x.bits & TYPES ) != 0
110
+ def isTypeFlags : Boolean = (toBits(x) & TYPES ) != 0
108
111
109
112
/** The given flag set with all flags transposed to be type flags */
110
- def toTypeFlags : FlagSet = if (x.bits == 0 ) x else FlagSet (x.bits & ~ KINDFLAGS | TYPES )
113
+ def toTypeFlags : FlagSet = if (toBits(x) == 0 ) x else FlagSet (toBits(x) & ~ KINDFLAGS | TYPES )
111
114
112
115
/** The given flag set with all flags transposed to be term flags */
113
- def toTermFlags : FlagSet = if (x.bits == 0 ) x else FlagSet (x.bits & ~ KINDFLAGS | TERMS )
116
+ def toTermFlags : FlagSet = if (toBits(x) == 0 ) x else FlagSet (toBits(x) & ~ KINDFLAGS | TERMS )
114
117
115
118
/** The given flag set with all flags transposed to be common flags */
116
- def toCommonFlags : FlagSet = if (x.bits == 0 ) x else FlagSet (x.bits | KINDFLAGS )
119
+ def toCommonFlags : FlagSet = if (toBits(x) == 0 ) x else FlagSet (toBits(x) | KINDFLAGS )
117
120
118
121
/** The number of non-kind flags in the given flag set */
119
- def numFlags : Int = java.lang.Long .bitCount(x.bits & ~ KINDFLAGS )
122
+ def numFlags : Int = java.lang.Long .bitCount(toBits(x) & ~ KINDFLAGS )
120
123
121
124
/** The lowest non-kind bit set in the given flag set */
122
- def firstBit : Int = java.lang.Long .numberOfTrailingZeros(x.bits & ~ KINDFLAGS )
125
+ def firstBit : Int = java.lang.Long .numberOfTrailingZeros(toBits(x) & ~ KINDFLAGS )
123
126
124
127
/** The list of non-empty names of flags with given index idx that are set in the given flag set */
125
128
private def flagString (idx : Int ): List [String ] =
126
- if ((x.bits & (1L << idx)) == 0 ) Nil
129
+ if ((toBits(x) & (1L << idx)) == 0 ) Nil
127
130
else {
128
131
def halfString (kind : Int ) =
129
132
if ((x.bits & (1L << kind)) != 0 ) flagName(idx)(kind) else " "
0 commit comments