type cbitmap external cbitmap_create : int -> cbitmap = "caml_bitmap_create" external cbitmap_setbit : cbitmap -> int -> int -> unit = "caml_bitmap_setbit" external cbitmap_resize : cbitmap -> int -> cbitmap = "caml_bitmap_resize" type bitmap = { mutable data : cbitmap; mutable size : int; mutable capacity : int; (* in bits *) } let bitmap_increment = 4096 let bitmap_create () = { data = cbitmap_create bitmap_increment; size = 0; capacity = bitmap_increment; } let bitmap_push_back b i = if b.size >= b.capacity then begin let ncap = b.capacity + bitmap_increment in b.data <- cbitmap_resize b.data ncap; b.capacity <- ncap; end; cbitmap_setbit b.data b.size i; b.size <- b.size + 1 type t external bp_construct : cbitmap -> int -> t = "caml_bp_construct" external alloc_stats : unit -> int = "caml_bp_alloc_stats" external save : t -> Unix.file_descr -> unit = "caml_bp_save" external load : Unix.file_descr -> t = "caml_bp_load" external first_child : t -> int -> int = "caml_bp_first_child" "noalloc" external next_sibling : t -> int -> int = "caml_bp_next_sibling" "noalloc" external preorder_rank : t -> int -> int = "caml_bp_preorder_rank" "noalloc" let create bm = bp_construct bm.data bm.size