Skip to content

TMemoryBuffer

Ivan Semenkov edited this page Jan 21, 2021 · 1 revision

Table of contents

About

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

Create

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);
Example
uses
  container.memorybuffer;
  
 var
   buffer : TMemoryBuffer;
  
 begin
   buffer := TMemoryBuffer.Create;
   
   FreeAndNil(buffer);
 end;

Insert

There are several methods to append data to the buffer.

AppendByte

Append a single byte to the buffer.

procedure AppendByte (AData : Byte);
Example
uses
  container.memorybuffer;
  
 var
   buffer : TMemoryBuffer;
  
 begin
   buffer := TMemoryBuffer.Create;
   buffer.AppendByte($0);
   buffer.AppendByte(255);
   
   FreeAndNil(buffer);
 end;

AppendData

Append a data block to the buffer.

procedure AppendData (const AData; ASize : Int64);
Example
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;

GetAppendBuffer

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;
Example
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;

GetWriteBuffer

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;
Example
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;

Remove

The methods to remove data from the buffer.

Clear

Clear the buffer contents.

procedure Clear;
Example
uses
  container.memorybuffer;
  
 var
   buffer : TMemoryBuffer;
  
 begin
   buffer := TMemoryBuffer.Create;
   buffer.Clear;
   
   FreeAndNil(buffer);
 end;

Resize

The methods to resize buffer.

SetBufferDataSize

Sets the length of the data stored in the buffer. Mainly useful for truncating existing data.

procedure SetBufferDataSize (ASizeUsed : Int64);
Example
uses
  container.memorybuffer;
  
 var
   buffer : TMemoryBuffer;
  
 begin
   buffer := TMemoryBuffer.Create(1024);
   buffer.SetBufferDataSize(128);
   
   FreeAndNil(buffer);
 end;

SetBufferAllocSize

Ensures the buffer has at least size bytes available.

procedure SetBufferAllocSize (ASize : Int64);
Example
uses
  container.memorybuffer;
  
 var
   buffer : TMemoryBuffer;
  
 begin
   buffer := TMemoryBuffer.Create;
   buffer.SetBufferAllocSize(1024);
   
   FreeAndNil(buffer);
 end;

Values

To get value for a TMemoryBuffer use GteBufferData function.

GetBufferData

Return a pointer to the data in the buffer.

function GetBufferData : Pointer;
Example
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;

Length

Get buffer size.

GetBufferDataSize

Returns the length of the valid data in the buffer.

function GetBufferDataSize : Int64;
Example
uses
  container.memorybuffer;
  
 var
   buffer : TMemoryBuffer;
  
 begin
   buffer := TMemoryBuffer.Create(1024);
   buffer.SetBufferDataSize(128);
   writeln(buffer.GetBufferDataSize);
   
   FreeAndNil(buffer);
 end;

GetBufferAllocSize

Returns the size of the buffer.

function GetBufferAllocSize : Int64;
Example
uses
  container.memorybuffer;
  
 var
   buffer : TMemoryBuffer;
  
 begin
   buffer := TMemoryBuffer.Create(1024);
   writeln(buffer.GetBufferAllocSize);
   
   FreeAndNil(buffer);
 end;

IsEmpty

Returns true if the buffer contains no data.

function IsEmpty : Boolean;
Example
uses
  container.memorybuffer;
  
 var
   buffer : TMemoryBuffer;
  
 begin
   buffer := TMemoryBuffer.Create(1024);
   if buffer.IsEmpty then
     ;
   
   FreeAndNil(buffer);
 end;