1
unit LUX.Data.Lattice.T2;
3
interface //#################################################################### ■
7
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
9
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
11
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
13
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TArray2D<_TItem_>
16
['{E4ECF85C-317F-4179-BDAE-C4495D2B2CC7}']
19
function GetItemByte :Integer;
20
function GetElemsP0 :Pointer;
21
function GetElemsX :Integer;
22
function GetElemsY :Integer;
23
function GetElemsN :Integer;
24
function GetElemsByte :Integer;
25
function GetItemsX :Integer;
26
procedure SetItemsX( const ItemsX_:Integer );
27
function GetItemsY :Integer;
28
procedure SetItemsY( const ItemsY_:Integer );
29
function GetMargsX :Integer;
30
procedure SetMargsX( const MargsX_:Integer );
31
function GetMargsY :Integer;
32
procedure SetMargsY( const MargsY_:Integer );
35
property ItemByte :Integer read GetItemByte ;
36
property ElemsP0 :Pointer read GetElemsP0 ;
37
property ElemsX :Integer read GetElemsX ;
38
property ElemsY :Integer read GetElemsY ;
39
property ElemsN :Integer read GetElemsN ;
40
property ElemsByte :Integer read GetElemsByte ;
41
property ItemsX :Integer read GetItemsX write SetItemsX;
42
property ItemsY :Integer read GetItemsY write SetItemsY;
43
property MargsX :Integer read GetMargsX write SetMargsX;
44
property MargsY :Integer read GetMargsY write SetMargsY;
47
//-------------------------------------------------------------------------
49
TArray2D<_TItem_> = class( TInterfacedBase, IArray2D )
55
function XYtoI( const X_,Y_:Integer ) :Integer; inline;
57
_Elems :TArray<_TItem_>;
65
function GetItemByte :Integer;
66
function GetElemsP0 :Pointer;
67
function GetElemsX :Integer;
68
function GetElemsY :Integer;
69
function GetElemsN :Integer;
70
function GetElemsByte :Integer;
71
function GetItems( const X_,Y_:Integer ) :_TItem_;
72
procedure SetItems( const X_,Y_:Integer; const Item_:_TItem_ );
73
function GetItemP( const X_,Y_:Integer ) :_PItem_;
74
function GetItemsX :Integer;
75
procedure SetItemsX( const ItemsX_:Integer );
76
function GetItemsY :Integer;
77
procedure SetItemsY( const ItemsY_:Integer );
78
function GetMargsX :Integer;
79
procedure SetMargsX( const MargsX_:Integer );
80
function GetMargsY :Integer;
81
procedure SetMargsY( const MargsY_:Integer );
83
constructor Create; overload;
84
constructor Create( const ItemsX_,ItemsY_:Integer ); overload;
85
constructor Create( const ItemsX_,ItemsY_,Margs_:Integer ); overload;
86
constructor Create( const ItemsX_,ItemsY_,MargsX_,MargsY_:Integer ); overload; virtual;
87
procedure AfterConstruction; override;
88
destructor Destroy; override;
90
property ItemByte :Integer read GetItemByte ;
91
property ElemsP0 :Pointer read GetElemsP0 ;
92
property ElemsX :Integer read GetElemsX ;
93
property ElemsY :Integer read GetElemsY ;
94
property ElemsN :Integer read GetElemsN ;
95
property ElemsByte :Integer read GetElemsByte ;
96
property Items[ const X_,Y_:Integer ] :_TItem_ read GetItems write SetItems ; default;
97
property ItemP[ const X_,Y_:Integer ] :_PItem_ read GetItemP ;
98
property ItemsX :Integer read GetItemsX write SetItemsX;
99
property ItemsY :Integer read GetItemsY write SetItemsY;
100
property MargsX :Integer read GetMargsX write SetMargsX;
101
property MargsY :Integer read GetMargsY write SetMargsY;
103
class procedure Swap( var Array0_,Array1_:TArray2D<_TItem_> ); static;
104
procedure MakeEdgeLoop;
107
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TBricArray2D<_TItem_>
109
IBricArray2D = interface( IArray2D )
110
['{F942004C-5B06-4744-9E7C-7E5FCB6258A5}']
112
function GetGridsX :Integer;
113
procedure SetGridsX( const GridX_:Integer );
114
function GetGridsY :Integer;
115
procedure SetGridsY( const GridY_:Integer );
117
property BricsX :Integer read GetItemsX write SetItemsX;
118
property BricsY :Integer read GetItemsY write SetItemsY;
119
property GridsX :Integer read GetGridsX write SetGridsX;
120
property GridsY :Integer read GetGridsY write SetGridsY;
123
//-------------------------------------------------------------------------
125
TBricArray2D<_TItem_> = class( TArray2D<_TItem_>, IBricArray2D )
129
function GetGridsX :Integer;
130
procedure SetGridsX( const GridsX_:Integer );
131
function GetGridsY :Integer;
132
procedure SetGridsY( const GridsY_:Integer );
135
property Brics[ const X_,Y_:Integer ] :_TItem_ read GetItems write SetItems ; default;
136
property BricsX :Integer read GetItemsX write SetItemsX;
137
property BricsY :Integer read GetItemsY write SetItemsY;
138
property GridsX :Integer read GetGridsX write SetGridsX;
139
property GridsY :Integer read GetGridsY write SetGridsY;
142
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGridArray2D<_TItem_>
144
IGridArray2D = interface( IArray2D )
145
['{7E34AB1F-480A-4CCF-9719-7938AA1015A9}']
147
function GetBricsX :Integer;
148
procedure SetBricsX( const BricsX_:Integer );
149
function GetBricsY :Integer;
150
procedure SetBricsY( const BricsY_:Integer );
152
property GridsX :Integer read GetItemsX write SetItemsX;
153
property GridsY :Integer read GetItemsY write SetItemsY;
154
property BricsX :Integer read GetBricsX write SetBricsX;
155
property BricsY :Integer read GetBricsY write SetBricsY;
158
//-------------------------------------------------------------------------
160
TGridArray2D<_TItem_> = class( TArray2D<_TItem_>, IGridArray2D )
164
function GetBricsX :Integer;
165
procedure SetBricsX( const BricsX_:Integer );
166
function GetBricsY :Integer;
167
procedure SetBricsY( const BricsY_:Integer );
169
constructor Create( const BricsX_,BricsY_,MargsX_,MargsY_:Integer ); override;
170
destructor Destroy; override;
172
property Grids[ const X_,Y_:Integer ] :_TItem_ read GetItems write SetItems ; default;
173
property GridsX :Integer read GetItemsX write SetItemsX;
174
property GridsY :Integer read GetItemsY write SetItemsY;
175
property BricsX :Integer read GetBricsX write SetBricsX;
176
property BricsY :Integer read GetBricsY write SetBricsY;
179
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
181
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
183
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
185
implementation //############################################################### ■
187
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
189
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
191
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TArray2D<_TItem_>
193
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
195
/////////////////////////////////////////////////////////////////////// メソッド
197
procedure TArray2D<_TItem_>.MakeArray;
199
_ElemsX := _MargsX + _ItemsX + _MargsX;
200
_ElemsY := _MargsY + _ItemsY + _MargsY;
202
SetLength( _Elems, ElemsN );
205
function TArray2D<_TItem_>.XYtoI( const X_,Y_:Integer ) :Integer;
207
Result := _ElemsX * ( _MargsY + Y_ ) + ( _MargsX + X_ );
210
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
212
/////////////////////////////////////////////////////////////////////// アクセス
214
function TArray2D<_TItem_>.GetItemByte :Integer;
216
Result := SizeOf( _TItem_ );
219
//------------------------------------------------------------------------------
221
function TArray2D<_TItem_>.GetElemsP0 :Pointer;
223
Result := @_Elems[ 0 ];
226
//------------------------------------------------------------------------------
228
function TArray2D<_TItem_>.GetElemsX :Integer;
233
function TArray2D<_TItem_>.GetElemsY :Integer;
238
function TArray2D<_TItem_>.GetElemsN :Integer;
240
Result := _ElemsY * _ElemsX;
243
function TArray2D<_TItem_>.GetElemsByte :Integer;
245
Result := ItemByte * ElemsN;
248
//------------------------------------------------------------------------------
250
function TArray2D<_TItem_>.GetItems( const X_,Y_:Integer ) :_TItem_;
252
Result := _Elems[ XYtoI( X_, Y_ ) ];
255
procedure TArray2D<_TItem_>.SetItems( const X_,Y_:Integer; const Item_:_TItem_ );
257
_Elems[ XYtoI( X_, Y_ ) ] := Item_;
260
function TArray2D<_TItem_>.GetItemP( const X_,Y_:Integer ) :_PItem_;
262
Result := @_Elems[ XYtoI( X_, Y_ ) ];
265
//------------------------------------------------------------------------------
267
function TArray2D<_TItem_>.GetItemsX :Integer;
272
procedure TArray2D<_TItem_>.SetItemsX( const ItemsX_:Integer );
274
_ItemsX := ItemsX_; MakeArray;
277
function TArray2D<_TItem_>.GetItemsY :Integer;
282
procedure TArray2D<_TItem_>.SetItemsY( const ItemsY_:Integer );
284
_ItemsY := ItemsY_; MakeArray;
287
function TArray2D<_TItem_>.GetMargsX :Integer;
292
procedure TArray2D<_TItem_>.SetMargsX( const MargsX_:Integer );
294
_MargsX := MargsX_; MakeArray;
297
function TArray2D<_TItem_>.GetMargsY :Integer;
302
procedure TArray2D<_TItem_>.SetMargsY( const MargsY_:Integer );
304
_MargsY := MargsY_; MakeArray;
307
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
309
constructor TArray2D<_TItem_>.Create;
314
constructor TArray2D<_TItem_>.Create( const ItemsX_,ItemsY_:Integer );
316
Create( ItemsX_, ItemsY_, 0 );
319
constructor TArray2D<_TItem_>.Create( const ItemsX_,ItemsY_,Margs_:Integer );
321
Create( ItemsX_, ItemsY_, Margs_, Margs_ );
324
constructor TArray2D<_TItem_>.Create( const ItemsX_,ItemsY_,MargsX_,MargsY_:Integer );
334
procedure TArray2D<_TItem_>.AfterConstruction;
339
destructor TArray2D<_TItem_>.Destroy;
345
/////////////////////////////////////////////////////////////////////// メソッド
347
class procedure TArray2D<_TItem_>.Swap( var Array0_,Array1_:TArray2D<_TItem_> );
349
A :TArray2D<_TItem_>;
351
A := Array0_; Array0_ := Array1_; Array1_ := A;
354
procedure TArray2D<_TItem_>.MakeEdgeLoop;
356
EX, EY, MX, MY :Integer;
358
for EY := -_MargsY to -1 do
362
for EX := -_MargsX to -1 do Items[ EX, EY ] := Items[ EX + _ItemsX, MY ];
363
for EX := 0 to _ItemsX -1 do Items[ EX, EY ] := Items[ EX , MY ];
364
for EX := _ItemsX to _ItemsX+_MargsX-1 do Items[ EX, EY ] := Items[ EX - _ItemsX, MY ];
367
for EY := 0 to _ItemsY-1 do
369
for EX := -_MargsX to -1 do Items[ EX, EY ] := Items[ EX + _ItemsX, EY ];
371
for EX := _ItemsX to _ItemsX+_MargsX-1 do Items[ EX, EY ] := Items[ EX - _ItemsX, EY ];
374
for EY := _ItemsY to _ItemsY+_MargsY-1 do
378
for EX := -_MargsX to -1 do Items[ EX, EY ] := Items[ EX + _ItemsX, MY ];
379
for EX := 0 to _ItemsX -1 do Items[ EX, EY ] := Items[ EX , MY ];
380
for EX := _ItemsX to _ItemsX+_MargsX-1 do Items[ EX, EY ] := Items[ EX - _ItemsX, MY ];
384
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TBricArray2D<_TItem_>
386
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
388
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
390
/////////////////////////////////////////////////////////////////////// アクセス
392
function TBricArray2D<_TItem_>.GetGridsX :Integer;
394
Result := BricsX + 1;
397
procedure TBricArray2D<_TItem_>.SetGridsX( const GridsX_:Integer );
399
BricsX := GridsX_ - 1;
402
function TBricArray2D<_TItem_>.GetGridsY :Integer;
404
Result := BricsY + 1;
407
procedure TBricArray2D<_TItem_>.SetGridsY( const GridsY_:Integer );
409
BricsY := GridsY_ - 1;
412
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
414
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGridArray2D<_TItem_>
416
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
418
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
420
/////////////////////////////////////////////////////////////////////// アクセス
422
function TGridArray2D<_TItem_>.GetBricsX :Integer;
424
Result := _ItemsX - 1;
427
procedure TGridArray2D<_TItem_>.SetBricsX( const BricsX_:Integer );
429
_ItemsX := BricsX_ + 1; MakeArray;
432
function TGridArray2D<_TItem_>.GetBricsY :Integer;
434
Result := _ItemsY - 1;
437
procedure TGridArray2D<_TItem_>.SetBricsY( const BricsY_:Integer );
439
_ItemsY := BricsY_ + 1; MakeArray;
442
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
444
constructor TGridArray2D<_TItem_>.Create( const BricsX_,BricsY_,MargsX_,MargsY_:Integer );
446
inherited Create( BricsX_+1, BricsY_+1,
451
destructor TGridArray2D<_TItem_>.Destroy;
457
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
459
//############################################################################## □
461
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
463
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
465
end. //######################################################################### ■