(defmacro defkeywordize-bitset [name class constants]
(let [bitset (symbol "bitset")]
`(defn ~name [~bitset]
(cond-> []
~@(mapcat (fn [sym]
`[(not (zero? (bit-and ~bitset (. ~class ~sym))))
(conj ~(keyword sym))])
constants)))))
;;; usage
;;; https://developer.android.com/reference/android/content/IntentFilter.html
(defkeywordize-bitset intent-filter-match-result
android.content.IntentFilter
[MATCH_CATEGORY_EMPTY
MATCH_CATEGORY_SCHEME
;; MATCH_CATEGORY_SCHEME_SPECIFIC_PART
MATCH_CATEGORY_HOST
MATCH_CATEGORY_PORT
MATCH_CATEGORY_PATH
MATCH_CATEGORY_TYPE
MATCH_ADJUSTMENT_NORMAL])
(intent-filter-match-result 0xfffff)
;; => [:MATCH_ADJUSTMENT_NORMAL]
(intent-filter-match-result 0xffffffff)
;; => [:MATCH_CATEGORY_EMPTY :MATCH_CATEGORY_SCHEME :MATCH_CATEGORY_HOST :MATCH_CATEGORY_PORT :MATCH_CATEGORY_PATH :MATCH_CATEGORY_TYPE :MATCH_ADJUSTMENT_NORMAL]