From 5c560e684db43ad6837f654b95c2da2b8e5708d3 Mon Sep 17 00:00:00 2001 From: Joshua Suskalo Date: Tue, 18 Jan 2022 15:39:49 -0600 Subject: [PATCH] Add convenience functions for reading and writing addresses --- src/clj/coffi/mem.clj | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/clj/coffi/mem.clj b/src/clj/coffi/mem.clj index 868d41a..53166d9 100644 --- a/src/clj/coffi/mem.clj +++ b/src/clj/coffi/mem.clj @@ -385,6 +385,19 @@ (^double [^MemorySegment segment ^long offset ^ByteOrder byte-order] (MemoryAccess/getDoubleAtOffset segment offset byte-order))) +(defn read-address + "Reads a [[MemoryAddress]] from the `segment`, at an optional `offset`." + {:inline + (fn read-address-inline + ([segment] + `(MemoryAccess/getAddress ~segment)) + ([segment offset] + `(MemoryAccess/getAddressAtOffset ~segment ~offset)))} + (^MemoryAddress [^MemorySegment segment] + (MemoryAccess/getAddress segment)) + (^MemoryAddress [^MemorySegment segment ^long offset] + (MemoryAccess/getAddressAtOffset segment offset))) + (defn write-byte "Writes a [[byte]] to the `segment`, at an optional `offset`." {:inline @@ -511,6 +524,19 @@ (^double [^MemorySegment segment ^long offset ^ByteOrder byte-order ^double value] (MemoryAccess/setDoubleAtOffset segment offset byte-order value))) +(defn write-address + "Writes a [[MemoryAddress]] to the `segment`, at an optional `offset`." + {:inline + (fn write-address-inline + ([segment value] + `(MemoryAccess/setAddress ~segment ~value)) + ([segment offset value] + `(MemoryAccess/setAddressAtOffset ~segment ~offset ~value)))} + (^MemoryAddress [^MemorySegment segment ^MemoryAddress value] + (MemoryAccess/setAddress segment value)) + (^MemoryAddress [^MemorySegment segment ^long offset ^MemoryAddress value] + (MemoryAccess/setAddressAtOffset segment offset value))) + (defn- type-dispatch "Gets a type dispatch value from a (potentially composite) type." [type]