1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
| unit Arrays;
interface
type
PIntArray = ^IntArray;
IntArray = packed array[0..0] of Integer;
TIntArray = object
Items : PIntArray;
Capacity : integer;
Count : integer;
procedure Create(const aSize: integer);
procedure Destroy;
procedure Resize(const aSize: integer);
function Add(const aValue: integer): integer; overload;
procedure Add(const aValues: array of integer); overload;
procedure Delete(const aIndex: integer);
procedure Exchange(const aIndex1, aIndex2: integer); overload;
procedure Exchange(const aIndexs: array of integer); overload;
procedure Fill(const aValue: integer); overload;
procedure Fill(const aRandMin, aRandMax: integer); overload;
procedure Fill(const aFrom, aTo: integer; const aValue: integer); overload;
procedure Insert(const aIndex: integer; const aValue: integer);
procedure WriteOut;
end;
implementation
{ TIntArray }
procedure TIntArray.Fill(const aValue: integer);
var N : integer;
begin
for N := 0 to Count-1 do
Items[N] := aValue;
end;
procedure TIntArray.Fill(const aFrom, aTo: integer; const aValue: integer);
var N : integer;
begin
for N := aFrom to aTo do
Items[N] := aValue;
end;
procedure TIntArray.Fill(const aRandMin, aRandMax: integer);
var N : integer;
begin
for N := 0 to Count-1 do
Items[N] := aRandMin + Random(aRandMax-aRandMin);
end;
procedure TIntArray.Insert(const aIndex: integer; const aValue: integer);
begin
Resize(Count+1);
Move(Items[aIndex], Items[aIndex+1], (Count-aIndex) shl 2);
Items[aIndex] := aValue;
end;
procedure TIntArray.Resize(const aSize: integer);
begin
Capacity := aSize shl 2;
Count := aSize;
ReAllocMem(Items, Capacity);
end;
procedure TIntArray.WriteOut;
var N, H : integer;
begin
H := Count-1;
write('[',Count,'] : (');
for N := 0 to H do
begin
Write(Items[N]);
if N < H then
Write(', ');
end;
writeln(')');
end;
procedure TIntArray.Delete(const aIndex: integer);
begin
Move(Items[aIndex+1], Items[aIndex], (Count-aIndex) shl 2);
Resize(Count-1);
end;
procedure TIntArray.Destroy;
begin
FreeMem(Items, Capacity);
Capacity := 0;
Count := 0;
Items := nil;
end;
procedure TIntArray.Exchange(const aIndexs: array of integer);
var N : integer;
T : integer;
begin
for N := 0 to High(aIndexs)-1 do
begin
T := Items[aIndexs[N]];
Items[aIndexs[N]] := Items[aIndexs[N+1]];
Items[aIndexs[N+1]] := T;
end;
end;
procedure TIntArray.Exchange(const aIndex1, aIndex2: integer);
var T : integer;
begin
T := Items[aIndex1];
Items[aIndex1] := Items[aIndex2];
Items[aIndex2] := T;
end;
function TIntArray.Add(const aValue: integer): integer;
var R : integer;
begin
R := Count;
Resize(R + 1);
Items[R] := aValue;
Add := R;
end;
procedure TIntArray.Add(const aValues: array of integer);
var R, N, H : integer;
begin
R := Count;
H := High(aValues);
Resize(Count + H + 1);
for N := 0 to H do
Items[R+N] := aValues[N];
end;
procedure TIntArray.Create(const aSize: integer);
begin
if Items <> nil then
Destroy;
Capacity := aSize shl 2;
Count := aSize;
Items := AllocMem(Capacity);
end;
end. |
Partager