TInterface_BambooInstenceCache<T> = interface function Dequeue: T; function IdleCount: Integer; procedure ClearIdle; procedure Enqueue(const aInstence: T); end;
TBambooInstenceCache<T> = class(TInterfacedObject, TInterface_BambooInstenceCache<T>) public type TBambooRefProc_Var = reference to procedure(var aInstence: T); strict private FIdle: TList<T>; FProcCreateInstence: TBambooRefProc_Var; FProcDestroyInstence: TBambooRefProc_Var; private function Dequeue: T; function IdleCount: Integer; procedure ClearIdle; procedure Enqueue(const aInstence: T); public constructor Create(const aProcCreateInstence, aProcDestroyInstence: TBambooRefProc_Var); destructor Destroy; override; end;
implementation
{ TBambooInstenceCache<T> }
procedure TBambooInstenceCache<T>.ClearIdle; var aItem: T; i: Integer; begin if Assigned(FProcDestroyInstence) then for i := 0 to FIdle.Count - 1 do begin aItem := FIdle.Items[i]; FProcDestroyInstence(aItem); end; FIdle.Clear; end;
function TBambooInstenceCache<T>.Dequeue: T; begin if FIdle.Count > 0 then begin Result := FIdle.Last; FIdle.Delete(FIdle.Count - 1); end else begin Result := Default (T); if Assigned(FProcCreateInstence) then FProcCreateInstence(Result); end; end;
destructor TBambooInstenceCache<T>.Destroy; begin ClearIdle; FIdle.DisposeOf; inherited Destroy; end;
procedure TBambooInstenceCache<T>.Enqueue(const aInstence: T); begin FIdle.Add(aInstence); end;
function TBambooInstenceCache<T>.IdleCount: Integer; begin Result := FIdle.Count; end;