ryoakg
11/30/2016 - 3:47 PM

keywordize-bitset.clj

(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]