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).
I implemented this package mainly to create a higher level manipulation of flags from C libraries in Julia. I used to program in Common Lisp and the main interface for handling C libraries (CFFI) translates bit flags to lists of keywords (and vice-versa), which seems more like a high level library. Then I found the package BitFlags
, which is nice, but doesn’t have tools for, e.g., getting the list of flags that are set in a BitFlag
. Also, each flag is stored in a const
variable, which is not bad, but looks like a low level language.
A few examples to illustrate the idea.
julia> @flagset FontFlags::UInt8 bold italic large=8
julia> FontFlags(1)
FontFlags(:bold) = 0x01
julia> FontFlags(:bold, :italic)
FontFlags(:bold, :italic) = 0x03
julia> FontFlags(3) | FontFlags(8)
FontFlags(:bold, :italic, :large) = 0x0b
julia> for flag in FontFlags(3); println(flag) end
bold
italic
julia> :bold in FontFlags(3)
true
Any suggestions, ideas or comments are welcome, of course.