Add support for flagset composite types
This commit is contained in:
parent
c0dee46fe9
commit
e9a5b640ac
2 changed files with 22 additions and 1 deletions
|
|
@ -1104,7 +1104,6 @@ These features are planned for future releases.
|
||||||
- Support for va_args type
|
- Support for va_args type
|
||||||
- Header parsing tool for generating a data model?
|
- Header parsing tool for generating a data model?
|
||||||
- Generic type aliases
|
- Generic type aliases
|
||||||
- Helpers for generating bitflags
|
|
||||||
- Unsigned integer types
|
- Unsigned integer types
|
||||||
- Record-based struct types
|
- Record-based struct types
|
||||||
- Helper macro for out arguments
|
- Helper macro for out arguments
|
||||||
|
|
|
||||||
|
|
@ -1279,6 +1279,28 @@
|
||||||
[obj [_enum variants & {:keys [_repr]}]]
|
[obj [_enum variants & {:keys [_repr]}]]
|
||||||
((set/map-invert (enum-variants-map variants)) obj))
|
((set/map-invert (enum-variants-map variants)) obj))
|
||||||
|
|
||||||
|
;;; Flagsets
|
||||||
|
|
||||||
|
(defmethod primitive-type ::flagset
|
||||||
|
[[_flagset _bits & {:keys [repr]}]]
|
||||||
|
(if repr
|
||||||
|
(primitive-type repr)
|
||||||
|
::int))
|
||||||
|
|
||||||
|
(defmethod serialize* ::flagset
|
||||||
|
[obj [_flagset bits & {:keys [repr]}] scope]
|
||||||
|
(let [bits-map (enum-variants-map bits)]
|
||||||
|
(reduce #(bit-set %1 (get bits-map %2)) (serialize* 0 (or repr ::int) scope) obj)))
|
||||||
|
|
||||||
|
(defmethod deserialize* ::flagset
|
||||||
|
[obj [_flagset bits & {:keys [repr]}]]
|
||||||
|
(let [bits-map (set/map-invert (enum-variants-map bits))]
|
||||||
|
(reduce #(if-not (zero? (bit-and 1 (bit-shift-right obj %2)))
|
||||||
|
(conj %1 (bits-map %2))
|
||||||
|
%1)
|
||||||
|
#{}
|
||||||
|
(range (* 8 (size-of (or repr ::int)))))))
|
||||||
|
|
||||||
(s/def ::type
|
(s/def ::type
|
||||||
(s/spec
|
(s/spec
|
||||||
(s/nonconforming
|
(s/nonconforming
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue