with Ada.Unchecked_Conversion; with Ada.Unchecked_Deallocation; package body H2.Pool is function Allocate (Pool: in Storage_Pool_Pointer := null) return Pointer_Type is P: Storage_Pool_Pointer; begin if Pool = null then P := Storage_Pool; else P := Pool; end if; if P = null then return new Normal_Type; else declare type Pooled_Pointer is access Normal_Type; for Pooled_Pointer'Storage_Pool use P.all; function To_Pointer_Type is new Ada.Unchecked_Conversion(Pooled_Pointer, Pointer_Type); Tmp: Pooled_Pointer; begin Tmp := new Normal_Type; return To_Pointer_Type(Tmp); end; end if; end Allocate; -- function Allocate (Source: in Normal_Type; -- Pool: in Storage_Pool_Pointer := null) return Pointer_Type is -- P: Storage_Pool_Pointer; -- begin -- if Pool = null then -- P := Storage_Pool; -- else -- P := Pool; -- end if; -- -- if P = null then -- return new Normal_Type'(Source); -- else -- declare -- type Pooled_Pointer is access Normal_Type; -- for Pooled_Pointer'Storage_Pool use P.all; -- function To_Pointer_Type is new Ada.Unchecked_Conversion (Pooled_Pointer, Pointer_Type); -- Tmp: Pooled_Pointer; -- begin -- Tmp := new Normal_Type'(Source); -- return To_Pointer_Type(Tmp); -- end; -- end if; -- end Allocate; procedure Deallocate (Target: in out Pointer_Type; Pool: in Storage_Pool_Pointer := null) is P: Storage_Pool_Pointer; begin if Pool = null then P := Storage_Pool; else P := Pool; end if; if P = null then declare procedure Dealloc is new Ada.Unchecked_Deallocation(Normal_Type, Pointer_Type); begin Dealloc (Target); end; else declare type Pooled_Pointer is access Normal_Type; for Pooled_Pointer'Storage_Pool use P.all; function To_Pooled_Pointer is new Ada.Unchecked_Conversion(Pointer_Type, Pooled_Pointer); procedure Dealloc is new Ada.Unchecked_Deallocation(Normal_Type, Pooled_Pointer); Tmp: Pooled_Pointer := To_Pooled_Pointer(Target); begin Dealloc (Tmp); Target := null; end; end if; end Deallocate; end H2.Pool;