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
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
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.