(* $Id$ *)
open Netmcore_heap
type ('e,'h) t =
{ mutable array : 'e array;
header : 'h
}
type ('e,'h) sarray = ('e,'h) t heap
type ('e,'h) sarray_descr = ('e,'h) t descr
let descr_of_sarray = descr_of_heap
let sarray_of_descr = heap_of_descr
let create res_id a h =
let ra = { array = a; header = h } in
create_heap
res_id
(minimum_size ra)
ra
let make res_id n x h =
let ra = { array = [| |]; header = h } in
let sa = create_heap res_id 4096 ra in
modify
sa
(fun mut ->
let a = add_uniform_array mut n x in
(root sa).array <- a
);
sa
let init res_id n f h =
let ra = { array = [| |]; header = h } in
let sa = create_heap res_id 4096 ra in
modify
sa
(fun mut ->
let a = add_init_array mut n f in
(root sa).array <- a
);
sa
let grow sa n x =
modify
sa
(fun mut ->
let ra = root sa in
let old_n = Array.length ra.array in
if n > old_n then (
let new_a = add_uniform_array mut n x in
Array.blit ra.array 0 new_a 0 old_n;
ra.array <- new_a
)
)
let set sa k x =
modify
sa
(fun mut ->
let a = (root sa).array in
a.(k) <- add mut x
)
let get_ro sa k =
let a = (root sa).array in
a.(k)
let get_p sa k f =
with_value
sa
(fun () ->
let a = (root sa).array in
a.(k)
)
f
let get_c sa k =
get_p sa k copy
let length sa =
let a = (root sa).array in
Array.length a
let deref sa =
(root sa).array
let header sa =
(root sa).header
let heap sa =
Obj.magic sa