(* objpool.ml *)
(* pool of allocated objects for explicit re-use *)
open BatteriesInit
                                  
(* This object pool maintains a set of objects that are available
 * for use.  It must be given a way to create new objects. *)
class ['a] tObjectPool (allocFunc: unit -> 'a) =
object (self)
  (* implementation is just an array of elements that have been made
   * available for re-use; this should be regarded as private
   * inheritance, though I don't see how to do that in OCaml *)
  inherit (*PRIVATE*) ['a] Arraystack.tArrayStack (allocFunc ())

  (* ---- funcs ---- *)
  (* retrieve an object ready to be used; might return a pool element,
   * or if the pool is empty, will make a new element *)
  method alloc() : 'a =
  begin
    if (self#isNotEmpty()) then (
      (* just grab the topmost element in the pool stack *)
      (self#pop())
    )

    else (
      (* make a new object; I thought about making several at a time
       * but there seems little advantage.. *)
      (allocFunc ())
    )
  end

  (* return an object to the pool so it can be re-used *)
  method dealloc (obj: 'a) : unit =
  begin
    (* put the element into the stack *)
    (self#push obj);
  end
end


(* EOF *)
