<p>Other build tools should provide similar functionality if you check their documentation.</p>
<p>When creating an executable jar file, you can avoid the need to pass this argument by adding the manifest attribute <code>Enable-Native-Access: ALL-UNNAMED</code> to your jar.</p>
<p>There are two major components to coffi and interacting with native code: manipulating off-heap memory, and loading native code for use with Clojure.</p>
<p>In the simplest cases, the native functions you call will work exclusively with built-in types, for example the function <code>strlen</code> from libc.</p>
<pre><codeclass="language-clojure">(require '[coffi.mem :as mem :refer [defalias]])
<p>This will load libz from the lib subdirectory of the current working directory. As you can see this requires the entire filename, including platform-specific file extensions.</p>
<p>If a library is attempted to be loaded but doesn’t exist or otherwise can’t be loaded, an exception is thrown. This can be convenient as any namespace with a <code>load-library</code> call at the top level cannot be required without the library being able to be loaded.</p>
<p>Each of these types maps to their C counterpart. Values of any of these primitive types except for <code>pointer</code> will be cast with their corresponding Clojure function when they are passed as arguments to native functions. Additionally, the <code>c-string</code> type is defined, although it is not primitive.</p>
<p>In addition, some composite types are also defined in coffi, including struct and union types (unions will be discussed with serialization and deserialization). For an example C struct and function:</p>
<pre><codeclass="language-c">typedef struct point {
float x;
@ -117,14 +117,14 @@ Point zero(void) {
<p>Arrays are also supported via a type argument. Keep in mind that they are the array itself, and not a pointer to the array like you might see in certain cases in C.</p>
<p>Be aware though that if an exception is thrown out of a callback that is called from C, the JVM will crash. The resulting crash log should include the exception type and message in the registers section, but it’s important to be aware of all the same. Ideally you should test your callbacks before actually passing them to native code.</p>
<p>When writing a wrapper library for a C library, it may be a good choice to wrap all passed Clojure functions in an additional function which catches all throwables, potentially notifies the user in some manner (e.g. logging), and returns a default value. This is on the wrapper library’s developer to decide when and where this is appropriate, as in some cases no reasonable default return value can be determined and it is most sensible to simply crash the JVM. This is the reason that coffi defaults to this behavior, as in the author’s opinion it is better to fail hard and fast rather than to attempt to produce a default and cause unexpected behavior later.</p>
<p>Another important thing to keep in mind is the expected lifetime of the function that you pass to native code. For example it is perfectly fine to pass an anonymous function to a native function if the callback will never be called again once the native function returns. If however it saves the callback for later use the JVM may collect it prematurely, causing a crash when the callback is later called by native code.</p>
<p>Some native functions can take any number of arguments, and in these cases coffi provides <code>vacfn-factory</code> (for “varargs C function factory”).</p>
<p>At the moment there is no equivalent to <code>defcfn</code> for varargs functions.</p>
<p>Some native functions that are variadic use the type <code>va_list</code> to make it easier for other languages to call them in their FFI. At the time of writing, coffi does not support va-list, however it is a planned feature.</p>
<p>Some libraries include global variables or constants accessible through symbols. To start with, constant values stored in symbols can be fetched with <code>const</code>, or the parallel macro <code>defconst</code></p>
<p>Be aware however that there is no synchronization on these types. The value being read is not read atomically, so you may see an inconsistent state if the value is being mutated on another thread.</p>
<p>A parallel function <code>fswap!</code> is also provided, but it does not provide any atomic semantics either.</p>
<p>The memory that backs the static variable can be fetched with the function <code>static-variable-segment</code>, which can be used to pass a pointer to the static variable to native functions that require it.</p>
<p>Some functions require more complex code to map nicely to a Clojure function. The <code>defcfn</code> macro provides facilities to wrap the native function with some Clojure code to make this easier.</p>
<p>Unions in coffi are rather limited. They can be serialized, but not deserialized without external information.</p>
<pre><codeclass="language-clojure">[::mem/union
#{::mem/float ::mem/double}
@ -26,5 +26,5 @@
</code></pre>
<p>This union however would not include the tag when serialized.</p>
<p>If a union is deserialized, then all that coffi does is to allocate a new segment of the appropriate size with an implicit arena so that it may later be garbage collected, and copies the data from the source segment into it. It’s up to the user to call <code>deserialize-from</code> on that segment with the appropriate type.</p>
<p>Custom types with serializers and deserializers may be created. This is done using two sets of three multimethods which can be extended by the user. For any given type, only one set need be implemented.</p>
<p>Two examples of custom types are given here, one is a 3d vector, and the other an example of a tagged union.</p>
<p>For the vector type, it will serialize to a pointer to an array of three floats.</p>
<p>The multimethod <code>primitive-type</code> returns the primitive type that a given type serializes to. For this example, it should be a pointer.</p>
<h3><ahref="#tagged-union-tagged-union" id="tagged-union-tagged-union"></a>Tagged Union {#tagged-union}</h3>
<p>For the tagged union type, we will represent the value as a vector of a keyword naming the tag and the value. The type itself will need to take arguments, similar to <code>struct</code>. For example, if we were to represent a result type like in Rust, we might have the following values:</p>
<p>Some native libraries work with handles to large amounts of data at once, making it undesirable to marshal data back and forth from Clojure, both because it’s not necessary to work with the data in Clojure directly, or also because of the high (de)serialization costs associated with marshaling. In cases like these, unwrapped native handles are desirable.</p>
<p>The functions <code>make-downcall</code> and <code>make-varargs-factory</code> are also provided to create raw function handles.</p>
<p>Clojure functions serialized to this type will have their arguments and return value exactly match the types specified and will not perform any serialization or deserialization at their boundaries.</p>
<p>One important caveat to consider when writing wrappers for performance-sensitive functions is that the convenience macro <code>defcfn</code> that coffi provides will already perform no serialization or deserialization on primitive arguments and return types, so for functions with only primitive argument and return types there is no performance reason to choose unwrapped native handles over the convenience macro.</p>
<p>Coffi uses multimethods to dispatch to (de)serialization functions to enable code that’s generic over the types it operates on. However, in cases where you know the exact types that you will be (de)serializing and the multimethod dispatch overhead is too high a cost, it may be appropriate to manually handle (de)serializing data. This will often be done paired with <ahref="#unwrapped-native-handles">Unwrapped Native Handles</a>.</p>
<p>Convenience functions are provided to both read and write all primitive types and addresses, including byte order.</p>
<p>As an example, when wrapping a function that returns an array of big-endian floats, the following code might be used.</p>
<p>An additional consideration when thinking about alternatives is the performance of each available option. It’s an established fact that JNA (used by all three alternative libraries on JDK <16) introduces more overhead when calling native code than JNI does.</p>
<p>In order to provide a benchmark to see how much of a difference the different native interfaces make, we can use <ahref="https://github.com/hugoduncan/criterium">criterium</a> to benchmark each. <ahref="https://www.glfw.org">GLFW</a>’s <ahref="https://www.glfw.org/docs/latest/group__input.html#gaa6cf4e7a77158a3b8fd00328b1720a4a"><code>glfwGetTime</code></a> function will be used for the test as it performs a simple operation, and is conveniently already wrapped in JNI by the excellent <ahref="https://www.lwjgl.org/">LWJGL</a> library.</p>
<p>The following benchmarks were run on a Lenovo Thinkpad with an Intel i7-10610U running Manjaro Linux, using Clojure 1.10.3 on Java 17.</p>
<p>The baseline for performance is the JNI. Using LWJGL it’s relatively simple to benchmark. The following Clojure CLI command will start a repl with LWJGL and criterium loaded.</p>
<p>Clojure-JNA uses the JNA library, which was designed to provide Java with an easy way to access native libraries, but which is known for not having the greatest performance. Since this is an older project, I’m also including the clojure dependency to ensure the correct version is used.</p>
<p>This is much better, but is still about 3x slower than JNI, meaning the overhead from using JNA is still bigger than the function runtime.</p>
<p>This performance penalty is still small in the scope of longer-running functions, and so may not be a concern for your application, but it is something to be aware of.</p>
<p>The tech.jna library is similar in scope to Clojure-JNA, however was written to fit into an ecosystem of libraries meant for array-based programming for machine learning and data science.</p>
<p>This version is even slower than Clojure-JNA. I’m unsure where this overhead is coming from, but I’ll admit that I haven’t looked at their implementations very closely.</p>
<p>The library dtype-next replaced tech.jna in the toolkit of the group working on machine learning and array-based programming, and it includes support for composite data types including structs, as well as primitive functions and callbacks.</p>
<p>In addition, dtype-next has two different ffi backends. First is JNA, which is usable on any JDK version, and is what we’ll use for the first benchmark. Second is the Java 16 version of Project Panama, which will be shown next.</p>
<p>In order to use the dtype-next ffi with the JNA backend, the JNA library has to be included in the dependencies.</p>
</div></div><divclass="public anchor"id="var-cfn"><h3>cfn</h3><divclass="usage"><code>(cfn symbol args ret)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a Clojure function to call the native function referenced by <code>symbol</code>.</p>
<p>The function returned will serialize any passed arguments into the <code>args</code> types, and deserialize the return to the <code>ret</code> type.</p>
<p>If your <code>args</code> and <code>ret</code> are constants, then it is more efficient to call <ahref="coffi.ffi.html#var-make-downcall">make-downcall</a> followed by <ahref="coffi.ffi.html#var-make-serde-wrapper">make-serde-wrapper</a> because the latter has an inline definition which will result in less overhead from serdes.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L438">view source</a></div></div><divclass="public anchor"id="var-const"><h3>const</h3><divclass="usage"><code>(const symbol-or-addr type)</code></div><divclass="doc"><divclass="markdown"><p>Gets the value of a constant stored in <code>symbol-or-addr</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L606">view source</a></div></div><divclass="public anchor"id="var-defcfn"><h3>defcfn</h3><h4class="type">macro</h4><divclass="usage"><code>(defcfn name docstring? attr-map? symbol arg-types ret-type)</code><code>(defcfn name docstring? attr-map? symbol arg-types ret-type native-fn & fn-tail)</code></div><divclass="doc"><divclass="markdown"><p>Defines a Clojure function which maps to a native function.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L438">view source</a></div></div><divclass="public anchor"id="var-const"><h3>const</h3><divclass="usage"><code>(const symbol-or-addr type)</code></div><divclass="doc"><divclass="markdown"><p>Gets the value of a constant stored in <code>symbol-or-addr</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L606">view source</a></div></div><divclass="public anchor"id="var-defcfn"><h3>defcfn</h3><h4class="type">macro</h4><divclass="usage"><code>(defcfn name docstring? attr-map? symbol arg-types ret-type)</code><code>(defcfn name docstring? attr-map? symbol arg-types ret-type native-fn & fn-tail)</code></div><divclass="doc"><divclass="markdown"><p>Defines a Clojure function which maps to a native function.</p>
<p><code>name</code> is the symbol naming the resulting var. <code>symbol</code> is a symbol or string naming the library symbol to link against. <code>arg-types</code> is a vector of qualified keywords representing the argument types. <code>ret-type</code> is a single qualified keyword representing the return type. <code>fn-tail</code> is the body of the function (potentially with multiple arities) which wraps the native one. Inside the function, <code>native-fn</code> is bound to a function that will serialize its arguments, call the native function, and deserialize its return type. If any body is present, you must call this function in order to call the native code.</p>
<p>If no <code>fn-tail</code> is provided, then the resulting function will simply serialize the arguments according to <code>arg-types</code>, call the native function, and deserialize the return value.</p>
<p>The number of args in the <code>fn-tail</code> need not match the number of <code>arg-types</code> for the native function. It need only call the native wrapper function with the correct arguments.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L780">view source</a></div></div><divclass="public anchor"id="var-defconst"><h3>defconst</h3><h4class="type">macro</h4><divclass="usage"><code>(defconst symbol docstring? symbol-or-addr type)</code></div><divclass="doc"><divclass="markdown"><p>Defines a var named by <code>symbol</code> to be the value of the given <code>type</code> from <code>symbol-or-addr</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L617">view source</a></div></div><divclass="public anchor"id="var-defvar"><h3>defvar</h3><h4class="type">macro</h4><divclass="usage"><code>(defvar symbol docstring? symbol-or-addr type)</code></div><divclass="doc"><divclass="markdown"><p>Defines a var named by <code>symbol</code> to be a reference to the native memory from <code>symbol-or-addr</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L683">view source</a></div></div><divclass="public anchor"id="var-ensure-symbol"><h3>ensure-symbol</h3><divclass="usage"><code>(ensure-symbol symbol-or-addr)</code></div><divclass="doc"><divclass="markdown"><p>Returns the argument if it is a <ahref="null">MemorySegment</a>, otherwise calls <ahref="coffi.ffi.html#var-find-symbol">find-symbol</a> on it.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L198">view source</a></div></div><divclass="public anchor"id="var-find-symbol"><h3>find-symbol</h3><divclass="usage"><code>(find-symbol sym)</code></div><divclass="doc"><divclass="markdown"><p>Gets the <ahref="null">MemorySegment</a> of a symbol from the loaded libraries.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L38">view source</a></div></div><divclass="public anchor"id="var-freset.21"><h3>freset!</h3><divclass="usage"><code>(freset! static-var newval)</code></div><divclass="doc"><divclass="markdown"><p>Sets the value of <code>static-var</code> to <code>newval</code>, running it through <ahref="coffi.mem.html#var-serialize">serialize</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L647">view source</a></div></div><divclass="public anchor"id="var-fswap.21"><h3>fswap!</h3><divclass="usage"><code>(fswap! static-var f & args)</code></div><divclass="doc"><divclass="markdown"><p>Non-atomically runs the function <code>f</code> over the value stored in <code>static-var</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L780">view source</a></div></div><divclass="public anchor"id="var-defconst"><h3>defconst</h3><h4class="type">macro</h4><divclass="usage"><code>(defconst symbol docstring? symbol-or-addr type)</code></div><divclass="doc"><divclass="markdown"><p>Defines a var named by <code>symbol</code> to be the value of the given <code>type</code> from <code>symbol-or-addr</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L617">view source</a></div></div><divclass="public anchor"id="var-defvar"><h3>defvar</h3><h4class="type">macro</h4><divclass="usage"><code>(defvar symbol docstring? symbol-or-addr type)</code></div><divclass="doc"><divclass="markdown"><p>Defines a var named by <code>symbol</code> to be a reference to the native memory from <code>symbol-or-addr</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L683">view source</a></div></div><divclass="public anchor"id="var-ensure-symbol"><h3>ensure-symbol</h3><divclass="usage"><code>(ensure-symbol symbol-or-addr)</code></div><divclass="doc"><divclass="markdown"><p>Returns the argument if it is a <ahref="null">MemorySegment</a>, otherwise calls <ahref="coffi.ffi.html#var-find-symbol">find-symbol</a> on it.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L198">view source</a></div></div><divclass="public anchor"id="var-find-symbol"><h3>find-symbol</h3><divclass="usage"><code>(find-symbol sym)</code></div><divclass="doc"><divclass="markdown"><p>Gets the <ahref="null">MemorySegment</a> of a symbol from the loaded libraries.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L38">view source</a></div></div><divclass="public anchor"id="var-freset.21"><h3>freset!</h3><divclass="usage"><code>(freset! static-var newval)</code></div><divclass="doc"><divclass="markdown"><p>Sets the value of <code>static-var</code> to <code>newval</code>, running it through <ahref="coffi.mem.html#var-serialize">serialize</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L647">view source</a></div></div><divclass="public anchor"id="var-fswap.21"><h3>fswap!</h3><divclass="usage"><code>(fswap! static-var f & args)</code></div><divclass="doc"><divclass="markdown"><p>Non-atomically runs the function <code>f</code> over the value stored in <code>static-var</code>.</p>
<p>The value is deserialized before passing it to <code>f</code>, and serialized before putting the value into <code>static-var</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L656">view source</a></div></div><divclass="public anchor"id="var-load-library"><h3>load-library</h3><divclass="usage"><code>(load-library path)</code></div><divclass="doc"><divclass="markdown"><p>Loads the library at <code>path</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L33">view source</a></div></div><divclass="public anchor"id="var-load-system-library"><h3>load-system-library</h3><divclass="usage"><code>(load-system-library libname)</code></div><divclass="doc"><divclass="markdown"><p>Loads the library named <code>libname</code> from the system’s load path.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L28">view source</a></div></div><divclass="public anchor"id="var-make-downcall"><h3>make-downcall</h3><divclass="usage"><code>(make-downcall symbol-or-addr args ret)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a downcall function reference to <code>symbol-or-addr</code> with the given <code>args</code> and <code>ret</code> types.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L656">view source</a></div></div><divclass="public anchor"id="var-load-library"><h3>load-library</h3><divclass="usage"><code>(load-library path)</code></div><divclass="doc"><divclass="markdown"><p>Loads the library at <code>path</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L33">view source</a></div></div><divclass="public anchor"id="var-load-system-library"><h3>load-system-library</h3><divclass="usage"><code>(load-system-library libname)</code></div><divclass="doc"><divclass="markdown"><p>Loads the library named <code>libname</code> from the system’s load path.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L28">view source</a></div></div><divclass="public anchor"id="var-make-downcall"><h3>make-downcall</h3><divclass="usage"><code>(make-downcall symbol-or-addr args ret)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a downcall function reference to <code>symbol-or-addr</code> with the given <code>args</code> and <code>ret</code> types.</p>
<p>The function returned takes only arguments whose types match exactly the <ahref="coffi.mem.html#var-java-layout">java-layout</a> for that type, and returns an argument with exactly the <ahref="coffi.mem.html#var-java-layout">java-layout</a> of the <code>ret</code> type. This function will perform no serialization or deserialization of arguments or the return type.</p>
<p>If the <code>ret</code> type is non-primitive, then the returned function will take a first argument of a <ahref="null">SegmentAllocator</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L206">view source</a></div></div><divclass="public anchor"id="var-make-serde-varargs-wrapper"><h3>make-serde-varargs-wrapper</h3><divclass="usage"><code>(make-serde-varargs-wrapper varargs-factory required-args ret-type)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a wrapper function for the <code>varargs-factory</code> which produces functions that serialize the arguments and deserialize the return value.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L426">view source</a></div></div><divclass="public anchor"id="var-make-serde-wrapper"><h3>make-serde-wrapper</h3><divclass="usage"><code>(make-serde-wrapper downcall arg-types ret-type)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a wrapper function for the <code>downcall</code> which serializes the arguments and deserializes the return value.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L407">view source</a></div></div><divclass="public anchor"id="var-make-varargs-factory"><h3>make-varargs-factory</h3><divclass="usage"><code>(make-varargs-factory symbol required-args ret)</code></div><divclass="doc"><divclass="markdown"><p>Returns a function for constructing downcalls with additional types for arguments.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L206">view source</a></div></div><divclass="public anchor"id="var-make-serde-varargs-wrapper"><h3>make-serde-varargs-wrapper</h3><divclass="usage"><code>(make-serde-varargs-wrapper varargs-factory required-args ret-type)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a wrapper function for the <code>varargs-factory</code> which produces functions that serialize the arguments and deserialize the return value.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L426">view source</a></div></div><divclass="public anchor"id="var-make-serde-wrapper"><h3>make-serde-wrapper</h3><divclass="usage"><code>(make-serde-wrapper downcall arg-types ret-type)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a wrapper function for the <code>downcall</code> which serializes the arguments and deserializes the return value.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L407">view source</a></div></div><divclass="public anchor"id="var-make-varargs-factory"><h3>make-varargs-factory</h3><divclass="usage"><code>(make-varargs-factory symbol required-args ret)</code></div><divclass="doc"><divclass="markdown"><p>Returns a function for constructing downcalls with additional types for arguments.</p>
<p>The <code>required-args</code> are the types of the first arguments passed to the downcall handle, and the values passed to the returned function are only the varargs types.</p>
<p>The returned function is memoized, so that only one downcall function will be generated per combination of argument types.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L222">view source</a></div></div><divclass="public anchor"id="var-reify-libspec"><h3>reify-libspec</h3><divclass="usage"><code>(reify-libspec libspec)</code></div><divclass="doc"><divclass="markdown"><p>Loads all the symbols specified in the <code>libspec</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L222">view source</a></div></div><divclass="public anchor"id="var-reify-libspec"><h3>reify-libspec</h3><divclass="usage"><code>(reify-libspec libspec)</code></div><divclass="doc"><divclass="markdown"><p>Loads all the symbols specified in the <code>libspec</code>.</p>
<p>The value of each key of the passed map is transformed as by <ahref="coffi.ffi.html#var-reify-symbolspec">reify-symbolspec</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L742">view source</a></div></div><divclass="public anchor"id="var-reify-symbolspec"><h3>reify-symbolspec</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Takes a spec for a symbol reference and returns a live value for that type.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L701">view source</a></div></div><divclass="public anchor"id="var-static-variable"><h3>static-variable</h3><divclass="usage"><code>(static-variable symbol-or-addr type)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a reference to a mutable value stored in <code>symbol-or-addr</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L742">view source</a></div></div><divclass="public anchor"id="var-reify-symbolspec"><h3>reify-symbolspec</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Takes a spec for a symbol reference and returns a live value for that type.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L701">view source</a></div></div><divclass="public anchor"id="var-static-variable"><h3>static-variable</h3><divclass="usage"><code>(static-variable symbol-or-addr type)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a reference to a mutable value stored in <code>symbol-or-addr</code>.</p>
<p>The returned value can be dereferenced, and has metadata.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L672">view source</a></div></div><divclass="public anchor"id="var-static-variable-segment"><h3>static-variable-segment</h3><divclass="usage"><code>(static-variable-segment static-var)</code></div><divclass="doc"><divclass="markdown"><p>Gets the backing <ahref="null">MemorySegment</a> from <code>static-var</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L672">view source</a></div></div><divclass="public anchor"id="var-static-variable-segment"><h3>static-variable-segment</h3><divclass="usage"><code>(static-variable-segment static-var)</code></div><divclass="doc"><divclass="markdown"><p>Gets the backing <ahref="null">MemorySegment</a> from <code>static-var</code>.</p>
<p>This is primarily useful when you need to pass the static variable’s address to a native function which takes an <ahref="null">Addressable</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/ffi.clj#L664">view source</a></div></div><divclass="public anchor"id="var-vacfn-factory"><h3>vacfn-factory</h3><divclass="usage"><code>(vacfn-factory symbol required-args ret)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a varargs factory to call the native function referenced by <code>symbol</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/ffi.clj#L664">view source</a></div></div><divclass="public anchor"id="var-vacfn-factory"><h3>vacfn-factory</h3><divclass="usage"><code>(vacfn-factory symbol required-args ret)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a varargs factory to call the native function referenced by <code>symbol</code>.</p>
<p>The function returned takes any number of type arguments and returns a specialized Clojure function for calling the native function with those arguments.</p>
<html><head><metacharset="UTF-8"/><title>coffi.layout documentation</title><linkrel="stylesheet"type="text/css"href="css/default.css"/><linkrel="stylesheet"type="text/css"href="css/highlight.css"/><scripttype="text/javascript"src="js/highlight.min.js"></script><scripttype="text/javascript"src="js/jquery.min.js"></script><scripttype="text/javascript"src="js/page_effects.js"></script><script>hljs.initHighlightingOnLoad();</script></head><body><divid="header"><h2>Generated by <ahref="https://github.com/weavejester/codox">Codox</a></h2><h1><ahref="index.html"><spanclass="project-title"><spanclass="project-name">coffi</span><spanclass="project-version">v1.0.486</span></span></a></h1></div><divclass="sidebar primary"><h3class="no-link"><spanclass="inner">Project</span></h3><ulclass="index-link"><liclass="depth-1 "><ahref="index.html"><divclass="inner">Index</div></a></li></ul><h3class="no-link"><spanclass="inner">Topics</span></h3><ul><liclass="depth-1 "><ahref="01-Getting-Started.html"><divclass="inner"><span>Getting Started</span></div></a></li><liclass="depth-1 "><ahref="02-Memory-Management.html"><divclass="inner"><span>Memory Management</span></div></a></li><liclass="depth-1 "><ahref="03-Builtin-Types.html"><divclass="inner"><span>Built-in Types **WIP**</span></div></a></li><liclass="depth-1 "><ahref="04-Custom-Types.html"><divclass="inner"><span>Custom Types</span></div></a></li><liclass="depth-1 "><ahref="05-Low-Level-Wrappers.html"><divclass="inner"><span>Low-Level Wrappers</span></div></a></li><liclass="depth-1 "><ahref="50-Data-Model.html"><divclass="inner"><span>Data Model</span></div></a></li><liclass="depth-1 "><ahref="99-Benchmarks.html"><divclass="inner"><span>Benchmarks **OUTDATED**</span></div></a></li></ul><h3class="no-link"><spanclass="inner">Namespaces</span></h3><ul><liclass="depth-1"><divclass="no-link"><divclass="inner"><spanclass="tree"><spanclass="top"></span><spanclass="bottom"></span></span><span>coffi</span></div></div></li><liclass="depth-2 branch"><ahref="coffi.ffi.html"><divclass="inner"><spanclass="tree"><spanclass="top"></span><spanclass="bottom"></span></span><span>ffi</span></div></a></li><liclass="depth-2 branch current"><ahref="coffi.layout.html"><divclass="inner"><spanclass="tree"><spanclass="top"></span><spanclass="bottom"></span></span><span>layout</span></div></a></li><liclass="depth-2"><ahref="coffi.mem.html"><divclass="inner"><spanclass="tree"><spanclass="top"></span><spanclass="bottom"></span></span><span>mem</span></div></a></li></ul></div><divclass="sidebar secondary"><h3><ahref="#top"><spanclass="inner">Public Vars</span></a></h3><ul><liclass="depth-1"><ahref="coffi.layout.html#var-with-c-layout"><divclass="inner"><span>with-c-layout</span></div></a></li></ul></div><divclass="namespace-docs"id="content"><h1class="anchor"id="top">coffi.layout</h1><divclass="doc"><divclass="markdown"><p>Functions for adjusting the layout of structs.</p>
</div></div><divclass="public anchor"id="var-with-c-layout"><h3>with-c-layout</h3><divclass="usage"><code>(with-c-layout struct-spec)</code></div><divclass="doc"><divclass="markdown"><p>Forces a struct specification to C layout rules.</p>
<p>This will add padding fields between fields to match C alignment requirements.</p>
<p>If the native representation of the type is a primitive (whether or not other data beyond the primitive is associated with it, as e.g. a pointer), then <ahref="coffi.mem.html#var-primitive-type">primitive-type</a> must be overriden to return which primitive type it is serialized as, then <ahref="coffi.mem.html#var-serialize*">serialize*</a> and <ahref="coffi.mem.html#var-deserialize*">deserialize*</a> should be overriden.</p>
<p>If the native representation of the type is a composite type, like a union, struct, or array, then <ahref="coffi.mem.html#var-c-layout">c-layout</a> must be overriden to return the native layout of the type, and <ahref="coffi.mem.html#var-serialize-into">serialize-into</a> and <ahref="coffi.mem.html#var-deserialize-from">deserialize-from</a> should be overriden to allow marshaling values of the type into and out of memory segments.</p>
</div></div><divclass="public anchor"id="var-address-of"><h3>address-of</h3><divclass="usage"><code>(address-of addressable)</code></div><divclass="doc"><divclass="markdown"><p>Gets the address of a given segment as a number.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L106">view source</a></div></div><divclass="public anchor"id="var-address.3F"><h3>address?</h3><divclass="usage"><code>(address? addr)</code></div><divclass="doc"><divclass="markdown"><p>Checks if an object is a memory address.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L108">view source</a></div></div><divclass="public anchor"id="var-address.3F"><h3>address?</h3><divclass="usage"><code>(address? addr)</code></div><divclass="doc"><divclass="markdown"><p>Checks if an object is a memory address.</p>
<p><code>nil</code> is considered an address.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L124">view source</a></div></div><divclass="public anchor"id="var-align-of"><h3>align-of</h3><divclass="usage"><code>(align-of type)</code></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of the given <code>type</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L126">view source</a></div></div><divclass="public anchor"id="var-align-of"><h3>align-of</h3><divclass="usage"><code>(align-of type)</code></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of the given <code>type</code>.</p>
<p>If an <code>arena</code> is provided, the allocation will be reclaimed when it is closed.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L91">view source</a></div></div><divclass="public anchor"id="var-alloc-instance"><h3>alloc-instance</h3><divclass="usage"><code>(alloc-instance type)</code><code>(alloc-instance type arena)</code></div><divclass="doc"><divclass="markdown"><p>Allocates a memory segment for the given <code>type</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L818">view source</a></div></div><divclass="public anchor"id="var-alloc-with"><h3>alloc-with</h3><divclass="usage"><code>(alloc-with allocator size)</code><code>(alloc-with allocator size alignment)</code></div><divclass="doc"><divclass="markdown"><p>Allocates <code>size</code> bytes using the <code>allocator</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L99">view source</a></div></div><divclass="public anchor"id="var-arena-allocator"><h3>arena-allocator</h3><divclass="usage"><code>(arena-allocator arena)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a <ahref="null">SegmentAllocator</a> from the given <ahref="null">Arena</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L93">view source</a></div></div><divclass="public anchor"id="var-alloc-instance"><h3>alloc-instance</h3><divclass="usage"><code>(alloc-instance type)</code><code>(alloc-instance type arena)</code></div><divclass="doc"><divclass="markdown"><p>Allocates a memory segment for the given <code>type</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L820">view source</a></div></div><divclass="public anchor"id="var-alloc-with"><h3>alloc-with</h3><divclass="usage"><code>(alloc-with allocator size)</code><code>(alloc-with allocator size alignment)</code></div><divclass="doc"><divclass="markdown"><p>Allocates <code>size</code> bytes using the <code>allocator</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L101">view source</a></div></div><divclass="public anchor"id="var-arena-allocator"><h3>arena-allocator</h3><divclass="usage"><code>(arena-allocator arena)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a <ahref="null">SegmentAllocator</a> from the given <ahref="null">Arena</a>.</p>
<p>This is primarily used when working with unwrapped downcall functions. When a downcall function returns a non-primitive type, it must be provided with an allocator.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L80">view source</a></div></div><divclass="public anchor"id="var-as-segment"><h3>as-segment</h3><divclass="usage"><code>(as-segment address)</code><code>(as-segment address size)</code><code>(as-segment address size arena)</code><code>(as-segment address size arena cleanup)</code></div><divclass="doc"><divclass="markdown"><p>Dereferences an <code>address</code> into a memory segment associated with the <code>arena</code> (default global).</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L156">view source</a></div></div><divclass="public anchor"id="var-auto-arena"><h3>auto-arena</h3><divclass="usage"><code>(auto-arena)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a new memory arena that is managed by the garbage collector.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L82">view source</a></div></div><divclass="public anchor"id="var-as-segment"><h3>as-segment</h3><divclass="usage"><code>(as-segment address)</code><code>(as-segment address size)</code><code>(as-segment address size arena)</code><code>(as-segment address size arena cleanup)</code></div><divclass="doc"><divclass="markdown"><p>Dereferences an <code>address</code> into a memory segment associated with the <code>arena</code> (default global).</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L158">view source</a></div></div><divclass="public anchor"id="var-auto-arena"><h3>auto-arena</h3><divclass="usage"><code>(auto-arena)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a new memory arena that is managed by the garbage collector.</p>
<p>The arena may be shared across threads, and all resources created with it will be cleaned up at the same time, when all references have been collected.</p>
<p>This type of arena cannot be closed, and therefore should not be created in a <ahref="null">with-open</a> clause.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L187">view source</a></div></div><divclass="public anchor"id="var-byte-layout"><h3>byte-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a byte in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L205">view source</a></div></div><divclass="public anchor"id="var-c-layout"><h3>c-layout</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Gets the layout object for a given <code>type</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L189">view source</a></div></div><divclass="public anchor"id="var-byte-layout"><h3>byte-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a byte in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L207">view source</a></div></div><divclass="public anchor"id="var-c-layout"><h3>c-layout</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Gets the layout object for a given <code>type</code>.</p>
<p>If a type is primitive it will return the appropriate primitive layout (see <ahref="null">c-prim-layout</a>).</p>
<p>Otherwise, it should return a <ahref="null">GroupLayout</a> for the given type.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L729">view source</a></div></div><divclass="public anchor"id="var-char-layout"><h3>char-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a c-sized char in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L221">view source</a></div></div><divclass="public anchor"id="var-clone-segment"><h3>clone-segment</h3><divclass="usage"><code>(clone-segment segment)</code><code>(clone-segment segment arena)</code></div><divclass="doc"><divclass="markdown"><p>Clones the content of <code>segment</code> into a new segment of the same size.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L174">view source</a></div></div><divclass="public anchor"id="var-confined-arena"><h3>confined-arena</h3><divclass="usage"><code>(confined-arena)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a new arena for use only in this thread.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L731">view source</a></div></div><divclass="public anchor"id="var-char-layout"><h3>char-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a c-sized char in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L223">view source</a></div></div><divclass="public anchor"id="var-clone-segment"><h3>clone-segment</h3><divclass="usage"><code>(clone-segment segment)</code><code>(clone-segment segment arena)</code></div><divclass="doc"><divclass="markdown"><p>Clones the content of <code>segment</code> into a new segment of the same size.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L176">view source</a></div></div><divclass="public anchor"id="var-confined-arena"><h3>confined-arena</h3><divclass="usage"><code>(confined-arena)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a new arena for use only in this thread.</p>
<p>The memory allocated within this arena is cheap to allocate, like a native stack.</p>
<p>The memory allocated within this arena will be cleared once it is closed, so it is usually a good idea to create it in a <ahref="null">with-open</a> clause.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L40">view source</a></div></div><divclass="public anchor"id="var-copy-segment"><h3>copy-segment</h3><divclass="usage"><code>(copy-segment dest src)</code></div><divclass="doc"><divclass="markdown"><p>Copies the content to <code>dest</code> from <code>src</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L42">view source</a></div></div><divclass="public anchor"id="var-copy-segment"><h3>copy-segment</h3><divclass="usage"><code>(copy-segment dest src)</code></div><divclass="doc"><divclass="markdown"><p>Copies the content to <code>dest</code> from <code>src</code>.</p>
<p>Returns <code>dest</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L167">view source</a></div></div><divclass="public anchor"id="var-defalias"><h3>defalias</h3><h4class="type">macro</h4><divclass="usage"><code>(defalias new-type aliased-type)</code></div><divclass="doc"><divclass="markdown"><p>Defines a type alias from <code>new-type</code> to <code>aliased-type</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L169">view source</a></div></div><divclass="public anchor"id="var-defalias"><h3>defalias</h3><h4class="type">macro</h4><divclass="usage"><code>(defalias new-type aliased-type)</code></div><divclass="doc"><divclass="markdown"><p>Defines a type alias from <code>new-type</code> to <code>aliased-type</code>.</p>
<p>This creates needed serialization and deserialization implementations for the aliased type.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L1319">view source</a></div></div><divclass="public anchor"id="var-deserialize"><h3>deserialize</h3><divclass="usage"><code>(deserialize obj type)</code></div><divclass="doc"><divclass="markdown"><p>Deserializes an arbitrary type.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L1326">view source</a></div></div><divclass="public anchor"id="var-deserialize"><h3>deserialize</h3><divclass="usage"><code>(deserialize obj type)</code></div><divclass="doc"><divclass="markdown"><p>Deserializes an arbitrary type.</p>
<p>For types which have a primitive representation, this deserializes the primitive representation. For types which do not, this deserializes out of a segment.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L1092">view source</a></div></div><divclass="public anchor"id="var-deserialize*"><h3>deserialize*</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Deserializes a primitive object into a Clojure data structure.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L1094">view source</a></div></div><divclass="public anchor"id="var-deserialize*"><h3>deserialize*</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Deserializes a primitive object into a Clojure data structure.</p>
<p>This is intended for use with types that are returned as a primitive but which need additional processing before they can be returned.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L1033">view source</a></div></div><divclass="public anchor"id="var-deserialize-from"><h3>deserialize-from</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Deserializes the given segment into a Clojure data structure.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L1035">view source</a></div></div><divclass="public anchor"id="var-deserialize-from"><h3>deserialize-from</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Deserializes the given segment into a Clojure data structure.</p>
<p>For types that serialize to primitives, a default implementation will deserialize the primitive before calling <ahref="coffi.mem.html#var-deserialize*">deserialize*</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L970">view source</a></div></div><divclass="public anchor"id="var-double-alignment"><h3>double-alignment</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of a c-sized double.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L277">view source</a></div></div><divclass="public anchor"id="var-double-layout"><h3>double-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a c-sized double in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L229">view source</a></div></div><divclass="public anchor"id="var-double-size"><h3>double-size</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The size in bytes of a c-sized double.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L253">view source</a></div></div><divclass="public anchor"id="var-float-alignment"><h3>float-alignment</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of a c-sized float.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L273">view source</a></div></div><divclass="public anchor"id="var-float-layout"><h3>float-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a c-sized float in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L225">view source</a></div></div><divclass="public anchor"id="var-float-size"><h3>float-size</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The size in bytes of a c-sized float.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L249">view source</a></div></div><divclass="public anchor"id="var-global-arena"><h3>global-arena</h3><divclass="usage"><code>(global-arena)</code></div><divclass="doc"><divclass="markdown"><p>Constructs the global arena, which will never reclaim its resources.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L972">view source</a></div></div><divclass="public anchor"id="var-double-alignment"><h3>double-alignment</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of a c-sized double.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L279">view source</a></div></div><divclass="public anchor"id="var-double-layout"><h3>double-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a c-sized double in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L231">view source</a></div></div><divclass="public anchor"id="var-double-size"><h3>double-size</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The size in bytes of a c-sized double.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L255">view source</a></div></div><divclass="public anchor"id="var-float-alignment"><h3>float-alignment</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of a c-sized float.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L275">view source</a></div></div><divclass="public anchor"id="var-float-layout"><h3>float-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a c-sized float in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L227">view source</a></div></div><divclass="public anchor"id="var-float-size"><h3>float-size</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The size in bytes of a c-sized float.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L251">view source</a></div></div><divclass="public anchor"id="var-global-arena"><h3>global-arena</h3><divclass="usage"><code>(global-arena)</code></div><divclass="doc"><divclass="markdown"><p>Constructs the global arena, which will never reclaim its resources.</p>
<p>This arena may be shared across threads, but is intended mainly in cases where memory is allocated with <ahref="coffi.mem.html#var-alloc">alloc</a> but is either never freed or whose management is relinquished to a native library, such as when returned from a callback.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L70">view source</a></div></div><divclass="public anchor"id="var-int-alignment"><h3>int-alignment</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of a c-sized int.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L265">view source</a></div></div><divclass="public anchor"id="var-int-layout"><h3>int-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a c-sized int in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L213">view source</a></div></div><divclass="public anchor"id="var-int-size"><h3>int-size</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The size in bytes of a c-sized int.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L241">view source</a></div></div><divclass="public anchor"id="var-java-layout"><h3>java-layout</h3><divclass="usage"><code>(java-layout type)</code></div><divclass="doc"><divclass="markdown"><p>Gets the Java class to an argument of this type for a method handle.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L72">view source</a></div></div><divclass="public anchor"id="var-int-alignment"><h3>int-alignment</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of a c-sized int.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L267">view source</a></div></div><divclass="public anchor"id="var-int-layout"><h3>int-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a c-sized int in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L215">view source</a></div></div><divclass="public anchor"id="var-int-size"><h3>int-size</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The size in bytes of a c-sized int.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L243">view source</a></div></div><divclass="public anchor"id="var-java-layout"><h3>java-layout</h3><divclass="usage"><code>(java-layout type)</code></div><divclass="doc"><divclass="markdown"><p>Gets the Java class to an argument of this type for a method handle.</p>
<p>If a type serializes to a primitive it returns return a Java primitive type. Otherwise, it returns <ahref="null">MemorySegment</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L796">view source</a></div></div><divclass="public anchor"id="var-java-prim-layout"><h3>java-prim-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Map of primitive type names to the Java types for a method handle.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L798">view source</a></div></div><divclass="public anchor"id="var-java-prim-layout"><h3>java-prim-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Map of primitive type names to the Java types for a method handle.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L193">view source</a></div></div><divclass="public anchor"id="var-long-alignment"><h3>long-alignment</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of a c-sized long.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L269">view source</a></div></div><divclass="public anchor"id="var-long-layout"><h3>long-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a c-sized long in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L217">view source</a></div></div><divclass="public anchor"id="var-long-size"><h3>long-size</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The size in bytes of a c-sized long.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L245">view source</a></div></div><divclass="public anchor"id="var-native-endian"><h3>native-endian</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">ByteOrder</a> for the native endianness of the current hardware.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L195">view source</a></div></div><divclass="public anchor"id="var-long-alignment"><h3>long-alignment</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of a c-sized long.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L271">view source</a></div></div><divclass="public anchor"id="var-long-layout"><h3>long-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a c-sized long in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L219">view source</a></div></div><divclass="public anchor"id="var-long-size"><h3>long-size</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The size in bytes of a c-sized long.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L247">view source</a></div></div><divclass="public anchor"id="var-native-endian"><h3>native-endian</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">ByteOrder</a> for the native endianness of the current hardware.</p>
<p>While this object is safe to pass to functions which serialize to a pointer, it’s generally encouraged to simply pass <code>nil</code>. This value primarily exists to make it easier to write custom types with a primitive pointer representation.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L111">view source</a></div></div><divclass="public anchor"id="var-null.3F"><h3>null?</h3><divclass="usage"><code>(null? addr)</code></div><divclass="doc"><divclass="markdown"><p>Checks if a memory address is null.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L119">view source</a></div></div><divclass="public anchor"id="var-pointer-alignment"><h3>pointer-alignment</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of a c-sized pointer.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L281">view source</a></div></div><divclass="public anchor"id="var-pointer-layout"><h3>pointer-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a native pointer in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L233">view source</a></div></div><divclass="public anchor"id="var-pointer-size"><h3>pointer-size</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The size in bytes of a c-sized pointer.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L257">view source</a></div></div><divclass="public anchor"id="var-primitive-type"><h3>primitive-type</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Gets the primitive type that is used to pass as an argument for the <code>type</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L113">view source</a></div></div><divclass="public anchor"id="var-null.3F"><h3>null?</h3><divclass="usage"><code>(null? addr)</code></div><divclass="doc"><divclass="markdown"><p>Checks if a memory address is null.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L121">view source</a></div></div><divclass="public anchor"id="var-pointer-alignment"><h3>pointer-alignment</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of a c-sized pointer.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L283">view source</a></div></div><divclass="public anchor"id="var-pointer-layout"><h3>pointer-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a native pointer in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L235">view source</a></div></div><divclass="public anchor"id="var-pointer-size"><h3>pointer-size</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The size in bytes of a c-sized pointer.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L259">view source</a></div></div><divclass="public anchor"id="var-primitive-type"><h3>primitive-type</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Gets the primitive type that is used to pass as an argument for the <code>type</code>.</p>
<p>This is for objects which are passed to native functions as primitive types, but which need additional logic to be performed during serialization and deserialization.</p>
<p>Implementations of this method should take into account that type arguments may not always be evaluated before passing to this function.</p>
<p>Returns nil for any type which does not have a primitive representation.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L676">view source</a></div></div><divclass="public anchor"id="var-primitive-types"><h3>primitive-types</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>A set of all primitive types.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L666">view source</a></div></div><divclass="public anchor"id="var-primitive.3F"><h3>primitive?</h3><divclass="usage"><code>(primitive? type)</code></div><divclass="doc"><divclass="markdown"><p>A predicate to determine if a given type is primitive.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L671">view source</a></div></div><divclass="public anchor"id="var-read-address"><h3>read-address</h3><divclass="usage"><code>(read-address segment)</code><code>(read-address segment offset)</code></div><divclass="doc"><divclass="markdown"><p>Reads an address from the <code>segment</code>, at an optional <code>offset</code>, wrapped in a <ahref="null">MemorySegment</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L442">view source</a></div></div><divclass="public anchor"id="var-read-byte"><h3>read-byte</h3><divclass="usage"><code>(read-byte segment)</code><code>(read-byte segment offset)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">byte</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L285">view source</a></div></div><divclass="public anchor"id="var-read-char"><h3>read-char</h3><divclass="usage"><code>(read-char segment)</code><code>(read-char segment offset)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">char</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L376">view source</a></div></div><divclass="public anchor"id="var-read-double"><h3>read-double</h3><divclass="usage"><code>(read-double segment)</code><code>(read-double segment offset)</code><code>(read-double segment offset byte-order)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">double</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L678">view source</a></div></div><divclass="public anchor"id="var-primitive-types"><h3>primitive-types</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>A set of all primitive types.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L668">view source</a></div></div><divclass="public anchor"id="var-primitive.3F"><h3>primitive?</h3><divclass="usage"><code>(primitive? type)</code></div><divclass="doc"><divclass="markdown"><p>A predicate to determine if a given type is primitive.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L673">view source</a></div></div><divclass="public anchor"id="var-read-address"><h3>read-address</h3><divclass="usage"><code>(read-address segment)</code><code>(read-address segment offset)</code></div><divclass="doc"><divclass="markdown"><p>Reads an address from the <code>segment</code>, at an optional <code>offset</code>, wrapped in a <ahref="null">MemorySegment</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L444">view source</a></div></div><divclass="public anchor"id="var-read-byte"><h3>read-byte</h3><divclass="usage"><code>(read-byte segment)</code><code>(read-byte segment offset)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">byte</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L287">view source</a></div></div><divclass="public anchor"id="var-read-char"><h3>read-char</h3><divclass="usage"><code>(read-char segment)</code><code>(read-char segment offset)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">char</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L378">view source</a></div></div><divclass="public anchor"id="var-read-double"><h3>read-double</h3><divclass="usage"><code>(read-double segment)</code><code>(read-double segment offset)</code><code>(read-double segment offset byte-order)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">double</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
<p>If <code>byte-order</code> is not provided, it defaults to <ahref="coffi.mem.html#var-native-endian">native-endian</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L417">view source</a></div></div><divclass="public anchor"id="var-read-float"><h3>read-float</h3><divclass="usage"><code>(read-float segment)</code><code>(read-float segment offset)</code><code>(read-float segment offset byte-order)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">float</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L419">view source</a></div></div><divclass="public anchor"id="var-read-float"><h3>read-float</h3><divclass="usage"><code>(read-float segment)</code><code>(read-float segment offset)</code><code>(read-float segment offset byte-order)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">float</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
<p>If <code>byte-order</code> is not provided, it defaults to <ahref="coffi.mem.html#var-native-endian">native-endian</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L392">view source</a></div></div><divclass="public anchor"id="var-read-int"><h3>read-int</h3><divclass="usage"><code>(read-int segment)</code><code>(read-int segment offset)</code><code>(read-int segment offset byte-order)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">int</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L394">view source</a></div></div><divclass="public anchor"id="var-read-int"><h3>read-int</h3><divclass="usage"><code>(read-int segment)</code><code>(read-int segment offset)</code><code>(read-int segment offset byte-order)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">int</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
<p>If <code>byte-order</code> is not provided, it defaults to <ahref="coffi.mem.html#var-native-endian">native-endian</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L326">view source</a></div></div><divclass="public anchor"id="var-read-long"><h3>read-long</h3><divclass="usage"><code>(read-long segment)</code><code>(read-long segment offset)</code><code>(read-long segment offset byte-order)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">long</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L328">view source</a></div></div><divclass="public anchor"id="var-read-long"><h3>read-long</h3><divclass="usage"><code>(read-long segment)</code><code>(read-long segment offset)</code><code>(read-long segment offset byte-order)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">long</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
<p>If <code>byte-order</code> is not provided, it defaults to <ahref="coffi.mem.html#var-native-endian">native-endian</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L351">view source</a></div></div><divclass="public anchor"id="var-read-short"><h3>read-short</h3><divclass="usage"><code>(read-short segment)</code><code>(read-short segment offset)</code><code>(read-short segment offset byte-order)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">short</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L353">view source</a></div></div><divclass="public anchor"id="var-read-short"><h3>read-short</h3><divclass="usage"><code>(read-short segment)</code><code>(read-short segment offset)</code><code>(read-short segment offset byte-order)</code></div><divclass="doc"><divclass="markdown"><p>Reads a <ahref="null">short</a> from the <code>segment</code>, at an optional <code>offset</code>.</p>
<p>If <code>byte-order</code> is not provided, it defaults to <ahref="coffi.mem.html#var-native-endian">native-endian</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L301">view source</a></div></div><divclass="public anchor"id="var-reinterpret"><h3>reinterpret</h3><divclass="usage"><code>(reinterpret segment size)</code><code>(reinterpret segment size arena)</code><code>(reinterpret segment size arena cleanup)</code></div><divclass="doc"><divclass="markdown"><p>Reinterprets the <code>segment</code> as having the passed <code>size</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L303">view source</a></div></div><divclass="public anchor"id="var-reinterpret"><h3>reinterpret</h3><divclass="usage"><code>(reinterpret segment size)</code><code>(reinterpret segment size arena)</code><code>(reinterpret segment size arena cleanup)</code></div><divclass="doc"><divclass="markdown"><p>Reinterprets the <code>segment</code> as having the passed <code>size</code>.</p>
<p>If <code>arena</code> is passed, the scope of the <code>segment</code> is associated with the arena, as well as its access constraints. If <code>cleanup</code> is passed, it will be a 1-argument function of a fresh memory segment backed by the same memory as the returned segment which should perform any required cleanup operations. It will be called when the <code>arena</code> is closed.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L138">view source</a></div></div><divclass="public anchor"id="var-seq-of"><h3>seq-of</h3><divclass="usage"><code>(seq-of type segment)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a lazy sequence of <code>type</code> elements deserialized from <code>segment</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L1104">view source</a></div></div><divclass="public anchor"id="var-serialize"><h3>serialize</h3><divclass="usage"><code>(serialize obj type)</code><code>(serialize obj type arena)</code></div><divclass="doc"><divclass="markdown"><p>Serializes an arbitrary type.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L140">view source</a></div></div><divclass="public anchor"id="var-seq-of"><h3>seq-of</h3><divclass="usage"><code>(seq-of type segment)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a lazy sequence of <code>type</code> elements deserialized from <code>segment</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L1106">view source</a></div></div><divclass="public anchor"id="var-serialize"><h3>serialize</h3><divclass="usage"><code>(serialize obj type)</code><code>(serialize obj type arena)</code></div><divclass="doc"><divclass="markdown"><p>Serializes an arbitrary type.</p>
<p>For types which have a primitive representation, this serializes into that representation. For types which do not, it allocates a new segment and serializes into that.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L954">view source</a></div></div><divclass="public anchor"id="var-serialize*"><h3>serialize*</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Constructs a serialized version of the <code>obj</code> and returns it.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L956">view source</a></div></div><divclass="public anchor"id="var-serialize*"><h3>serialize*</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Constructs a serialized version of the <code>obj</code> and returns it.</p>
<p>Any new allocations made during the serialization should be tied to the given <code>arena</code>, except in extenuating circumstances.</p>
<p>This method should only be implemented for types that serialize to primitives.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L825">view source</a></div></div><divclass="public anchor"id="var-serialize-into"><h3>serialize-into</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Writes a serialized version of the <code>obj</code> to the given <code>segment</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L827">view source</a></div></div><divclass="public anchor"id="var-serialize-into"><h3>serialize-into</h3><h4class="type">multimethod</h4><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>Writes a serialized version of the <code>obj</code> to the given <code>segment</code>.</p>
<p>Any new allocations made during the serialization should be tied to the given <code>arena</code>, except in extenuating circumstances.</p>
<p>This method should be implemented for any type which does not override <ahref="coffi.mem.html#var-c-layout">c-layout</a>.</p>
<p>For any other type, this will serialize it as <ahref="coffi.mem.html#var-serialize*">serialize*</a> before writing the result value into the <code>segment</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L885">view source</a></div></div><divclass="public anchor"id="var-shared-arena"><h3>shared-arena</h3><divclass="usage"><code>(shared-arena)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a new shared memory arena.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L887">view source</a></div></div><divclass="public anchor"id="var-shared-arena"><h3>shared-arena</h3><divclass="usage"><code>(shared-arena)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a new shared memory arena.</p>
<p>This arena can be shared across threads and memory allocated in it will only be cleaned up once any thread accessing the arena closes it.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L51">view source</a></div></div><divclass="public anchor"id="var-short-alignment"><h3>short-alignment</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of a c-sized short.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L261">view source</a></div></div><divclass="public anchor"id="var-short-layout"><h3>short-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a c-sized short in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L209">view source</a></div></div><divclass="public anchor"id="var-short-size"><h3>short-size</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The size in bytes of a c-sized short.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L237">view source</a></div></div><divclass="public anchor"id="var-size-of"><h3>size-of</h3><divclass="usage"><code>(size-of type)</code></div><divclass="doc"><divclass="markdown"><p>The size in bytes of the given <code>type</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L804">view source</a></div></div><divclass="public anchor"id="var-slice"><h3>slice</h3><divclass="usage"><code>(slice segment offset)</code><code>(slice segment offset size)</code></div><divclass="doc"><divclass="markdown"><p>Get a slice over the <code>segment</code> with the given <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L131">view source</a></div></div><divclass="public anchor"id="var-slice-segments"><h3>slice-segments</h3><divclass="usage"><code>(slice-segments segment size)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a lazy seq of <code>size</code>-length memory segments, sliced from <code>segment</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L180">view source</a></div></div><divclass="public anchor"id="var-write-address"><h3>write-address</h3><divclass="usage"><code>(write-address segment value)</code><code>(write-address segment offset value)</code></div><divclass="doc"><divclass="markdown"><p>Writes the address of the <ahref="null">MemorySegment</a><code>value</code> to the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L640">view source</a></div></div><divclass="public anchor"id="var-write-byte"><h3>write-byte</h3><divclass="usage"><code>(write-byte segment value)</code><code>(write-byte segment offset value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">byte</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L458">view source</a></div></div><divclass="public anchor"id="var-write-char"><h3>write-char</h3><divclass="usage"><code>(write-char segment value)</code><code>(write-char segment offset value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">char</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L560">view source</a></div></div><divclass="public anchor"id="var-write-double"><h3>write-double</h3><divclass="usage"><code>(write-double segment value)</code><code>(write-double segment offset value)</code><code>(write-double segment offset byte-order value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">double</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L53">view source</a></div></div><divclass="public anchor"id="var-short-alignment"><h3>short-alignment</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The alignment in bytes of a c-sized short.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L263">view source</a></div></div><divclass="public anchor"id="var-short-layout"><h3>short-layout</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The <ahref="null">MemoryLayout</a> for a c-sized short in <ahref="coffi.mem.html#var-native-endian">native-endian</a><ahref="null">ByteOrder</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L211">view source</a></div></div><divclass="public anchor"id="var-short-size"><h3>short-size</h3><divclass="usage"></div><divclass="doc"><divclass="markdown"><p>The size in bytes of a c-sized short.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L239">view source</a></div></div><divclass="public anchor"id="var-size-of"><h3>size-of</h3><divclass="usage"><code>(size-of type)</code></div><divclass="doc"><divclass="markdown"><p>The size in bytes of the given <code>type</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L806">view source</a></div></div><divclass="public anchor"id="var-slice"><h3>slice</h3><divclass="usage"><code>(slice segment offset)</code><code>(slice segment offset size)</code></div><divclass="doc"><divclass="markdown"><p>Get a slice over the <code>segment</code> with the given <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L133">view source</a></div></div><divclass="public anchor"id="var-slice-segments"><h3>slice-segments</h3><divclass="usage"><code>(slice-segments segment size)</code></div><divclass="doc"><divclass="markdown"><p>Constructs a lazy seq of <code>size</code>-length memory segments, sliced from <code>segment</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L182">view source</a></div></div><divclass="public anchor"id="var-write-address"><h3>write-address</h3><divclass="usage"><code>(write-address segment value)</code><code>(write-address segment offset value)</code></div><divclass="doc"><divclass="markdown"><p>Writes the address of the <ahref="null">MemorySegment</a><code>value</code> to the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L642">view source</a></div></div><divclass="public anchor"id="var-write-byte"><h3>write-byte</h3><divclass="usage"><code>(write-byte segment value)</code><code>(write-byte segment offset value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">byte</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L460">view source</a></div></div><divclass="public anchor"id="var-write-char"><h3>write-char</h3><divclass="usage"><code>(write-char segment value)</code><code>(write-char segment offset value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">char</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L562">view source</a></div></div><divclass="public anchor"id="var-write-double"><h3>write-double</h3><divclass="usage"><code>(write-double segment value)</code><code>(write-double segment offset value)</code><code>(write-double segment offset byte-order value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">double</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
<p>If <code>byte-order</code> is not provided, it defaults to <ahref="coffi.mem.html#var-native-endian">native-endian</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L612">view source</a></div></div><divclass="public anchor"id="var-write-float"><h3>write-float</h3><divclass="usage"><code>(write-float segment value)</code><code>(write-float segment offset value)</code><code>(write-float segment offset byte-order value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">float</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L614">view source</a></div></div><divclass="public anchor"id="var-write-float"><h3>write-float</h3><divclass="usage"><code>(write-float segment value)</code><code>(write-float segment offset value)</code><code>(write-float segment offset byte-order value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">float</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
<p>If <code>byte-order</code> is not provided, it defaults to <ahref="coffi.mem.html#var-native-endian">native-endian</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L584">view source</a></div></div><divclass="public anchor"id="var-write-int"><h3>write-int</h3><divclass="usage"><code>(write-int segment value)</code><code>(write-int segment offset value)</code><code>(write-int segment offset byte-order value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">int</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L586">view source</a></div></div><divclass="public anchor"id="var-write-int"><h3>write-int</h3><divclass="usage"><code>(write-int segment value)</code><code>(write-int segment offset value)</code><code>(write-int segment offset byte-order value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">int</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
<p>If <code>byte-order</code> is not provided, it defaults to <ahref="coffi.mem.html#var-native-endian">native-endian</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L504">view source</a></div></div><divclass="public anchor"id="var-write-long"><h3>write-long</h3><divclass="usage"><code>(write-long segment value)</code><code>(write-long segment offset value)</code><code>(write-long segment offset byte-order value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">long</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L506">view source</a></div></div><divclass="public anchor"id="var-write-long"><h3>write-long</h3><divclass="usage"><code>(write-long segment value)</code><code>(write-long segment offset value)</code><code>(write-long segment offset byte-order value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">long</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
<p>If <code>byte-order</code> is not provided, it defaults to <ahref="coffi.mem.html#var-native-endian">native-endian</a>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/58eaffdf543a3aa00436dafef2c65b247ad3f916/src/clj/coffi/mem.clj#L532">view source</a></div></div><divclass="public anchor"id="var-write-short"><h3>write-short</h3><divclass="usage"><code>(write-short segment value)</code><code>(write-short segment offset value)</code><code>(write-short segment offset byte-order value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">short</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
</div></div><divclass="src-link"><ahref="https://github.com/IGJoshua/coffi/blob/fc0651ceef53e8d5ce8bc29ea5a99409add55fcf/src/clj/coffi/mem.clj#L534">view source</a></div></div><divclass="public anchor"id="var-write-short"><h3>write-short</h3><divclass="usage"><code>(write-short segment value)</code><code>(write-short segment offset value)</code><code>(write-short segment offset byte-order value)</code></div><divclass="doc"><divclass="markdown"><p>Writes a <ahref="null">short</a> to the <code>segment</code>, at an optional <code>offset</code>.</p>
<p>If <code>byte-order</code> is not provided, it defaults to <ahref="coffi.mem.html#var-native-endian">native-endian</a>.</p>