📄 jclbinarytrees.pas
字号:
procedure SetString(const AString: string);
public
constructor Create(OwnList: TJclStrBinaryTree; Start: PJclStrBinaryNode);
destructor Destroy; override;
end;
constructor TStrItr.Create(OwnList: TJclStrBinaryTree; Start: PJclStrBinaryNode);
begin
inherited Create;
FCursor := Start;
FOwnList := OwnList;
FOwnList._AddRef; // Add a ref because FOwnList is not an interface !
FLastRet := nil;
end;
destructor TStrItr.Destroy;
begin
FOwnList._Release;
inherited Destroy;
end;
procedure TStrItr.Add(const AString: string);
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
FOwnList.Add(AString);
end;
function TStrItr.GetString: string;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
Result := FCursor.Str;
end;
function TStrItr.HasNext: Boolean;
begin
Result := FCursor <> nil;
end;
function TStrItr.HasPrevious: Boolean;
begin
Result := FCursor <> nil;
end;
function TStrItr.Next: string;
begin
end;
function TStrItr.NextIndex: Integer;
begin
// No index
raise EJclOperationNotSupportedError.CreateRes(@RsEOperationNotSupported);
end;
function TStrItr.Previous: string;
begin
end;
function TStrItr.PreviousIndex: Integer;
begin
// No index
raise EJclOperationNotSupportedError.CreateRes(@RsEOperationNotSupported);
end;
procedure TStrItr.Remove;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
FOwnList.Remove(Next);
end;
procedure TStrItr.SetString(const AString: string);
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
FCursor.Str := AString;
end;
//=== { TPreOrderStrItr } ====================================================
type
TPreOrderStrItr = class(TStrItr, IJclStrIterator)
protected
{ IJclStrIterator }
function Next: string; override;
function Previous: string; override;
end;
function TPreOrderStrItr.Next: string;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
Result := FCursor.Str;
FLastRet := FCursor;
if FCursor.Left <> nil then
FCursor := FCursor.Left
else
if FCursor.Right <> nil then
FCursor := FCursor.Right
else
begin
FCursor := FCursor.Parent;
while (FCursor <> nil) and (FCursor.Left <> FLastRet) do // come from Right
begin
FLastRet := FCursor;
FCursor := FCursor.Parent;
end;
while (FCursor <> nil) and (FCursor.Right = nil) do
begin
FLastRet := FCursor;
FCursor := FCursor.Parent;
end;
if FCursor <> nil then // not root
FCursor := FCursor.Right;
end;
end;
function TPreOrderStrItr.Previous: string;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
Result := FCursor.Str;
FLastRet := FCursor;
FCursor := FCursor.Parent;
if (FCursor <> nil) and (FCursor.Left <> FLastRet) then // come from Right
if FCursor.Left <> nil then
begin
FLastRet := FCursor;
FCursor := FCursor.Left;
while FCursor.Right <> nil do
begin
FLastRet := FCursor;
FCursor := FCursor.Right;
end;
end;
end;
//=== { TInOrderStrItr } =====================================================
type
TInOrderStrItr = class(TStrItr, IJclStrIterator)
protected
{ IJclStrIterator }
function Next: string; override;
function Previous: string; override;
end;
function TInOrderStrItr.Next: string;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
if FCursor.Left <> FLastRet then
while FCursor.Left <> nil do
FCursor := FCursor.Left;
Result := FCursor.Str;
FLastRet := FCursor;
if FCursor.Right <> nil then
FCursor := FCursor.Right
else
begin
FCursor := FCursor.Parent;
while (FCursor <> nil) and (FCursor.Right = FLastRet) do
begin
FLastRet := FCursor;
FCursor := FCursor.Parent;
end;
end;
end;
function TInOrderStrItr.Previous: string;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
Result := FCursor.Str;
FLastRet := FCursor;
if FCursor.Left <> nil then
begin
FCursor := FCursor.Left;
while FCursor.Right <> nil do
begin
FLastRet := FCursor;
FCursor := FCursor.Right;
end;
end
else
begin
FCursor := FCursor.Parent;
while (FCursor <> nil) and (FCursor.Right <> FLastRet) do // Come from Left
begin
FLastRet := FCursor;
FCursor := FCursor.Parent;
end;
end;
end;
//=== { TPostOrderStrItr } ===================================================
type
TPostOrderStrItr = class(TStrItr, IJclStrIterator)
protected
{ IJclStrIterator }
function Next: string; override;
function Previous: string; override;
end;
function TPostOrderStrItr.Next: string;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
if (FCursor.Left <> FLastRet) and (FCursor.Right <> FLastRet) then
while FCursor.Left <> nil do
FCursor := FCursor.Left;
if (FCursor.Right <> nil) and (FCursor.Right <> FLastRet) then
begin
FCursor := FCursor.Right;
while FCursor.Left <> nil do
FCursor := FCursor.Left;
if FCursor.Right <> nil then // particular worst case
FCursor := FCursor.Right;
end;
Result := FCursor.Str;
FLastRet := FCursor;
FCursor := FCursor.Parent;
end;
function TPostOrderStrItr.Previous: string;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
Result := FCursor.Str;
FLastRet := FCursor;
if (FCursor.Right <> nil) and (FCursor.Right <> FLastRet) then
FCursor := FCursor.Right
else
begin
FCursor := FCursor.Parent;
while (FCursor <> nil) and ((FCursor.Left = nil) or (FCursor.Left = FLastRet)) do
begin
FLastRet := FCursor;
FCursor := FCursor.Parent;
end;
if FCursor <> nil then // not root
FCursor := FCursor.Left;
end;
end;
//=== { TItr } ===============================================================
type
TItr = class(TJclAbstractContainer, IJclIterator)
protected
FCursor: PJclBinaryNode;
FOwnList: TJclBinaryTree;
FLastRet: PJclBinaryNode;
{ IJclIntfIterator }
procedure Add(AObject: TObject);
function GetObject: TObject;
function HasNext: Boolean;
function HasPrevious: Boolean;
function Next: TObject; virtual;
function NextIndex: Integer;
function Previous: TObject; virtual;
function PreviousIndex: Integer;
procedure Remove;
procedure SetObject(AObject: TObject);
public
constructor Create(OwnList: TJclBinaryTree; Start: PJclBinaryNode);
destructor Destroy; override;
end;
constructor TItr.Create(OwnList: TJclBinaryTree; Start: PJclBinaryNode);
begin
inherited Create;
FCursor := Start;
FOwnList := OwnList;
FOwnList._AddRef; // Add a ref because FOwnList is not an interface !
FLastRet := nil;
end;
destructor TItr.Destroy;
begin
FOwnList._Release;
inherited Destroy;
end;
procedure TItr.Add(AObject: TObject);
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
FOwnList.Add(AObject);
end;
function TItr.GetObject: TObject;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
Result := FCursor.Obj;
end;
function TItr.HasNext: Boolean;
begin
Result := FCursor <> nil;
end;
function TItr.HasPrevious: Boolean;
begin
Result := FCursor <> nil;
end;
function TItr.Next: TObject;
begin
Result := nil; // overriden in derived class
end;
function TItr.NextIndex: Integer;
begin
// No index
raise EJclOperationNotSupportedError.CreateRes(@RsEOperationNotSupported);
end;
function TItr.Previous: TObject;
begin
Result := nil; // overriden in derived class
end;
function TItr.PreviousIndex: Integer;
begin
// No index
raise EJclOperationNotSupportedError.CreateRes(@RsEOperationNotSupported);
end;
procedure TItr.Remove;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
FOwnList.Remove(Next);
end;
procedure TItr.SetObject(AObject: TObject);
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
FCursor.Obj := AObject;
end;
//=== { TPreOrderItr } =======================================================
type
TPreOrderItr = class(TItr, IJclIterator)
protected
{ IJclIterator }
function Next: TObject; override;
function Previous: TObject; override;
end;
function TPreOrderItr.Next: TObject;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
Result := FCursor.Obj;
FLastRet := FCursor;
if FCursor.Left <> nil then
FCursor := FCursor.Left
else
if FCursor.Right <> nil then
FCursor := FCursor.Right
else
begin
FCursor := FCursor.Parent;
while (FCursor <> nil) and (FCursor.Left <> FLastRet) do // come from Right
begin
FLastRet := FCursor;
FCursor := FCursor.Parent;
end;
while (FCursor <> nil) and (FCursor.Right = nil) do
begin
FLastRet := FCursor;
FCursor := FCursor.Parent;
end;
if FCursor <> nil then // not root
FCursor := FCursor.Right;
end;
end;
function TPreOrderItr.Previous: TObject;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
Result := FCursor.Obj;
FLastRet := FCursor;
FCursor := FCursor.Parent;
if (FCursor <> nil) and (FCursor.Left <> FLastRet) then // come from Right
if FCursor.Left <> nil then
begin
FLastRet := FCursor;
FCursor := FCursor.Left;
while FCursor.Right <> nil do
begin
FLastRet := FCursor;
FCursor := FCursor.Right;
end;
end;
end;
//=== { TInOrderItr } ========================================================
type
TInOrderItr = class(TItr, IJclIterator)
protected
{ IJclIterator }
function Next: TObject; override;
function Previous: TObject; override;
end;
function TInOrderItr.Next: TObject;
{$IFDEF THREADSAFE}
var
CS: IInterface;
{$ENDIF THREADSAFE}
begin
{$IFDEF THREADSAFE}
CS := EnterCriticalSection;
{$ENDIF THREADSAFE}
if FCursor.Left <> FLastRet then
while FCursor.Left <> nil do
FCursor := FCursor.Left;
Result := FCursor.Obj;
FLastRet := FCursor;
if FCursor.Right <> nil then
FCursor := FCursor.Right
else
begin
FCursor := FCursor.Parent;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -