Original in Russian: http://18delphi.blogspot.ru/2013/07/1.html
About containers. Table of contents
Now we shall allocate the work with the memory to a separate object - Tl3PtrLoc.
The model:
l3MemUtils.pas:
l3PtrLoc.pas:
The source code - https://sourceforge.net/p/rumtmarc/code-0/17/tree/trunk/Blogger/STL.2/
About containers. Table of contents
Now we shall allocate the work with the memory to a separate object - Tl3PtrLoc.
The model:
The code:
unit l3MemUtils; // // The library "L3$Basic Concepts" // Generated from UML model, root element: SimpleClass::Class Shared Delphi Requirements to the low-level libraries::L3$Basic Concepts::MemoryUtils::Tl3MemUtils // interface uses Refcounted ; type Rl3MemUtils = class of Tl3MemUtils; Tl3MemUtils = class(TRefcounted) protected // protected methods class procedure CheckMaxes; virtual; {* The signature of the method CheckMaxes } class procedure StatMemAlloc(aSize: Integer; aL3: Boolean); virtual; public // public methods class procedure ReallocLocalMem(var P; NewSize: Cardinal); {* reallocate the piece of the local memory } class procedure FreeLocalMem(var P); {* free the piece of the local memory } end;//Tl3MemUtils var l3MemU : Rl3MemUtils = Tl3MemUtils; var f_LocalMemUsed : Integer; implementation uses l3MemorySizeUtils ; // start class Tl3MemUtils class procedure Tl3MemUtils.ReallocLocalMem(var P; NewSize: Cardinal); //#UC START# *51DD561502D9_51DD554C0205_var* //#UC END# *51DD561502D9_51DD554C0205_var* begin //#UC START# *51DD561502D9_51DD554C0205_impl* Dec(f_LocalMemUsed, l3MemorySize(Pointer(P))); {$IfDef l3DirectUseSystemMemManager} if (Pointer(P) = nil) then begin l3MemU.StatMemAlloc(NewSize, true); Pointer(P) := SysGetMem(NewSize) end//Pointer(P) = nil else if (NewSize > 0) then begin l3MemU.StatMemAlloc(NewSize, true); Pointer(P) := SysReallocMem(Pointer(P), NewSize); end//NewSize > 0 else begin SysFreeMem(Pointer(P)); Pointer(P) := nil; end;//NewSize > 0 {$Else l3DirectUseSystemMemManager} System.ReallocMem(Pointer(P), NewSize); {$EndIf l3DirectUseSystemMemManager} Inc(f_LocalMemUsed, l3MemorySize(Pointer(P))); l3MemU.CheckMaxes; //#UC END# *51DD561502D9_51DD554C0205_impl* end;//Tl3MemUtils.ReallocLocalMem class procedure Tl3MemUtils.FreeLocalMem(var P); //#UC START# *51DD62110253_51DD554C0205_var* //#UC END# *51DD62110253_51DD554C0205_var* begin //#UC START# *51DD62110253_51DD554C0205_impl* if (Pointer(P) <> nil) then begin Dec(f_LocalMemUsed, l3MemorySize(Pointer(P))); {$IfDef l3DirectUseSystemMemManager} SysFreeMem(Pointer(P)); {$Else l3DirectUseSystemMemManager} System.FreeMem(Pointer(P)); {$EndIf l3DirectUseSystemMemManager} end;//Pointer(P) <> nil Pointer(P) := nil; //#UC END# *51DD62110253_51DD554C0205_impl* end;//Tl3MemUtils.FreeLocalMem class procedure Tl3MemUtils.CheckMaxes; //#UC START# *51DD686A03A3_51DD554C0205_var* //#UC END# *51DD686A03A3_51DD554C0205_var* begin //#UC START# *51DD686A03A3_51DD554C0205_impl* // - for now we do nothing //#UC END# *51DD686A03A3_51DD554C0205_impl* end;//Tl3MemUtils.CheckMaxes class procedure Tl3MemUtils.StatMemAlloc(aSize: Integer; aL3: Boolean); //#UC START# *51DD6DCE00DF_51DD554C0205_var* //#UC END# *51DD6DCE00DF_51DD554C0205_var* begin //#UC START# *51DD6DCE00DF_51DD554C0205_impl* // - or now we do nothing //#UC END# *51DD6DCE00DF_51DD554C0205_impl* end;//Tl3MemUtils.StatMemAlloc end.
l3PtrLoc.pas:
unit l3PtrLoc; // // The library "L3$Basic Concepts" // Generated from UML model, root element: UtilityPack::Class Shared Delphi Requirements to the low-level libraries::L3$Basic Concepts::MemoryUtils::l3PtrLoc // interface uses l3MemorySizeUtils ; type Tl3PtrLoc = {$IfDef XE4}record{$Else}object{$EndIf} private f_AsPointer : PMem; public function Init(aSize: Integer): Boolean; function GetSize: Integer; procedure SetSize(aSize: Integer); procedure Clear; function Read(anOfs: Integer; aBuf: PMem; aBufSize: Integer): Integer; function Write(anOfs: Integer; aBuf: PMem; aBufSize: Integer): Integer; public property AsPointer: PMem read f_AsPointer; end;//Tl3PtrLoc implementation uses l3MemUtils ; // start class Tl3PtrLoc function Tl3PtrLoc.Init(aSize: Integer): Boolean; //#UC START# *51DD5D1903C3_51DD567A01B5_var* //#UC END# *51DD5D1903C3_51DD567A01B5_var* begin //#UC START# *51DD5D1903C3_51DD567A01B5_impl* f_AsPointer := nil; SetSize(aSize); Result := (f_AsPointer <> nil); //#UC END# *51DD5D1903C3_51DD567A01B5_impl* end;//Tl3PtrLoc.Init function Tl3PtrLoc.GetSize: Integer; //#UC START# *51DD5D3800F3_51DD567A01B5_var* //#UC END# *51DD5D3800F3_51DD567A01B5_var* begin //#UC START# *51DD5D3800F3_51DD567A01B5_impl* Result := l3MemorySize(f_AsPointer); //#UC END# *51DD5D3800F3_51DD567A01B5_impl* end;//Tl3PtrLoc.GetSize procedure Tl3PtrLoc.SetSize(aSize: Integer); //#UC START# *51DD5D4F004A_51DD567A01B5_var* //#UC END# *51DD5D4F004A_51DD567A01B5_var* begin //#UC START# *51DD5D4F004A_51DD567A01B5_impl* if (aSize = 0) then l3MemU.FreeLocalMem(f_AsPointer) else if (GetSize < aSize) then begin // - previously it was <> - now I’ve decided to try not to reduce the size of the memory // so that not to produce defragmentation. if (aSize < 10) then l3MemU.ReallocLocalMem(f_AsPointer, aSize) else l3MemU.ReallocLocalMem(f_AsPointer, (aSize + $F) and $FFFFFFF0); end;//GetSize < aSize //#UC END# *51DD5D4F004A_51DD567A01B5_impl* end;//Tl3PtrLoc.SetSize procedure Tl3PtrLoc.Clear; //#UC START# *51DD5D6F0304_51DD567A01B5_var* //#UC END# *51DD5D6F0304_51DD567A01B5_var* begin //#UC START# *51DD5D6F0304_51DD567A01B5_impl* SetSize(0); //#UC END# *51DD5D6F0304_51DD567A01B5_impl* end;//Tl3PtrLoc.Clear function Tl3PtrLoc.Read(anOfs: Integer; aBuf: PMem; aBufSize: Integer): Integer; //#UC START# *51DD5E2203B0_51DD567A01B5_var* //#UC END# *51DD5E2203B0_51DD567A01B5_var* begin //#UC START# *51DD5E2203B0_51DD567A01B5_impl* Result := 0; Assert(false, 'Not implemented yet'); (* Result := Min(GetSize - anOfs, aBufSize); if (Result > 0) then l3Move((P + anOfs)^, aBuf^, Result) else Result := 0;*) //#UC END# *51DD5E2203B0_51DD567A01B5_impl* end;//Tl3PtrLoc.Read function Tl3PtrLoc.Write(anOfs: Integer; aBuf: PMem; aBufSize: Integer): Integer; //#UC START# *51DD5E5F02E1_51DD567A01B5_var* (*var OldSize : Integer; NewSize : Integer;*) //#UC END# *51DD5E5F02E1_51DD567A01B5_var* begin //#UC START# *51DD5E5F02E1_51DD567A01B5_impl* Result := 0; Assert(false, 'Not implemented yet'); (* OldSize := GetSize; NewSize := Ofs + BufSize; if (NewSize > OldSize) then SetSize(NewSize); Result := BufSize; l3Move(Buf^, (P + Ofs)^, Result);*) //#UC END# *51DD5E5F02E1_51DD567A01B5_impl* end;//Tl3PtrLoc.Write end.
The source code - https://sourceforge.net/p/rumtmarc/code-0/17/tree/trunk/Blogger/STL.2/
Комментариев нет:
Отправить комментарий