{ Inno Setup Preprocessor Copyright (C) 2001-2002 Alex Yackimoff Inno Setup Copyright (C) 1997-2020 Jordan Russell Portions by Martijn Laan For conditions of distribution and use, see LICENSE.TXT. } unit ISPP.Stack; interface uses Classes; type { Borrowed from Delphi 5 Contnrs unit } { TOrdered class } TOrderedList = class(TObject) private FList: TList; protected procedure PushItem(AItem: Pointer); virtual; abstract; function PopItem: Pointer; virtual; function PeekItem: Pointer; virtual; property List: TList read FList; public constructor Create; destructor Destroy; override; function Count: Integer; function AtLeast(ACount: Integer): Boolean; procedure Push(AItem: Pointer); function Pop: Pointer; function Peek: Pointer; end; { TStack class } TStack = class(TOrderedList) protected procedure PushItem(AItem: Pointer); override; end; implementation uses ISPP.Consts; { TOrderedList } function TOrderedList.AtLeast(ACount: integer): boolean; begin Result := List.Count >= ACount; end; function TOrderedList.Peek: Pointer; begin Result := PeekItem; end; function TOrderedList.Pop: Pointer; begin Result := PopItem; end; procedure TOrderedList.Push(AItem: Pointer); begin PushItem(AItem); end; function TOrderedList.Count: Integer; begin Result := List.Count; end; constructor TOrderedList.Create; begin inherited Create; FList := TList.Create; end; destructor TOrderedList.Destroy; begin List.Free; inherited Destroy; end; function TOrderedList.PeekItem: Pointer; begin Result := List[List.Count-1]; end; function TOrderedList.PopItem: Pointer; begin Result := PeekItem; List.Delete(List.Count-1); end; { TStack } procedure TStack.PushItem(AItem: Pointer); begin List.Add(AItem); end; end.