Make mem write helpers receive offset as first arg

This commit is contained in:
Andrey Antukh 2025-08-12 16:55:39 +02:00
parent af02e12685
commit 5c4a60aee7
2 changed files with 93 additions and 55 deletions

View File

@ -469,9 +469,11 @@
;; alligned writes, so for heteregeneus writes we use
;; the buffer abstraction (DataView) for perform
;; surgical writes.
(mem/write-u8 dview (+ offset 0) (sr/translate-grid-track-type type))
(mem/write-f32 dview (+ offset 1) value)
(+ offset GRID-LAYOUT-ROW-U8-SIZE))
(-> offset
(mem/write-u8 dview (sr/translate-grid-track-type type))
(mem/write-f32 dview value)
(mem/assert-written offset GRID-LAYOUT-ROW-U8-SIZE)))
offset
entries)
@ -489,9 +491,12 @@
;; alligned writes, so for heteregeneus writes we use
;; the buffer abstraction (DataView) for perform
;; surgical writes.
(mem/write-u8 dview (+ offset 0) (sr/translate-grid-track-type type))
(mem/write-f32 dview (+ offset 1) value)
(+ offset GRID-LAYOUT-COLUMN-U8-SIZE))
(-> offset
(mem/write-u8 dview (sr/translate-grid-track-type type))
(mem/write-f32 dview value)
(mem/assert-written offset GRID-LAYOUT-COLUMN-U8-SIZE)))
offset
entries)
@ -504,42 +509,42 @@
dview (mem/get-data-view)]
(reduce-kv (fn [offset _ cell]
;; row: [u8; 4],
(mem/write-i32 dview (+ offset 0) (get cell :row))
;; row_span: [u8; 4],
(mem/write-i32 dview (+ offset 4) (get cell :row-span))
;; column: [u8; 4],
(mem/write-i32 dview (+ offset 8) (get cell :column))
;; column_span: [u8; 4],
(mem/write-i32 dview (+ offset 12) (get cell :column-span))
;; has_align_self: u8,
(mem/write-bool dview (+ offset 16) (some? (get cell :align-self)))
;; align_self: u8,
(mem/write-u8 dview (+ offset 17) (get cell :align-self))
;; has_justify_self: u8,
(mem/write-bool dview (+ offset 18) (get cell :justify-self))
;; justify_self: u8,
(mem/write-u8 dview (+ offset 19) (sr/translate-justify-self (get cell :justify-self)))
(let [shape-id (-> (get cell :shapes) first)]
;; has_shape_id: u8,
;; (.set heap (sr/bool->u8 (d/not-empty? (:shapes cell))) (+ current-offset 20))
(mem/write-u8 dview (+ offset 20) (some? shape-id))
(-> offset
;; row: [u8; 4],
(mem/write-i32 dview (get cell :row))
;; shape_id_a: [u8; 4],
;; shape_id_b: [u8; 4],
;; shape_id_c: [u8; 4],
;; shape_id_d: [u8; 4],
(mem/write-uuid dview (+ offset 21) (d/nilv shape-id uuid/zero)))
;; row_span: [u8; 4],
(mem/write-i32 dview (get cell :row-span))
(+ offset GRID-LAYOUT-CELL-U8-SIZE))
;; column: [u8; 4],
(mem/write-i32 dview (get cell :column))
;; column_span: [u8; 4],
(mem/write-i32 dview (get cell :column-span))
;; has_align_self: u8,
(mem/write-bool dview (some? (get cell :align-self)))
;; align_self: u8,
(mem/write-u8 dview (get cell :align-self))
;; has_justify_self: u8,
(mem/write-bool dview (get cell :justify-self))
;; justify_self: u8,
(mem/write-u8 dview (sr/translate-justify-self (get cell :justify-self)))
;; has_shape_id: u8,
;; (.set heap (sr/bool->u8 (d/not-empty? (:shapes cell))) (+ current-offset 20))
(mem/write-u8 dview (some? shape-id))
;; shape_id_a: [u8; 4],
;; shape_id_b: [u8; 4],
;; shape_id_c: [u8; 4],
;; shape_id_d: [u8; 4],
(mem/write-uuid dview (d/nilv shape-id uuid/zero))
(mem/assert-written offset GRID-LAYOUT-CELL-U8-SIZE))))
offset
cells)

View File

@ -67,12 +67,6 @@
[heap offset size]
(.slice ^js heap offset (+ offset size)))
(defn view
"Returns a new typed array on the same ArrayBuffer store and with the
same element types as for this typed array."
[heap offset size]
(.subarray ^js heap offset (+ offset size)))
(defn get-data-view
"Returns a heap wrapped in a DataView for surgical write operations"
[]
@ -80,25 +74,64 @@
(defn write-u8
"Write unsigned int8. Expects a DataView instance"
[target offset value]
(buf/write-u8 target offset value))
[offset target value]
(buf/write-u8 target offset value)
(+ offset 1))
(defn write-f32
"Write float32. Expects a DataView instance"
[target offset value]
(buf/write-f32 target offset value))
[offset target value]
(buf/write-f32 target offset value)
(+ offset 4))
(defn write-i32
"Write int32. Expects a DataView instance"
[target offset value]
(buf/write-i32 target offset value))
[offset target value]
(buf/write-i32 target offset value)
(+ offset 4))
(defn write-u32
"Write int32. Expects a DataView instance"
[offset target value]
(buf/write-i32 target offset value)
(+ offset 4))
(defn write-bool
"Write int32. Expects a DataView instance"
[target offset value]
(buf/write-bool target offset value))
[offset target value]
(buf/write-bool target offset value)
(+ offset 1))
(defn write-uuid
"Write uuid. Expects a DataView instance"
[target offset value]
(buf/write-uuid target offset value))
[offset target value]
(buf/write-uuid target offset value)
(+ offset 16))
(defn write-buffer
[offset target value]
(assert (instance? js/Uint8Array target) "target should be u8 addressable heap")
(let [value (cond
(instance? js/ArrayBuffer value)
(new js/Uint8Array. value)
(instance? js/Uint8Array value)
value
:else
(throw (js/Error. "unexpected type")))]
(.set ^js target value offset)
(+ offset (.-byteLength value))))
(defn assert-written
[final-offset prev-offset expected]
(assert (= expected (- final-offset prev-offset))
(str "expected to be written " expected " but finally writted " (- final-offset prev-offset)))
final-offset)
(defn size
"Get buffer size"
[o]
(.-byteLength ^js o))