struct test

main
Matthew Butterick 6 years ago
parent a985b09df9
commit 19445f94bd

@ -36,6 +36,15 @@ https://github.com/mbutterick/restructure/blob/master/src/Struct.coffee
(dict-set! sdr '_currentOffset (- (pos port) (dict-ref sdr '_startOffset))) (dict-set! sdr '_currentOffset (- (pos port) (dict-ref sdr '_startOffset)))
sdr)) sdr))
(define private-keys '(parent _startOffset _currentOffset _length))
(define (dict->mutable-hash x)
(define h (make-hasheq))
(for ([(k v) (in-dict x)]
#:unless (memq k private-keys))
(hash-set! h k v))
h)
(define xstruct% (define xstruct%
(class xenobase% (class xenobase%
(super-new) (super-new)
@ -49,6 +58,9 @@ https://github.com/mbutterick/restructure/blob/master/src/Struct.coffee
(raise-result-error 'xstruct-decode "dict" decoded-hash)) (raise-result-error 'xstruct-decode "dict" decoded-hash))
decoded-hash) decoded-hash)
(define/override (decode port parent)
(dict->mutable-hash (xxdecode port parent)))
(define/augment (xxencode val port [parent-arg #f]) (define/augment (xxencode val port [parent-arg #f])
;; check keys first, since `size` also relies on keys being valid ;; check keys first, since `size` also relies on keys being valid
(unless (dict? val) (unless (dict? val)
@ -62,21 +74,21 @@ https://github.com/mbutterick/restructure/blob/master/src/Struct.coffee
'parent parent-arg 'parent parent-arg
'val val 'val val
'pointerSize 0)) 'pointerSize 0))
(dict-set! parent 'pointerOffset (+ (pos port) (xxsize-without-pointers val parent))) (dict-set! parent 'pointerOffset (+ (pos port) (xxsize val parent #f)))
(for ([(key type) (in-dict @fields)]) (for ([(key type) (in-dict @fields)])
(send type xxencode (dict-ref val key) port parent)) (send type xxencode (dict-ref val key) port parent))
(for ([ptr (in-list (dict-ref parent 'pointers))]) (for ([ptr (in-list (dict-ref parent 'pointers))])
(send (dict-ref ptr 'type) xxencode (dict-ref ptr 'val) port (dict-ref ptr 'parent)))) (send (dict-ref ptr 'type) xxencode (dict-ref ptr 'val) port (dict-ref ptr 'parent))))
(define (xxsize-without-pointers [val #f] [parent #f]) (define/augment (xxsize [val #f] [parent-arg #f] [include-pointers #t])
(define new-parent (mhasheq 'parent parent 'val val 'pointerSize 0)) (define parent (mhasheq 'parent parent-arg
(for/sum ([(key type) (in-dict @fields)] 'val val
'pointerSize 0))
(define fields-size (for/sum ([(key type) (in-dict @fields)]
#:when (xenomorphic-type? type)) #:when (xenomorphic-type? type))
(send type xxsize (and val (dict-ref val key)) new-parent))) (send type xxsize (and val (dict-ref val key)) parent)))
(define pointers-size (if include-pointers (dict-ref parent 'pointerSize) 0))
(define/augment (xxsize [val #f] [parent #f]) (+ fields-size pointers-size))))
(define pointers-size (dict-ref parent 'pointerSize))
(+ (xxsize-without-pointers val parent) pointers-size))))
(define (xstruct? x) (is-a? x xstruct%)) (define (xstruct? x) (is-a? x xstruct%))

Loading…
Cancel
Save