tarray22.pp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. { %OPT = -gh }
  2. program tarray22;
  3. {$mode objfpc}{$h+}
  4. type
  5. TIntegerArray = array of Integer;
  6. TStringArray = array of String;
  7. generic procedure CheckArray<T>(const Actual, Expected: array of T; Code: LongInt);
  8. var
  9. i: SizeInt;
  10. begin
  11. if Length(Actual) <> Length(Expected) then
  12. Halt(Code);
  13. for i := 0 to High(Actual) do
  14. if Actual[i] <> Expected[i] then
  15. Halt(Code);
  16. end;
  17. procedure TestOpen(const A: array of Integer; Exp: array of Integer; Code: LongInt);
  18. var
  19. B: array of Integer;
  20. begin
  21. B := Copy(A);
  22. specialize CheckArray<Integer>(B, Exp, Code);
  23. end;
  24. procedure TestOpen2(const A: array of Integer; Exp: array of Integer; Code: LongInt);
  25. var
  26. B: array of Integer;
  27. begin
  28. B := Copy(A, 1, 2);
  29. specialize CheckArray<Integer>(B, Exp, Code);
  30. end;
  31. procedure TestDyn(const A: TIntegerArray; Exp: array of Integer; Code: LongInt);
  32. var
  33. B: array of Integer;
  34. begin
  35. B := Copy(A);
  36. specialize CheckArray<Integer>(B, Exp, Code);
  37. end;
  38. procedure TestDyn2(const A: TIntegerArray; Exp: array of Integer; Code: LongInt);
  39. var
  40. B: array of Integer;
  41. begin
  42. B := Copy(A, 1, 2);
  43. specialize CheckArray<Integer>(B, Exp, Code);
  44. end;
  45. procedure TestOpen(const A: array of String; Exp: array of String; Code: LongInt);
  46. var
  47. B: array of String;
  48. begin
  49. B := Copy(A);
  50. specialize CheckArray<String>(B, Exp, Code);
  51. end;
  52. procedure TestOpen2(const A: array of String; Exp: array of String; Code: LongInt);
  53. var
  54. B: array of String;
  55. begin
  56. B := Copy(A, 1, 2);
  57. specialize CheckArray<String>(B, Exp, Code);
  58. end;
  59. procedure TestDyn(const A: TStringArray; Exp: array of String; Code: LongInt);
  60. var
  61. B: array of String;
  62. begin
  63. B := Copy(A);
  64. specialize CheckArray<String>(B, Exp, Code);
  65. end;
  66. procedure TestDyn2(const A: TStringArray; Exp: array of String; Code: LongInt);
  67. var
  68. B: array of String;
  69. begin
  70. B := Copy(A, 1, 2);
  71. specialize CheckArray<String>(B, Exp, Code);
  72. end;
  73. begin
  74. HaltOnNotReleased := True;
  75. TestOpen([0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], 1);
  76. TestOpen2([0, 1, 2, 3, 4, 5], [1, 2], 2);
  77. TestDyn([0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], 3);
  78. TestDyn2([0, 1, 2, 3, 4, 5], [1, 2], 4);
  79. TestOpen(['Alpha', 'Beta', 'Gamma', 'Delta'], ['Alpha', 'Beta', 'Gamma', 'Delta'], 5);
  80. TestOpen2(['Alpha', 'Beta', 'Gamma', 'Delta'], ['Beta', 'Gamma'], 6);
  81. TestDyn(['Alpha', 'Beta', 'Gamma', 'Delta'], ['Alpha', 'Beta', 'Gamma', 'Delta'], 7);
  82. TestDyn2(['Alpha', 'Beta', 'Gamma', 'Delta'], ['Beta', 'Gamma'], 8);
  83. end.