From c5d18e9e505f3e630505939ec73fdf1e60a4ea30 Mon Sep 17 00:00:00 2001 From: Kristin Rutenkolk Date: Fri, 11 Oct 2024 16:55:03 +0200 Subject: [PATCH] add generate-serialize multimethod --- src/clj/coffi/mem.clj | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/clj/coffi/mem.clj b/src/clj/coffi/mem.clj index b270698..1d8a1de 100644 --- a/src/clj/coffi/mem.clj +++ b/src/clj/coffi/mem.clj @@ -1658,6 +1658,28 @@ (cons (symbol (str (name typename) "."))) )))) + +(defmulti generate-serialize (fn [& xs] (if (vector? (first xs)) (first (first xs)) (first xs)))) + +(defmethod generate-serialize :coffi.mem/byte [_type source-form offset] `(write-byte ~'segment ~offset ~source-form)) +(defmethod generate-serialize :coffi.mem/short [_type source-form offset] `(write-short ~'segment ~offset ~source-form)) +(defmethod generate-serialize :coffi.mem/int [_type source-form offset] `(write-int ~'segment ~offset ~source-form)) +(defmethod generate-serialize :coffi.mem/long [_type source-form offset] `(write-long ~'segment ~offset ~source-form)) +(defmethod generate-serialize :coffi.mem/char [_type source-form offset] `(write-char ~'segment ~offset ~source-form)) +(defmethod generate-serialize :coffi.mem/float [_type source-form offset] `(write-float ~'segment ~offset ~source-form)) +(defmethod generate-serialize :coffi.mem/double [_type source-form offset] `(write-double ~'segment ~offset ~source-form)) +(defmethod generate-serialize :coffi.mem/pointer [_type source-form offset] `(write-pointer ~'segment ~offset ~source-form)) + +(defmethod generate-serialize :coffi.mem/array [[_arr member-type length] source-form offset] + (concat + (list `let ['array-obj source-form]) + (map + (fn [index] + (generate-serialize member-type + (list `aget 'array-obj index) + (+ offset (* (size-of member-type) index)))) + (range length)))) + (defmacro defstruct "Defines a struct type. all members need a type hint.