package core_kernel
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=e37370bad978cfb71fdaf2b1a25ab1506b98ef0b91e0dbd189ffd9d853245ce2
doc/core_kernel.tuple_pool/Tuple_pool/index.html
Module Tuple_pool
Source
Tuple-like types used in Pool
.
This uses a Uniform_array.t
to implement the pool. We expose that Pointer.t
is an int
so that OCaml can avoid the write barrier, due to knowing that Pointer.t
isn't an OCaml pointer.
Slots
has types t1
, ..., t12
of arities 1 to 12 that are isomorphic to tuple types of the corresponding arities. Type ('a0, ..., 'a<N-1>) t<N>
corresponds to 'a0 * ... * 'a<N-1>
.
A pool. 'slots
will look like ('a1, ..., 'an) Slots.tn
, and the pool holds tuples of type 'a1 * ... * 'an
.
pointer_is_valid t pointer
returns true
iff pointer
points to a live tuple in t
, i.e. pointer
is not null, not free, and is in the range of t
.
A pointer might not be in the range of a pool if it comes from another pool for example. In this case unsafe_get/set functions would cause a segfault.
id_of_pointer t pointer
returns an id that is unique for the lifetime of pointer
's tuple. When the tuple is freed, the id is no longer valid, and pointer_of_id_exn
will fail on it. Pointer.null ()
has a distinct id from all non-null pointers.
pointer_of_id_exn t id
returns the pointer corresponding to id
. It fails if the tuple corresponding to id
was already free
d.
create slots ~capacity ~dummy
creates an empty pool that can hold up to capacity
N-tuples. The slots of dummy
are stored in free tuples. create
raises if capacity < 0 || capacity > max_capacity ~slots_per_tuple
.
max_capacity
returns the maximum capacity allowed when creating a pool.
capacity
returns the maximum number of tuples that the pool can hold.
length
returns the number of tuples currently in the pool.
0 <= length t <= capacity t
grow t ~capacity
returns a new pool t'
with the supplied capacity. The new pool is to be used as a replacement for t
. All live tuples in t
are now live in t'
, and valid pointers to tuples in t
are now valid pointers to the identical tuple in t'
. It is an error to use t
after calling grow t
.
grow
raises if the supplied capacity isn't larger than capacity t
.
free t pointer
frees the tuple pointed to by pointer
from t
.
unsafe_free t pointer
frees the tuple pointed to by pointer
without checking pointer_is_valid
new<N> t a0 ... a<N-1>
returns a new tuple from the pool, with the tuple's slots initialized to a0
... a<N-1>
. new
raises if is_full t
.
get_tuple t pointer
allocates an OCaml tuple isomorphic to the pool t
's tuple pointed to by pointer
. The tuple gets copied, but its slots do not.
val get :
(_, 'variant) Slots.t as 'slots t ->
'slots Pointer.t ->
('variant, 'slot) Slot.t ->
'slot
get t pointer slot
gets slot
of the tuple pointed to by pointer
in pool t
.
set t pointer slot a
sets to a
the slot
of the tuple pointed to by pointer
in pool t
.
In get
and set
, it is an error to refer to a pointer that has been free
d. It is also an error to use a pointer with any pool other than the one the pointer was new
'd from or grow
n to. These errors will lead to undefined behavior, but will not segfault.
unsafe_get
is comparable in speed to get
for immediate values, and 5%-10% faster for pointers.
unsafe_get
and unsafe_set
skip bounds checking, and can thus segfault.
An Unsafe
pool is like an ordinary pool, except that the create
function does not require an initial element. The pool stores a dummy value for each slot. Such a pool is only safe if one never accesses a slot from a free
d tuple.
Debug
builds a pool in which every function can run invariant
on its pool argument(s) and/or print a debug message to stderr, as determined by !check_invariant
and !show_messages
, which are initially both true
.
Error_check
builds a pool that has additional error checking for pointers, in particular to detect using a free
d pointer or multiply free
ing a pointer.