[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]