Files
redAcore/ItemBufferCore.cpp

188 lines
4.2 KiB
C++

/*
* ItemBufferCore.h
*
* Created on: 22 July 2017
* Author: wentzelc
*/
// Standard C/C++ Libraries
#include <stdlib.h>
#include <string.h>
// redA Libraries
#include "ItemBufferCore.h"
//---------------------------------------------------------------------------
//***** Function Prototypes *****//
CItemBuffer::CItemBuffer( bool pCopyEntries )
{
// Parameters
CopyEntries = pCopyEntries;
Count = 0;
// Clear Event list
FirstItem = NULL;
LastItem = &FirstItem;
}
//---------------------------------------------------------------------------
CItemBuffer::~ CItemBuffer()
{
// Free Event List
DeleteAll();
}
//---------------------------------------------------------------------------
TBufferItem * CItemBuffer::CreateItem( void * Entry, int Size )
{
TBufferItem * BufferItem;
// Create structure
if (!(BufferItem = (TBufferItem *)calloc( sizeof(TBufferItem), 1 )))
return NULL;
// Create Entry
BufferItem->Size = Size;
if (CopyEntries) {
// Create copy
if ((BufferItem->Entry = (void *)malloc( sizeof(char)*Size ))) {
// Copy Value
memcpy( BufferItem->Entry, Entry, Size );
}
else {
// Fail
free( BufferItem );
return NULL;
}
}
else {
// Use pointer as is
BufferItem->Entry = Entry;
}
// Return empty structure
return BufferItem;
}
//---------------------------------------------------------------------------
bool CItemBuffer::DestroyItem( TBufferItem ** BufferItem )
{
// Check if valid pointer
if (!BufferItem || !*BufferItem)
return false;
// Destroy pointers
if (CopyEntries && (*BufferItem)->Entry)
DestroyEntry( &((*BufferItem)->Entry) );
// Destroy structure
free( *BufferItem );
*BufferItem = NULL;
return true;
}
//---------------------------------------------------------------------------
bool CItemBuffer::DestroyEntry( void ** Entry )
{
// Verify pointer
if (!Entry || !*Entry)
return false;
// free & clear memory
free( *Entry );
*Entry = NULL;
return true;
}
//---------------------------------------------------------------------------
bool CItemBuffer::Push( void * Entry, int Size )
{
// Verify pointer
if (!Entry || !Size)
return false;
// Try to create an add item to list
if (!(*LastItem = CreateItem( Entry, Size )))
return false;
// Move Next entry reference
LastItem = &((*LastItem)->NextItem);
Count++;
return true;
}
//---------------------------------------------------------------------------
void * CItemBuffer::Pop( int * Size )
{
void * Entry;
// Return entry
if ((Entry = Peek( Size )))
Delete();
return Entry;
}
//---------------------------------------------------------------------------
void * CItemBuffer::Peek( int * Size )
{
void * Entry;
// Check if any events available
if (!FirstItem) {
if (Size) *Size = 0;
return NULL;
}
// Get entry and size
Entry = FirstItem->Entry;
if (Size) *Size = FirstItem->Size;
// return event
return Entry;
}
//---------------------------------------------------------------------------
bool CItemBuffer::Delete( bool Keep )
{
TBufferItem * BufferItem;
// check if buffer empty
if (!FirstItem)
return false;
// Delete event from list
BufferItem = FirstItem;
FirstItem = FirstItem->NextItem;
// Check if last event pointer still correct
if (!FirstItem)
LastItem = &FirstItem;
// Destroy entry and holder
if (CopyEntries && !Keep)
DestroyEntry( &(BufferItem->Entry) );
free( BufferItem );
Count--;
return true;
}
//---------------------------------------------------------------------------
void CItemBuffer::DeleteAll()
{
TBufferItem * NextItem;
while (FirstItem) {
NextItem = FirstItem->NextItem;
DestroyItem( &FirstItem );
FirstItem = NextItem;
}
LastItem = &FirstItem;
Count = 0;
}
//---------------------------------------------------------------------------