rewrite write array functions to take a length parameter
This commit is contained in:
parent
d1f54b1e05
commit
b03635e231
1 changed files with 118 additions and 151 deletions
|
|
@ -658,199 +658,164 @@
|
||||||
(.set segment ^AddressLayout pointer-layout offset value)))
|
(.set segment ^AddressLayout pointer-layout offset value)))
|
||||||
|
|
||||||
(defn write-bytes
|
(defn write-bytes
|
||||||
"Writes a [[byte]] array to the `segment`, at an optional `offset`."
|
"Writes n elements from a [[byte]] array to the `segment`, at an optional `offset`."
|
||||||
{:inline
|
{:inline
|
||||||
(fn write-byte-inline
|
(fn write-byte-inline
|
||||||
([segment value]
|
([segment n value]
|
||||||
`(let [segment# ~segment
|
`(let [n# ~n
|
||||||
value# ~value]
|
segment# ~segment
|
||||||
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfByte byte-layout 0 ^int (alength value#))))
|
value# ~(with-meta value {:tag 'bytes})]
|
||||||
([segment offset value]
|
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfByte byte-layout 0 n#)))
|
||||||
`(let [segment# ~segment
|
([segment n offset value]
|
||||||
|
`(let [n# ~n
|
||||||
|
segment# ~segment
|
||||||
offset# ~offset
|
offset# ~offset
|
||||||
value# ~value]
|
value# ~(with-meta value {:tag 'bytes})]
|
||||||
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfByte byte-layout offset# ^int (alength value#)))))}
|
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfByte byte-layout offset# n#))))}
|
||||||
([^MemorySegment segment ^bytes value]
|
([^MemorySegment segment n ^bytes value]
|
||||||
(MemorySegment/copy value 0 segment ^ValueLayout$OfByte byte-layout 0 (alength value)))
|
(MemorySegment/copy value 0 segment ^ValueLayout$OfByte byte-layout 0 ^int n))
|
||||||
([^MemorySegment segment offset ^bytes value]
|
([^MemorySegment segment n offset ^bytes value]
|
||||||
(MemorySegment/copy value 0 segment ^ValueLayout$OfByte byte-layout ^long offset ^int (alength value))))
|
(MemorySegment/copy value 0 segment ^ValueLayout$OfByte byte-layout ^long offset ^int n)))
|
||||||
|
|
||||||
(defn write-shorts
|
(defn write-shorts
|
||||||
"Writes a [[short]] array to the `segment`, at an optional `offset`.
|
"Writes n elements from a [[short]] array to the `segment`, at an optional `offset`.
|
||||||
|
|
||||||
If `byte-order` is not provided, it defaults to [[native-endian]]."
|
If `byte-order` is not provided, it defaults to [[native-endian]]."
|
||||||
{:inline
|
{:inline
|
||||||
(fn write-shorts-inline
|
(fn write-shorts-inline
|
||||||
([segment value]
|
([segment n value]
|
||||||
`(let [segment# ~segment
|
`(let [n# ~n
|
||||||
value# ~value]
|
segment# ~segment
|
||||||
(MemorySegment/copy value# 0 segment# ^ValueLayout$OfShort short-layout 0 ^int (alength value#))))
|
value# ~(with-meta value {:tag 'shorts})]
|
||||||
([segment offset value]
|
(MemorySegment/copy value# 0 segment# ^ValueLayout$OfShort short-layout 0 n#)))
|
||||||
`(let [segment# ~segment
|
([segment n offset value]
|
||||||
|
`(let [n# ~n
|
||||||
|
segment# ~segment
|
||||||
offset# ~offset
|
offset# ~offset
|
||||||
value# ~value]
|
value# ~(with-meta value {:tag 'shorts})]
|
||||||
(MemorySegment/copy value# 0 segment# ^ValueLayout$OfShort short-layout ^long offset# ^int (alength value#))))
|
(MemorySegment/copy value# 0 segment# ^ValueLayout$OfShort short-layout ^long offset# n#))))}
|
||||||
([segment offset byte-order value]
|
([^MemorySegment segment n ^shorts value]
|
||||||
`(let [segment# ~segment
|
(MemorySegment/copy value 0 segment ^ValueLayout$OfShort short-layout 0 ^int n))
|
||||||
offset# ~offset
|
([^MemorySegment segment n ^long offset ^shorts value]
|
||||||
byte-order# ~byte-order
|
(MemorySegment/copy value 0 segment ^ValueLayout$OfShort short-layout ^long offset ^int n)))
|
||||||
value# ~value]
|
|
||||||
(MemorySegment/copy value# 0 segment# (.withOrder ^ValueLayout$OfShort short-layout ^ByteOrder byte-order#) ^long offset# ^int (alength value#)))))}
|
|
||||||
([^MemorySegment segment ^shorts value]
|
|
||||||
(MemorySegment/copy value 0 segment ^ValueLayout$OfShort short-layout 0 (alength value)))
|
|
||||||
([^MemorySegment segment ^long offset ^shorts value]
|
|
||||||
(MemorySegment/copy value 0 segment ^ValueLayout$OfShort short-layout ^long offset (alength value)))
|
|
||||||
([^MemorySegment segment ^long offset ^ByteOrder byte-order ^shorts value]
|
|
||||||
(MemorySegment/copy value 0 segment (.withOrder ^ValueLayout$OfShort short-layout byte-order) ^long offset (alength value))))
|
|
||||||
|
|
||||||
(defn write-ints
|
(defn write-ints
|
||||||
"Writes a [[int]] array to the `segment`, at an optional `offset`.
|
"Writes n elements from an [[int]] array to the `segment`, at an optional `offset`.
|
||||||
|
|
||||||
If `byte-order` is not provided, it defaults to [[native-endian]]."
|
If `byte-order` is not provided, it defaults to [[native-endian]]."
|
||||||
{:inline
|
{:inline
|
||||||
(fn write-ints-inline
|
(fn write-ints-inline
|
||||||
([segment value]
|
([segment n value]
|
||||||
`(let [segment# ~segment
|
`(let [n# ~n
|
||||||
value# ~value]
|
segment# ~segment
|
||||||
(MemorySegment/copy value# 0 segment# ^ValueLayout$OfInt int-layout 0 ^{:tag 'int} (alength value#))
|
value# ~(with-meta value {:tag 'shorts})]
|
||||||
))
|
(MemorySegment/copy value# 0 segment# ^ValueLayout$OfInt int-layout 0 n#)))
|
||||||
([segment offset value]
|
([segment n offset value]
|
||||||
`(let [segment# ~segment
|
`(let [n# ~n
|
||||||
|
segment# ~segment
|
||||||
offset# ~offset
|
offset# ~offset
|
||||||
value# ~value]
|
value# ~(with-meta value {:tag 'shorts})]
|
||||||
(MemorySegment/copy value# 0 segment# ^ValueLayout$OfInt int-layout ^long offset# ^{:tag 'int} (alength value#))
|
(MemorySegment/copy value# 0 segment# ^ValueLayout$OfInt int-layout ^long offset# n#)))
|
||||||
))
|
)}
|
||||||
([segment offset byte-order value]
|
([^MemorySegment segment n ^ints value]
|
||||||
`(let [segment# ~segment
|
(MemorySegment/copy value 0 segment ^ValueLayout$OfInt int-layout 0 ^int n))
|
||||||
offset# ~offset
|
([^MemorySegment segment n ^long offset ^ints value]
|
||||||
byte-order# ~byte-order
|
(MemorySegment/copy value 0 segment ^ValueLayout$OfInt int-layout ^long offset ^int n))
|
||||||
value# ~value]
|
)
|
||||||
(MemorySegment/copy value# 0 segment# (.withOrder ^ValueLayout$OfInt int-layout ^ByteOrder byte-order#) ^long offset# ^{:tag 'int} (alength value#)))))}
|
|
||||||
([^MemorySegment segment ^ints value]
|
|
||||||
(MemorySegment/copy value 0 segment ^ValueLayout$OfInt int-layout 0 (alength value)))
|
|
||||||
([^MemorySegment segment ^long offset ^ints value]
|
|
||||||
(MemorySegment/copy value 0 segment ^ValueLayout$OfInt int-layout ^long offset (alength value)))
|
|
||||||
([^MemorySegment segment ^long offset ^ByteOrder byte-order ^ints value]
|
|
||||||
(MemorySegment/copy value 0 segment (.withOrder ^ValueLayout$OfInt int-layout byte-order) ^long offset (alength value))))
|
|
||||||
|
|
||||||
(defn write-longs
|
(defn write-longs
|
||||||
"Writes a [[long]] array to the `segment`, at an optional `offset`.
|
"Writes n elements from a [[long]] array to the `segment`, at an optional `offset`.
|
||||||
|
|
||||||
If `byte-order` is not provided, it defaults to [[native-endian]]."
|
If `byte-order` is not provided, it defaults to [[native-endian]]."
|
||||||
{:inline
|
{:inline
|
||||||
(fn write-longs-inline
|
(fn write-longs-inline
|
||||||
([segment value]
|
([segment n value]
|
||||||
`(let [segment# ~segment
|
`(let [n# ~n
|
||||||
value# ~value]
|
segment# ~segment
|
||||||
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfLong long-layout 0 ^{:tag 'int} (alength value#))
|
value# ~(with-meta value {:tag 'longs})]
|
||||||
|
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfLong long-layout 0 n#)
|
||||||
))
|
))
|
||||||
([segment offset value]
|
([segment n offset value]
|
||||||
`(let [segment# ~segment
|
`(let [n# ~n
|
||||||
|
segment# ~segment
|
||||||
offset# ~offset
|
offset# ~offset
|
||||||
value# ~value]
|
value# ~(with-meta value {:tag 'longs})]
|
||||||
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfLong long-layout ^long offset# ^{:tag 'int} (alength value#))
|
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfLong long-layout ^long offset# n#)
|
||||||
))
|
))
|
||||||
([segment offset byte-order value]
|
)}
|
||||||
`(let [segment# ~segment
|
([^MemorySegment segment n ^longs value]
|
||||||
offset# ~offset
|
(MemorySegment/copy value 0 segment ^ValueLayout$OfLong long-layout 0 ^int n))
|
||||||
byte-order# ~byte-order
|
([^MemorySegment segment n ^long offset ^longs value]
|
||||||
value# ~value]
|
(MemorySegment/copy value 0 segment ^ValueLayout$OfLong long-layout ^long offset ^int n))
|
||||||
(MemorySegment/copy value# 0 ^MemorySegment segment# (.withOrder ^ValueLayout$OfLong long-layout ^ByteOrder byte-order#) ^long offset# ^{:tag 'int} (alength value#)))))}
|
)
|
||||||
([^MemorySegment segment ^longs value]
|
|
||||||
(MemorySegment/copy value 0 segment ^ValueLayout$OfLong long-layout 0 ^int (alength value)))
|
|
||||||
([^MemorySegment segment ^long offset ^longs value]
|
|
||||||
(MemorySegment/copy value 0 segment ^ValueLayout$OfLong long-layout ^long offset ^int (alength value)))
|
|
||||||
([^MemorySegment segment ^long offset ^ByteOrder byte-order ^longs value]
|
|
||||||
(MemorySegment/copy value 0 segment (.withOrder ^ValueLayout$OfLong long-layout byte-order) ^long offset ^int (alength value))))
|
|
||||||
|
|
||||||
|
|
||||||
(defn write-chars
|
(defn write-chars
|
||||||
"Writes a [[char]] array to the `segment`, at an optional `offset`.
|
"Writes n elements from a [[char]] array to the `segment`, at an optional `offset`.
|
||||||
|
|
||||||
If `byte-order` is not provided, it defaults to [[native-endian]]."
|
If `byte-order` is not provided, it defaults to [[native-endian]]."
|
||||||
{:inline
|
{:inline
|
||||||
(fn write-chars-inline
|
(fn write-chars-inline
|
||||||
([segment value]
|
([segment n value]
|
||||||
`(let [segment# ~segment
|
`(let [n# ~n
|
||||||
value# ~value]
|
segment# ~segment
|
||||||
(MemorySegment/copy (bytes (byte-array (map unchecked-int value#))) 0 segment# ^ValueLayout$OfChar char-layout 0 ^{:tag 'int} (alength value#))))
|
value# ~(with-meta value {:tag 'chars})]
|
||||||
([segment offset value]
|
(MemorySegment/copy (bytes (byte-array (map unchecked-int value#))) 0 segment# ^ValueLayout$OfChar char-layout 0 n#)))
|
||||||
`(let [segment# ~segment
|
([segment n offset value]
|
||||||
|
`(let [n# ~n
|
||||||
|
segment# ~segment
|
||||||
offset# ~offset
|
offset# ~offset
|
||||||
value# ~value]
|
value# ~(with-meta value {:tag 'chars})]
|
||||||
(MemorySegment/copy (bytes (byte-array (map unchecked-int value#))) 0 segment# ^ValueLayout$OfChar char-layout ^long offset# ^{:tag 'int} (alength value#))))
|
(MemorySegment/copy (bytes (byte-array (map unchecked-int value#))) 0 segment# ^ValueLayout$OfChar char-layout ^long offset# n#)))
|
||||||
([segment offset byte-order value]
|
)}
|
||||||
`(let [segment# ~segment
|
([^MemorySegment segment n ^chars value]
|
||||||
offset# ~offset
|
(MemorySegment/copy (bytes (byte-array (map unchecked-int value))) 0 segment ^ValueLayout$OfChar char-layout 0 ^int n))
|
||||||
byte-order# ~byte-order
|
([^MemorySegment segment n ^long offset ^chars value]
|
||||||
value# ~value]
|
(MemorySegment/copy (bytes (byte-array (map unchecked-int value))) 0 segment ^ValueLayout$OfChar char-layout ^long offset ^int n )))
|
||||||
(MemorySegment/copy (bytes (byte-array (map unchecked-int value#))) 0 segment# (.withOrder ^ValueLayout$OfChar char-layout ^ByteOrder byte-order#) ^long offset# ^{:tag 'int} (alength value#)))))}
|
|
||||||
([^MemorySegment segment ^chars value]
|
|
||||||
(MemorySegment/copy (bytes (byte-array (map unchecked-int value))) 0 segment ^ValueLayout$OfChar char-layout 0 (alength value)))
|
|
||||||
([^MemorySegment segment ^long offset ^chars value]
|
|
||||||
(MemorySegment/copy (bytes (byte-array (map unchecked-int value))) 0 segment ^ValueLayout$OfChar char-layout ^long offset (alength value)))
|
|
||||||
([^MemorySegment segment ^long offset ^ByteOrder byte-order ^chars value]
|
|
||||||
(MemorySegment/copy (bytes (byte-array (map unchecked-int value))) 0 segment (.withOrder ^ValueLayout$OfChar char-layout byte-order) ^long offset (alength value))))
|
|
||||||
|
|
||||||
(defn write-floats
|
(defn write-floats
|
||||||
"Writes a [[float]] array to the `segment`, at an optional `offset`.
|
"Writes n elements from a [[float]] array to the `segment`, at an optional `offset`.
|
||||||
|
|
||||||
If `byte-order` is not provided, it defaults to [[native-endian]]."
|
If `byte-order` is not provided, it defaults to [[native-endian]]."
|
||||||
{:inline
|
{:inline
|
||||||
(fn write-floats-inline
|
(fn write-floats-inline
|
||||||
([segment value]
|
([segment n value]
|
||||||
`(let [segment# ~segment
|
`(let [n# ~n
|
||||||
value# ~value]
|
segment# ~segment
|
||||||
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfFloat float-layout 0 ^{:tag 'int} (alength value#))
|
value# ~(with-meta value {:tag 'floats})]
|
||||||
))
|
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfFloat float-layout 0 n#)))
|
||||||
([segment offset value]
|
([segment n offset value]
|
||||||
`(let [segment# ~segment
|
`(let [n# ~n
|
||||||
|
segment# ~segment
|
||||||
offset# ~offset
|
offset# ~offset
|
||||||
value# ~value]
|
value# ~(with-meta value {:tag 'floats})]
|
||||||
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfFloat float-layout ^long offset# ^{:tag 'int} (alength value#))
|
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfFloat float-layout ^long offset# n#))))}
|
||||||
))
|
([^MemorySegment segment n ^floats value]
|
||||||
([segment offset byte-order value]
|
(MemorySegment/copy value 0 segment ^ValueLayout$OfFloat float-layout 0 ^int n))
|
||||||
`(let [segment# ~segment
|
([^MemorySegment segment n ^long offset ^floats value]
|
||||||
offset# ~offset
|
(MemorySegment/copy value 0 segment ^ValueLayout$OfFloat float-layout ^long offset ^int n)))
|
||||||
byte-order# ~byte-order
|
|
||||||
value# ~value]
|
|
||||||
(MemorySegment/copy value# 0 ^MemorySegment segment# (.withOrder ^ValueLayout$OfFloat float-layout ^ByteOrder byte-order#) ^long offset# ^{:tag 'int} (alength value#)))))}
|
|
||||||
([^MemorySegment segment ^floats value]
|
|
||||||
(MemorySegment/copy value 0 segment ^ValueLayout$OfFloat float-layout 0 ^int (alength value)))
|
|
||||||
([^MemorySegment segment ^long offset ^floats value]
|
|
||||||
(MemorySegment/copy value 0 segment ^ValueLayout$OfFloat float-layout ^long offset ^int (alength value)))
|
|
||||||
([^MemorySegment segment ^long offset ^ByteOrder byte-order ^floats value]
|
|
||||||
(MemorySegment/copy value 0 segment (.withOrder ^ValueLayout$OfFloat float-layout byte-order) ^long offset ^int (alength value))))
|
|
||||||
|
|
||||||
(defn write-doubles
|
(defn write-doubles
|
||||||
"Writes a [[double]] array to the `segment`, at an optional `offset`.
|
"Writes n elements from a [[double]] array to the `segment`, at an optional `offset`.
|
||||||
|
|
||||||
If `byte-order` is not provided, it defaults to [[native-endian]]."
|
If `byte-order` is not provided, it defaults to [[native-endian]]."
|
||||||
{:inline
|
{:inline
|
||||||
(fn write-doubles-inline
|
(fn write-doubles-inline
|
||||||
([segment value]
|
([segment n value]
|
||||||
`(let [segment# ~segment
|
`(let [n# ~n
|
||||||
value# ~value]
|
segment# ~segment
|
||||||
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfDouble double-layout 0 ^{:tag 'int} (alength value#))
|
value# ~(with-meta value {:tag 'doubles})]
|
||||||
))
|
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfDouble double-layout 0 n#)))
|
||||||
([segment offset value]
|
([segment n offset value]
|
||||||
`(let [segment# ~segment
|
`(let [n# ~n
|
||||||
|
segment# ~segment
|
||||||
offset# ~offset
|
offset# ~offset
|
||||||
value# ~value]
|
value# ~(with-meta value {:tag 'doubles})]
|
||||||
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfDouble double-layout ^long offset# ^{:tag 'int} (alength value#))
|
(MemorySegment/copy value# 0 ^MemorySegment segment# ^ValueLayout$OfDouble double-layout ^long offset# n#))))}
|
||||||
))
|
([^MemorySegment segment n ^doubles value]
|
||||||
([segment offset byte-order value]
|
(MemorySegment/copy value 0 segment ^ValueLayout$OfDouble double-layout 0 ^int n))
|
||||||
`(let [segment# ~segment
|
([^MemorySegment segment n ^long offset ^doubles value]
|
||||||
offset# ~offset
|
(MemorySegment/copy value 0 segment ^ValueLayout$OfDouble double-layout ^long offset ^int n)))
|
||||||
byte-order# ~byte-order
|
|
||||||
value# ~value]
|
|
||||||
(MemorySegment/copy value# 0 ^MemorySegment segment# (.withOrder ^ValueLayout$OfDouble double-layout ^ByteOrder byte-order#) ^long offset# ^{:tag 'int} (alength value#)))))}
|
|
||||||
([^MemorySegment segment ^doubles value]
|
|
||||||
(MemorySegment/copy value 0 segment ^ValueLayout$OfDouble double-layout 0 ^int (alength value)))
|
|
||||||
([^MemorySegment segment ^long offset ^doubles value]
|
|
||||||
(MemorySegment/copy value 0 segment ^ValueLayout$OfDouble double-layout ^long offset ^int (alength value)))
|
|
||||||
([^MemorySegment segment ^long offset ^ByteOrder byte-order ^doubles value]
|
|
||||||
(MemorySegment/copy value 0 segment (.withOrder ^ValueLayout$OfDouble double-layout byte-order) ^long offset ^int (alength value))))
|
|
||||||
|
|
||||||
(defn- type-dispatch
|
(defn- type-dispatch
|
||||||
"Gets a type dispatch value from a (potentially composite) type."
|
"Gets a type dispatch value from a (potentially composite) type."
|
||||||
|
|
@ -1665,12 +1630,14 @@
|
||||||
|
|
||||||
(defmethod generate-serialize :coffi.mem/array [[_arr member-type length & {:keys [raw?]}] source-form offset segment-source-form]
|
(defmethod generate-serialize :coffi.mem/array [[_arr member-type length & {:keys [raw?]}] source-form offset segment-source-form]
|
||||||
(if (and raw? (coffitype->array-write-fn member-type))
|
(if (and raw? (coffitype->array-write-fn member-type))
|
||||||
(list (coffitype->array-write-fn member-type) segment-source-form offset source-form)
|
(list (coffitype->array-write-fn member-type) segment-source-form length offset source-form)
|
||||||
(let [obj (gensym 'src-array)]
|
(if (coffitype->array-write-fn member-type)
|
||||||
(concat
|
(list (coffitype->array-write-fn member-type) segment-source-form length offset (list (coffitype->array-fn member-type) length source-form))
|
||||||
(list `let [obj source-form])
|
(let [obj (gensym 'src-array)]
|
||||||
(map #(generate-serialize member-type (list (if raw? `aget `nth) obj %) (+ offset (* (size-of member-type) %)) segment-source-form)
|
(concat
|
||||||
(range length))))))
|
(list `let [obj source-form])
|
||||||
|
(map #(generate-serialize member-type (list (if raw? `aget `nth) obj %) (+ offset (* (size-of member-type) %)) segment-source-form)
|
||||||
|
(range length)))))))
|
||||||
|
|
||||||
(defn register-new-struct-serialization [typename [_struct fields]]
|
(defn register-new-struct-serialization [typename [_struct fields]]
|
||||||
(let [typelist (typelist typename fields)
|
(let [typelist (typelist typename fields)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue