chickadee » jiffi » define-enum-unpacker

(define-enum-unpacker ...)syntax

Defines a procedure that will "unpack" an integer (a bitfield) into a list of enum symbols. This supplements define-enum-group in cases where the enums are bitmasks or flags.

See also define-enum-packer to go in the opposite direction, converting a list of symbols into an integer.

Usage:

(define-enum-unpacker UNPACKER
  (INT->SYMBOL)
  masks: BITMASKS)

UNPACKER is the procedure name to define as the enum unpacker.

INT->SYMBOL is an existing procedure that converts an integer value (bitmask) into a symbol, such as a procedure defined with define-enum-group.

BITMASKS is an expression that evaluates to a list of all the integer bitmasks that should be recognized. The expression will be evaluated once, and each bitmask will be converted using INT->SYMBOL once, at the time UNPACKER is defined.

Bitmasks that have a value of 0 (zero) will always match, so it is not useful to include them in the BITMASKS list.

Example:

(foreign-declare "
typedef enum {
  FOO_KMOD_NONE   = 0b0000,
  FOO_KMOD_LCTRL  = 0b0001,
  FOO_KMOD_RCTRL  = 0b0010,
  FOO_KMOD_CTRL   = 0b0011
} FOO_KeyMod;
")

(define-enum-group
  type: int
  symbol->int: keymod->int
  int->symbol: int->keymod
  ((none  FOO_KMOD_NONE)
   (lctrl FOO_KMOD_LCTRL)
   (rctrl FOO_KMOD_RCTRL)
   (ctrl  FOO_KMOD_CTRL)))

(define-enum-unpacker unpack-keymods
  (int->keymod)
  masks: (list FOO_KMOD_LCTRL
               FOO_KMOD_RCTRL
               FOO_KMOD_CTRL))

(unpack-keymods FOO_KMOD_NONE)     ; ⇒ '()
(unpack-keymods FOO_KMOD_LCTRL)    ; ⇒ '(lctrl)
(unpack-keymods FOO_KMOD_CTRL)     ; ⇒ '(lctrl rctrl ctrl)