-
Notifications
You must be signed in to change notification settings - Fork 1
/
flags.go
31 lines (28 loc) · 1.07 KB
/
flags.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package ui
import "math/bits"
type Flags uint64
func (f Flags) Any() bool { return f != 0 }
func (f Flags) None() bool { return f == 0 }
func (f Flags) Exactly(other Flags) bool { return f == other }
func (f Flags) Is(other Flags) bool { return (f & other) != 0 }
func (f Flags) Not(other Flags) bool { return (f & other) == 0 }
func (f Flags) All(other Flags) bool { return (f & other) == other }
func (f Flags) NotAll(other Flags) bool { return (f & other) != other }
func (f Flags) WithRemove(other Flags) Flags { return f & ^other }
func (f Flags) WithAdd(other Flags) Flags { return f | other }
func (f *Flags) Clear() { *f = 0 }
func (f *Flags) Remove(other Flags) { *f = *f & ^other }
func (f *Flags) Add(other Flags) { *f = *f | other }
func (f *Flags) Removed(other Flags) bool {
is := *f & other
*f = *f & ^is
return is != 0
}
func (f *Flags) Take() Flags {
if *f == 0 {
return 0
}
i := bits.TrailingZeros64(uint64(*f))
*f &= ^(1 << i)
return Flags(1 << i)
}