[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]
unit BigStuff;
interface
uses
Objects,
WinAPI;
type
PBigData = ^TBigData;
TBigData = object(TObject)
NumRecs: Longint;
RecSize: Word;
Start: Word;
constructor Init(ANumRecs: Longint; ARecSize: Word);
destructor Done; virtual;
procedure GetSetData(Index: Longint; var Data; SetData: Boolean);
virtual;
end;
implementation
constructor TBigData.Init(ANumRecs: Longint; ARecSize: Word);
begin
TObject.Init;
NumRecs := ANumRecs;
RecSize := ARecSize;
while 65536 mod RecSize <> 0 do Inc(RecSize);
Start := GlobalAlloc(gmem_Moveable, RecSize * NumRecs);
if Start = 0 then
Runerror(201);
end;
destructor TBigData.Done;
begin
TObject.Done;
GlobalFree(Start);
end;
procedure TBigData.GetSetData(Index: Longint; var Data; SetData: Boolean);
var
Selector, Offset: Word;
P: Pointer;
begin
if Index >= NumRecs then
begin
RunError(201);
end;
Index := Index * RecSize;
Selector := (Index div 65536) * SelectorInc + Start;
OffSet := Index mod 65536;
P := GlobalLock(Selector);
P := Ptr(Selector, Offset);
if SetData then
Move(Data, P^, RecSize)
else
Move(P^, Data, RecSize);
GlobalUnlock(Selector);
end;
type
PBigInt = ^TBigInt;
TBigInt = object(TBigData)
constructor Init(ANumRecs: Longint);
procedure PutItem(Index: Longint; Value: Integer);
function GetItem(Index: Longint): Integer;
end;
constructor TBigInt.Init(ANumRecs: Longint);
begin
TBigData.Init(ANumRecs, SizeOf(Integer));
end;
procedure TBigInt.PutItem(Index: Longint; Value: Integer);
begin
TBigData.GetSetData(Index, Value, True);
end;
function TBigInt.GetItem(Index: Longint): Integer;
var
Value: Integer;
begin
TBigData.GetSetData(Index, Value, False);
GetItem := Value;
end;
var
BI: TBigInt;
begin
BI.Init(200000);
BI.PutItem(100000, 777);
Writeln(BI.GetItem(100000));
BI.Done;
end.
[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]