FlagSets
is based on BitFlags.jl
, but with a different concept: FlagSet
is a subtype of AbstractSet
and implement both set and bitwise operations (each bit is associated with a flag, and so a sequence of bits is associated with a set of flags - where 1 indicates the flag is in the set and 0 indicates it is not in the set).
In the new version, flags can be of any type, which widens the usability of FlagSets
. That allows one to create a type whose objects are sets contained in a finite universe.
Note: there has been a slight change in syntax, because now flags are evaluated during macroexpansion. The previous syntax is available with @symbol_flagset
macro.
julia> using FlagSets
julia> @flagset PrimeNumbers 2 3 5 7 11 13 17 19 23 29
julia> PrimeNumbers([2,17,29])
PrimeNumbers with 3 elements:
2
17
29
julia> PrimeNumbers([2,3,5,7,9])
ERROR: ArgumentError: invalid value for FlagSet PrimeNumbers: 9
Stacktrace:
# [...]
julia> eltype(PrimeNumbers)
Int64
julia> 2 ∈ typemax(PrimeNumbers)
true
julia> 9 ∈ typemax(PrimeNumbers)
false
The association of flags (prime numbers) and bits are printed with the type:
julia> PrimeNumbers
FlagSet PrimeNumbers:
0x00000001 --> 2
0x00000002 --> 3
0x00000004 --> 5
0x00000008 --> 7
0x00000010 --> 11
0x00000020 --> 13
0x00000040 --> 17
0x00000080 --> 19
0x00000100 --> 23
0x00000200 --> 29
With non-Symbol
flag sets, to create objects, you need to provide an iterable, just like you would construct Set
(that avoids ambiguities). If you construct from an integer, by default, it interprets the value as a bit mask. E.g.:
julia> PrimeNumbers(0x00000004)
PrimeNumbers with 1 element:
5
julia> Integer(PrimeNumbers([2,3,5,7,11]))
0x0000001f
julia> PrimeNumbers(0x0000001f)
PrimeNumbers with 5 elements:
2
3
5
7
11
To avoid confusion, in this case, it makes sense to override the method of construction with integer arguments:
julia> PrimeNumbers(ints::Integer...) = PrimeNumbers(ints);
julia> PrimeNumbers(11)
PrimeNumbers with 1 element:
11
# Interpret 11 as a bitmask
julia> PrimeNumbers(FlagSets.BitMask(11))
PrimeNumbers with 3 elements:
2
3
7
Comments, critics, suggestions are welcome, as always.