`module Weak = ``struct ... end `

Functions |

: `int -> 'b t` |

`Weak.create n`

returns a new weak array of length `n`

.
All the pointers are initially empty. Raise `Invalid_argument`

if `n`

is negative or greater than `Sys.max_array_length-1`

.
: `'c t -> int` |

`Weak.length ar`

returns the length (number of elements) of
`ar`

.
: `'d t -> int -> 'd option -> unit` |

`Weak.set ar n (Some el)`

sets the `n`

th cell of `ar`

to be a
(full) pointer to `el`

; `Weak.set ar n None`

sets the `n`

th
cell of `ar`

to empty.
Raise `Invalid_argument "Weak.set"`

if `n`

is not in the range
0 to `Weak.length a - 1`

.
: `'e t -> int -> 'e option` |

`Weak.get ar n`

returns None if the `n`

th cell of `ar`

is
empty, `Some x`

(where `x`

is the value) if it is full.
Raise `Invalid_argument "Weak.get"`

if `n`

is not in the range
0 to `Weak.length a - 1`

.
: `'f t -> int -> 'f option` |

`Weak.get_copy ar n`

returns None if the `n`

th cell of `ar`

is
empty, `Some x`

(where `x`

is a (shallow) copy of the value) if
it is full.
In addition to pitfalls with mutable values, the interesting
difference with `get`

is that `get_copy`

does not prevent
the incremental GC from erasing the value in its current cycle
(`get`

may delay the erasure to the next GC cycle).
Raise `Invalid_argument "Weak.get"`

if `n`

is not in the range
0 to `Weak.length a - 1`

.
: `'g t -> int -> bool` |

`Weak.check ar n`

returns `true`

if the `n`

th cell of `ar`

is
full, `false`

if it is empty. Note that even if `Weak.check ar n`

returns `true`

, a subsequent `Weak.get ar n`

can return `None`

.
: `'h t -> pos:int -> len:int -> 'h option -> unit` |

`Weak.fill ar ofs len el`

sets to `el`

all pointers of `ar`

from
`ofs`

to `ofs + len - 1`

. Raise `Invalid_argument "Weak.fill"`

if `ofs`

and `len`

do not designate a valid subarray of `a`

.
: `src:'i t ->` |

`Weak.blit ar1 off1 ar2 off2 len`

copies `len`

weak pointers
from `ar1`

(starting at `off1`

) to `ar2`

(starting at `off2`

).
It works correctly even if `ar1`

and `ar2`

are the same.
Raise `Invalid_argument "Weak.blit"`

if `off1`

and `len`

do
not designate a valid subarray of `ar1`

, or if `off2`

and `len`

do not designate a valid subarray of `ar2`

.