Я написал небольшой класс, реализующий некоторое подобие TList. Но у меня две проблемы: 1) сортировка 2) стабильность работы Убедительная просьба помочь мне улучшить работы этого модуля.
PointerArray.pas
| Код | unit PointerArray;
{$I config.inc}
interface
type TArrayOfPointer = array of Pointer; TPointerArray = class private FArray: TArrayOfPointer; function GetItem(AIndex: integer): Pointer; procedure SetItem(AIndex: integer; AValue: Pointer); protected property Values[AIndex: integer]: Pointer read GetItem write SetItem; default; public {$IFDEF DELPHI} constructor Create; destructor Destroy; override; {$ENDIF} constructor Init; function Add(AItem: Pointer): integer; function IndexOf(AItem: Pointer): integer; function Count: integer; procedure Delete(AIndex: integer); procedure RemoveNil; procedure Clear; procedure Sort; destructor Done; end;
implementation
{$IFDEF DELPHI} constructor TPointerArray.Create; begin Init; end;
destructor TPointerArray.Destroy; begin Done; inherited Destroy; end; {$ENDIF}
constructor TPointerArray.Init; begin
end;
function TPointerArray.Add(AItem: Pointer): integer; begin Result := Length(FArray); SetLength(FArray, Result + 1); FArray[Result] := AItem; end;
function TPointerArray.GetItem(AIndex: integer): Pointer; begin Result := nil; if AIndex > Count - 1 then Exit; Result := FArray[AIndex]; end;
procedure TPointerArray.SetItem(AIndex: integer; AValue: Pointer); begin if AIndex > Count - 1 then Exit; FArray[AIndex] := AValue; end;
function TPointerArray.IndexOf(AItem: Pointer): integer; var Index: integer; begin Result := - 1; for Index := 0 to Length(FArray) - 1 do if FArray[Index] = AItem then begin Result := Index; Break; end; end;
function TPointerArray.Count: integer; begin Result := Length(FArray); end;
procedure TPointerArray.Delete(AIndex: integer); var Index: integer; begin if AIndex > Length(FArray) - 1 then Exit; FArray[AIndex] := nil; for Index := Length(FArray) - 2 downto AIndex do FArray[Index] := FArray[Index + 1]; SetLength(FArray, Length(FArray) - 1); end;
procedure TPointerArray.RemoveNil; var Index: integer; begin for Index := Count - 1 downto 0 do if not Assigned(FArray[Index]) then Delete(Index); end;
procedure TPointerArray.Clear; begin SetLength(FArray, 0); end;
function InsertionSort(AArray: TArrayOfPointer): TArrayOfPointer; var n, i, j: integer; begin n := Length(AArray); Result := AArray; for i := 0 to n - 1 do begin j := i; while (j > 1) and (SizeOf(Result[j - 1]) < SizeOf(AArray[i])) do begin Result[j] := Result[j - 1]; j := j - 1; end; Result[j] := AArray[i]; end; end;
procedure TPointerArray.Sort; begin FArray := InsertionSort(FArray); end;
destructor TPointerArray.Done; begin Clear; end;
end.
|
config.inc
| Код | {$DEFINE UNKNOWN}
{$IFDEF VER80} {$DEFINE DELPHI} {$ENDIF} {$IFDEF VER90} {$DEFINE DELPHI} {$ENDIF} {$IFDEF VER100} {$DEFINE DELPHI} {$ENDIF} {$IFDEF VER120} {$DEFINE DELPHI} {$ENDIF} {$IFDEF VER130} {$DEFINE DELPHI} {$ENDIF} {$IFDEF VER140} {$DEFINE DELPHI} {$ENDIF} {$IFDEF VER150} {$DEFINE DELPHI} {$ENDIF}
{$IFDEF DELPHI} {$UNDEF UNKNOWN} {$APPTYPE CONSOLE} {$ENDIF}
{$IFDEF FPC} {$UNDEF UNKNOWN} {$MODE DELPHI} {$APPTYPE CONSOLE} {$SMARTLINK ON} {$TYPEINFO ON} {$ENDIF}
|
P.S: код написан на FPC, но компилируется и на дельфи. Очень прошу помочь улучшить работы. Заранее спасибо. |