Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
fpc-src / usr / share / fpcsrc / 3.2.0 / tests / test / tarray12.pp
Size: Mime:
program tarray12;

{$mode objfpc}

uses
  SysUtils;

procedure PrintArray(a: array of LongInt);
var
  i: LongInt;
begin
  Writeln('Length: ', Length(a));
  Write('Data: ');
  for i := Low(a) to High(a) do begin
    if i > Low(a) then
      Write(', ');
    Write(a[i]);
  end;
  Writeln;
end;

procedure CheckArray(aExpected, aGot: array of LongInt);
var
  i: LongInt;
begin
  if Length(aExpected) <> Length(aGot) then
    Halt(1);
  for i := Low(aExpected) to High(aExpected) do begin
    if aExpected[i] <> aGot[i] then
      Halt(2);
  end;
end;

function InitArray(aCount: LongInt): specialize TArray<LongInt>;
var
  i: LongInt;
begin
  SetLength(Result, aCount);
  for i := 0 to aCount - 1 do
    Result[i] := i;
end;

type
  TTest = class(TInterfacedObject, IInterface)
    function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
    function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  end;

var
  gRefCount: LongInt = 0;

function TTest._AddRef: LongInt; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
begin
  Result := inherited _AddRef;
  gRefCount := Result;
end;

function TTest._Release: LongInt; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
begin
  Result := inherited _Release;
  gRefCount := Result;
end;

function GetIntf: IInterface;
begin
  Result := TTest.Create;
end;

procedure TestIntf;

  procedure DoInsert(const aArg1: specialize TArray<IInterface>; var aArg2: specialize TArray<IInterface>);
  begin
    Insert(aArg1, aArg2, 0);
  end;

var
  ai1, ai2: specialize TArray<IInterface>;
  intf: IInterface;
  c: LongInt;
begin
  intf := GetIntf;
  SetLength(ai1, 1);
  c := gRefCount;
  ai1[0] := intf;
  if c >= gRefCount then
    Halt(3);
  intf := Nil;
  if c <> gRefCount then
    Halt(4);
  DoInsert(ai1, ai2);
  if c >= gRefCount then
    Halt(5);
  ai1 := Nil;
  if gRefCount = 0 then
    Halt(6);
  ai2 := Nil;
  if gRefCount <> 0 then
    Halt(7);
end;

var
  t, t2: specialize TArray<LongInt>;
  t3: array[0..2] of LongInt;
begin
  t := Nil;
  Insert([1, 3, 5], t, 0);
  PrintArray(t);
  CheckArray(t, [1, 3, 5]);

  t := Nil;
  t2 := Nil;
  Insert(t2, t, 0);
  PrintArray(t);
  CheckArray(t, []);

  t := Nil;
  Insert([], t, 0);
  PrintArray(t);
  CheckArray(t, []);

  t := InitArray(5);
  Insert([], t, 0);
  PrintArray(t);
  CheckArray(t, [0, 1, 2, 3, 4]);

  t := InitArray(5);
  Insert([1, 3, 5], t, 2);
  PrintArray(t);
  CheckArray(t, [0, 1, 1, 3, 5, 2, 3, 4]);

  t := InitArray(5);
  Insert(5, t, 2);
  PrintArray(t);
  CheckArray(t, [0, 1, 5, 2, 3, 4]);

{  t := InitArray(5);
  Insert([1, 3, 5] + [4, 6], t, 2);
  PrintArray(t);
  CheckArray(t, [0, 1, 1, 3, 5, 4, 6, 2, 3, 4]);}

  t := InitArray(5);
  Insert([1, 3, 5], t, -1);
  PrintArray(t);
  CheckArray(t, [1, 3, 5, 0, 1, 2, 3, 4]);

  t := InitArray(5);
  Insert([1, 3, 5], t, 5);
  PrintArray(t);
  CheckArray(t, [0, 1, 2, 3, 4, 1, 3, 5]);

  t := InitArray(5);
  Insert([1, 3, 5], t, 6);
  PrintArray(t);
  CheckArray(t, [0, 1, 2, 3, 4, 1, 3, 5]);

  t2 := specialize TArray<LongInt>.Create(1, 3, 5);

  t := InitArray(5);
  Insert(t2, t, 1);
  PrintArray(t);
  CheckArray(t, [0, 1, 3, 5, 1, 2, 3, 4]);

  { support for static arrays is not Delphi compatible, but whatever :) }
  t := InitArray(5);
  t3[0] := 2;
  t3[1] := 4;
  t3[2] := 6;
  Insert(t3, t, 2);
  PrintArray(t);
  CheckArray(t, [0, 1, 2, 4, 6, 2, 3, 4]);

  TestIntf;

  Writeln('Ok');
end.