-
Notifications
You must be signed in to change notification settings - Fork 10
TMemoryBuffer
A TMemoryBuffer is a useful data structure for storing arbitrary sized blocks of memory. It is guarantees deletion of the memory block when the object is destroyed. This class based on wxWidgets wxMemoryBuffer api interface https://docs.wxwidgets.org/trunk/classwx_memory_buffer.html
uses
container.memorybuffer;
type
PMemoryBuffer = ^TMemoryBuffer;
TMemoryBuffer = class
A new memory buffer can be created by call its constructor. It is also possible to reserve memory for items by the first argument.
constructor Create (ASize : Int64 = 1024);
uses
container.memorybuffer;
var
buffer : TMemoryBuffer;
begin
buffer := TMemoryBuffer.Create;
FreeAndNil(buffer);
end;
There are several methods to append data to the buffer.
Append a single byte to the buffer.
procedure AppendByte (AData : Byte);
uses
container.memorybuffer;
var
buffer : TMemoryBuffer;
begin
buffer := TMemoryBuffer.Create;
buffer.AppendByte($0);
buffer.AppendByte(255);
FreeAndNil(buffer);
end;
Append a data block to the buffer.
procedure AppendData (const AData; ASize : Int64);
uses
container.memorybuffer;
var
buffer : TMemoryBuffer;
data : array [0 .. 10] of Integer;
begin
buffer := TMemoryBuffer.Create;
buffer.AppendData(data, sizeof(Integer) * 10);
FreeAndNil(buffer);
end;
Ensure that the buffer is big enough and return a pointer to the start of the empty space in the buffer. This pointer can be used to directly write data into the buffer, this new data will be appended to the existing data.
function GetAppendBuffer (ASizeNeeded : Int64) : Pointer;
uses
container.memorybuffer;
var
buffer : TMemoryBuffer;
data : array [0 .. 10] of Integer;
begin
buffer := TMemoryBuffer.Create;
Move(data, buffer.GetAppendBuffer(data, sizeof(Integer) * 10), sizeof(Integer) * 10);
FreeAndNil(buffer);
end;
Ensure the buffer is big enough and return a pointer to the buffer which can be used to directly write into the buffer up to sizeNeeded bytes.
function GetWriteBuffer (ASizeNeeded : Int64) : Pointer;
uses
container.memorybuffer;
var
buffer : TMemoryBuffer;
data : array [0 .. 10] of Integer;
begin
buffer := TMemoryBuffer.Create;
Move(data, buffer.GetWriteBuffer(data, sizeof(Integer) * 10), sizeof(Integer) * 10);
FreeAndNil(buffer);
end;
The methods to remove data from the buffer.
Clear the buffer contents.
procedure Clear;
uses
container.memorybuffer;
var
buffer : TMemoryBuffer;
begin
buffer := TMemoryBuffer.Create;
buffer.Clear;
FreeAndNil(buffer);
end;
The methods to resize buffer.
Sets the length of the data stored in the buffer. Mainly useful for truncating existing data.
procedure SetBufferDataSize (ASizeUsed : Int64);
uses
container.memorybuffer;
var
buffer : TMemoryBuffer;
begin
buffer := TMemoryBuffer.Create(1024);
buffer.SetBufferDataSize(128);
FreeAndNil(buffer);
end;
Ensures the buffer has at least size bytes available.
procedure SetBufferAllocSize (ASize : Int64);
uses
container.memorybuffer;
var
buffer : TMemoryBuffer;
begin
buffer := TMemoryBuffer.Create;
buffer.SetBufferAllocSize(1024);
FreeAndNil(buffer);
end;
To get value for a TMemoryBuffer use GteBufferData function.
Return a pointer to the data in the buffer.
function GetBufferData : Pointer;
uses
container.memorybuffer;
var
buffer : TMemoryBuffer;
data : array [0 .. 10] of Integer;
begin
buffer := TMemoryBuffer.Create(1024);
buffer.SetBufferDataSize(sizeof(Integer) * 10);
Move(buffer.GetBufferData^, data, sizeof(Integer) * 10);
FreeAndNil(buffer);
end;
Get buffer size.
Returns the length of the valid data in the buffer.
function GetBufferDataSize : Int64;
uses
container.memorybuffer;
var
buffer : TMemoryBuffer;
begin
buffer := TMemoryBuffer.Create(1024);
buffer.SetBufferDataSize(128);
writeln(buffer.GetBufferDataSize);
FreeAndNil(buffer);
end;
Returns the size of the buffer.
function GetBufferAllocSize : Int64;
uses
container.memorybuffer;
var
buffer : TMemoryBuffer;
begin
buffer := TMemoryBuffer.Create(1024);
writeln(buffer.GetBufferAllocSize);
FreeAndNil(buffer);
end;
Returns true if the buffer contains no data.
function IsEmpty : Boolean;
uses
container.memorybuffer;
var
buffer : TMemoryBuffer;
begin
buffer := TMemoryBuffer.Create(1024);
if buffer.IsEmpty then
;
FreeAndNil(buffer);
end;