A C-compatible bitmask flags interface, with a subset of nim set functionality
Flags[T; E] = distinct T
-
A C-compatible bitmask-set interface
this exists because nim sets aren't compatible with C bitmasks
T: SomeInteger is the backing type for the flags type and determines the base type and size
E: enum is the enum type containing the range of values that the set is meant to represent, be careful not to accidentally overlap the bits in the values
Overlapping enum values in bitfields is sometimes done on purpose but note that when stringized only the basic values will be shown, not overlapping values
proc `$`[T, E](flags: Flags[T, E]): string {.noSideEffect.}
-
stringize a flags in a format similar to a set
cannot be called at compiletime
proc `*`[T, E](flags1, flags2: Flags[T, E]): Flags[T, E] {.noSideEffect.}
-
intersect of flags1 and flags2
can be called at compiletime
proc `+`[T, E](flags1, flags2: Flags[T, E]): Flags[T, E] {.noSideEffect.}
-
union of flags1 and flags2
can be called at compiletime
proc `-`[T, E](flags1, flags2: Flags[T, E]): Flags[T, E] {.noSideEffect.}
-
difference of flags1 and flags2
can be called at compiletime
proc `==`[T, E](flags1, flags2: Flags[T, E]): bool {.noSideEffect.}
-
check if setflags is an identity of flags
can be called at compiletime
proc `==`[T, E](flags: Flags[T, E]; arrflags: openArray[E]): bool {.noSideEffect.}
-
check if arrflags is an identity of flags
can be called at compiletime
proc `==`[T, E](flags: Flags[T, E]; setflags: set[E]): bool {.noSideEffect.}
-
check if setflags is an identity of flags
cannot be called at compiletime
func card[T, E](flags: Flags[T, E]): int
-
returns number of set flags in flags
cannot be called at compiletime
proc contains[T, E](flags, subflags: Flags[T, E]): bool {.noSideEffect.}
-
check if subflags is a subset or identity of flags
can be called at compiletime
proc contains[T, E](flags: Flags[T, E]; arrflags: openArray[E]): bool {.
noSideEffect.}
-
check if arrflags is a subset or identity of flags
can be called at compiletime
proc contains[T, E](flags: Flags[T, E]; flag: E): bool {.noSideEffect.}
-
check if flag is contained in flags
can be called at compiletime
proc contains[T, E](flags: Flags[T, E]; setflags: set[E]): bool {.noSideEffect.}
-
check if setflags is a subset or identity of flags
cannot be called at compiletime
func makeFlags[T, E](BackingType: typedesc[T]; varflags: varargs[E]): Flags[T, E]
-
make a Flags type from variadic arguments
BackingType is used to streamline generic type substitution
can be called at comptime, use this or toFlags[T, E](arrflags, BackingType) if you need a flag compiletime constant
func set[T, E](flags: var Flags[T, E]; flag: E)
-
set a flag value in flags
func subsetOf[T, E](flags, superflags: Flags[T, E]): bool
-
check if flags is a subset of superflags (but not an identity of)
can be called at compiletime
func supersetOf[T, E](flags, subflags: Flags[T, E]): bool
-
check if flags is a superset of subflags (but not an identity of)
can be called at compiletime
func toFlags[T, E](arrflags: openArray[E]; BackingType: typedesc[T]): Flags[T, E]
-
convert an open array into a flags value
BackingType is used to streamline generic type substitution
can be called at comptime, use this or makeFlags if you need a flag compiletime constant
func toFlags[T, E](setflags: set[E]; BackingType: typedesc[T]): Flags[T, E]
-
convert a nim set into a flags value
BackingType is used to streamline generic type substitution
cannot be called at compiletime due to tyIntX to tyEnum castin the holeyItems iterator
func toSet[T, E](flags: Flags[T, E]): set[E]
-
convert flags to a nim set
cannot be called at compiletime
func unset[T, E](flags: var Flags[T, E]; flag: E)
-
unset a flag value in flags
iterator holeyItems[T: enum](a: set[T]): T {.inline.}
-
Iterates over each element of a. holeyItems iterates only over the elements that are really in the set (and not over the ones the set is able to hold).
uses a cast expression instead of a normal cast to allow handling enums with holes without HoleEnumConv warnings
cannot be called at compiletime because the VM doesn't support tyIntX to tyEnum casts
iterator items[T, E](flags: Flags[T, E]): E {.inline.}
-
iterator over flags contained in flags
not callable at compiletime