A fast implementation of KBaseArray.
It removes barriers which may prevent compiler generating optimized code.
Definition at line 490 of file karrayul.h.
#include <karrayul.h>
Classes |
|
struct | KHeader |
Public Member Functions |
|
int | GetCount () const |
Get number of pointers in the array.
|
|
void | Clear () |
Remove all pointers without deleting the
associated objects. |
|
void | Empty () |
Fast empty, set object count to zero but
don't free any memory. |
|
int | Reserve (int pCapacity) |
Set array capacity to contain at least the
specified number of elements without reallocating. |
|
void | SetCount (int pCount) |
Set arrayCount to specified number of
elements. The array capacity is adjusted accordingly. |
|
void | Resize (int pItemCount) |
void | AddMultiple (int pItemCount) |
Protected Member Functions |
|
KBaseArrayFast () | |
Constructor. |
|
~KBaseArrayFast () | |
Destructor. |
|
int | InsertAt (int pIndex, void *pItem) |
Insert an item at the given position.
|
|
void * | GetAt (int pIndex) |
Get the item at the given position. |
|
void | RemoveAt (int pIndex) |
Removes the item at the given position.
|
|
bool | ValidateIndex (int pIndex) const |
Check that the given position is inside the
array boundaries. |
|
KHeader *const | GetHeader () const |
KHeader * | GetHeader () |
int | GetHeaderOffset () const |
int | GetArrayCount () const |
void | SetArrayCount (int pArrayCount) |
int | GetBlockCount () const |
void | SetBlockCount (int pArrayCount) |
Protected Attributes |
|
int | mArrayCount |
char * | mBaseArray |
KBaseArrayFast | ( | ) | [inline, protected] |
~KBaseArrayFast | ( | ) | [inline, protected] |
int GetCount | ( | ) | const [inline] |
Get number of pointers in the array.
Definition at line 496 of file karrayul.h.
{ return GetArrayCount(); }
void Clear | ( | ) | [inline] |
Remove all pointers without deleting the associated objects.
Definition at line 499 of file karrayul.h.
{ if (mBaseArray!=NULL) { KBaseArrayFree(mBaseArray); mArrayCount = 0; mBaseArray = NULL; } }
void Empty | ( | ) | [inline] |
Fast empty, set object count to zero but don't free any memory.
Definition at line 511 of file karrayul.h.
{ #ifdef KFBX_PRIVATE #ifdef _DEBUG memset( mBaseArray+ GetHeaderOffset() ,0,GetArrayCount()*TypeSize); #endif #endif SetArrayCount(0); }
int Reserve | ( | int | pCapacity | ) | [inline] |
Set array capacity to contain at least the specified number of elements without reallocating.
pCapacity | Number of items that can be stored in the array before reallocating the memory. |
Definition at line 527 of file karrayul.h.
{ #ifdef KFBX_PRIVATE K_ASSERT( pCapacity > 0 ); #endif if( pCapacity ) { const kUInt lTempNewBlockCount = ( (kUInt) (pCapacity + KFBX_ARRAYUL_BLOCKSIZE - 1 ) / KFBX_ARRAYUL_BLOCKSIZE ); const kUInt lNewBlockCount = (lTempNewBlockCount > 1 ? lTempNewBlockCount : 1); int lArrayCount = GetArrayCount(); int lBlockCount = GetBlockCount(); const kUInt lOldArraySize = lArrayCount*TypeSize; const kUInt lNewArraySize = lNewBlockCount*KFBX_ARRAYUL_BLOCKSIZE*TypeSize; if (lNewBlockCount != (kUInt) lBlockCount) { char* lBaseArray = KBaseArrayRealloc(mBaseArray, (size_t) lNewArraySize+ GetHeaderOffset() ); if (!lBaseArray) return GetBlockCount()*KFBX_ARRAYUL_BLOCKSIZE; mBaseArray = lBaseArray; } if( lNewBlockCount > (kUInt) lBlockCount ) { memset( ((char*)mBaseArray+ GetHeaderOffset() ) + lOldArraySize, 0, (size_t) (lNewArraySize-lOldArraySize) ); SetArrayCount(lArrayCount); } else if (pCapacity < lArrayCount) { memset( ((char*)mBaseArray+ GetHeaderOffset() ) + pCapacity*TypeSize, 0, (size_t) (lNewArraySize-pCapacity*TypeSize) ); SetArrayCount(pCapacity); } SetBlockCount(lNewBlockCount); } return GetBlockCount()*KFBX_ARRAYUL_BLOCKSIZE; }
void SetCount | ( | int | pCount | ) | [inline] |
Set arrayCount to specified number of elements. The array capacity is adjusted accordingly.
Force the array of elements to a given size.
Definition at line 576 of file karrayul.h.
{ #ifdef KFBX_PRIVATE #ifdef _DEBUG if (pCount<0) { K_ASSERT_MSG_NOW (_T("ArrayUL : Item count can't be negative")); return ; } #endif #endif int lArrayCount = GetArrayCount(); if (pCount > lArrayCount) { AddMultiple( pCount-lArrayCount); } else { SetArrayCount(pCount); } }
void Resize | ( | int | pItemCount | ) | [inline] |
Definition at line 597 of file karrayul.h.
{ #ifdef KFBX_PRIVATE K_ASSERT( pItemCount >= 0 ); #endif const kUInt lTempNewBlockCount = ( (kUInt) (pItemCount + KFBX_ARRAYUL_BLOCKSIZE - 1 ) / KFBX_ARRAYUL_BLOCKSIZE ); const kUInt lNewBlockCount = (lTempNewBlockCount > 1 ? lTempNewBlockCount : 1); int lArrayCount = GetArrayCount(); int lBlockCount = GetBlockCount(); const kUInt lOldArraySize = lArrayCount*TypeSize; const kUInt lNewArraySize = lNewBlockCount*KFBX_ARRAYUL_BLOCKSIZE*TypeSize; if (lNewBlockCount != (kUInt) lBlockCount) { char* lBaseArray = KBaseArrayRealloc(mBaseArray, (size_t) lNewArraySize+ GetHeaderOffset() ); if (!lBaseArray) return; mBaseArray = lBaseArray; } if( lNewBlockCount > (kUInt) lBlockCount ) memset( ((char*)mBaseArray+ GetHeaderOffset() ) + lOldArraySize, 0, (size_t) (lNewArraySize-lOldArraySize) ); else if (pItemCount < lArrayCount) memset( ((char*)mBaseArray+ GetHeaderOffset() ) + pItemCount*TypeSize, 0, (size_t) (lNewArraySize-pItemCount*TypeSize) ); SetBlockCount(lNewBlockCount); SetArrayCount(pItemCount); }
void AddMultiple | ( | int | pItemCount | ) | [inline] |
Definition at line 629 of file karrayul.h.
{ #ifdef KFBX_PRIVATE K_ASSERT( pItemCount > 0 ); #endif if( pItemCount ) { int lArrayCount = GetArrayCount(); int lBlockCount = GetBlockCount(); const kUInt lTempNewBlockCount = ( (kUInt) (lArrayCount+pItemCount + KFBX_ARRAYUL_BLOCKSIZE - 1 ) / KFBX_ARRAYUL_BLOCKSIZE ); const kUInt lNewBlockCount = (lTempNewBlockCount > 1 ? lTempNewBlockCount : 1); const kUInt lOldArraySize = lArrayCount*TypeSize; const kUInt lNewArraySize = lNewBlockCount*KFBX_ARRAYUL_BLOCKSIZE*TypeSize; #ifdef KFBX_PRIVATE K_ASSERT( lOldArraySize < lNewArraySize ); #endif if( lNewBlockCount > (kUInt) lBlockCount ) { char* lBaseArray = KBaseArrayRealloc(mBaseArray, (size_t) lNewArraySize+ GetHeaderOffset() ); if (!lBaseArray) return; mBaseArray = lBaseArray; lBlockCount = lNewBlockCount; } memset( ((char*)mBaseArray+ GetHeaderOffset() ) + lOldArraySize, 0, (size_t) (lNewArraySize-lOldArraySize) ); SetArrayCount ( lArrayCount + pItemCount ); SetBlockCount (lBlockCount); } }
int InsertAt | ( | int | pIndex, |
void * | pItem | ||
) | [inline, protected] |
Insert an item at the given position.
pIndex | Position where to insert the item. |
pItem | Pointer to the item to be inserted. |
Reimplemented in KArrayTemplate< void * >.
Definition at line 701 of file karrayul.h.
{ int lArrayCount = GetArrayCount(); int lBlockCount = GetBlockCount(); #ifdef KFBX_PRIVATE K_ASSERT( pIndex >= 0 ); #endif if (pIndex>lArrayCount) { pIndex = GetArrayCount(); } if (lArrayCount>= lBlockCount*KFBX_ARRAYUL_BLOCKSIZE) { // must Alloc.Realloc some new space // double the number of blocks. lBlockCount = ( 0 == lBlockCount ) ? 1 : lBlockCount * 2; char* lBaseArray = KBaseArrayRealloc(mBaseArray, (size_t) (lBlockCount*KFBX_ARRAYUL_BLOCKSIZE*TypeSize) + GetHeaderOffset() ); if(!lBaseArray) return -1; mBaseArray = lBaseArray; } if (pIndex<lArrayCount) { // This is an insert memmove (&(mBaseArray[(pIndex+1)*TypeSize+ GetHeaderOffset() ]), &(mBaseArray[(pIndex)*TypeSize+ GetHeaderOffset()] ), TypeSize*(lArrayCount-pIndex)); } memmove (&(mBaseArray[(pIndex)*TypeSize+ GetHeaderOffset() ]), pItem, TypeSize); SetArrayCount(lArrayCount+1); SetBlockCount(lBlockCount); return pIndex; }
void* GetAt | ( | int | pIndex | ) | [inline, protected] |
Get the item at the given position.
pIndex | The position of the item to access. |
Definition at line 747 of file karrayul.h.
{ return &(mBaseArray[(pIndex)*TypeSize+ GetHeaderOffset() ]); }
void RemoveAt | ( | int | pIndex | ) | [inline, protected] |
Removes the item at the given position.
pIndex | The position of the item to remove. |
Reimplemented in KArrayTemplate< Type >, KArrayTemplate< kReference >, KArrayTemplate< HKFCurveNode >, KArrayTemplate< KFbxNode * >, KArrayTemplate< KArrayTemplate< KElement > * >, KArrayTemplate< KFbxLayerElement * >, KArrayTemplate< double >, KArrayTemplate< AccumulatorEntry * >, KArrayTemplate< KFbxProperty >, KArrayTemplate< KFbxReference * >, KArrayTemplate< KFbxPoseInfo * >, KArrayTemplate< int >, KArrayTemplate< KFbxDataType >, KArrayTemplate< ReaderPluginEntry * >, KArrayTemplate< AESequence * >, KArrayTemplate< InputData >, KArrayTemplate< KFbxPolygon >, KArrayTemplate< WriterPluginEntry * >, KArrayTemplate< KFbxObject * >, KArrayTemplate< KFbxLocalizationManager * >, KArrayTemplate< KStringListItem * >, KArrayTemplate< KFbxVector4 >, KArrayTemplate< KFbxScene * >, KArrayTemplate< void * >, KArrayTemplate< KFbxLayer * >, KArrayTemplate< Type * >, KArrayTemplate< KFbxMesh * >, KArrayTemplate< KArrayTemplate< int > * >, KArrayTemplate< NameCell * >, KArrayTemplate< KFbxTakeInfo * >, KArrayTemplate< KFbxDocument * >, KArrayTemplate< KFbxCluster * >, KArrayTemplate< KFbxTexture * >, KArrayTemplate< KFbxSurfaceMaterial * >, KArrayTemplate< KXRefManagerProject * >, KArrayTemplate< KString * >, and KArrayTemplate< KLayerInfo * >.
Definition at line 755 of file karrayul.h.
{ #if defined(_DEBUG) && !defined(KARCH_ENV_MACOSX) if (!ValidateIndex( pIndex )) { return; } #endif int lArrayCount = GetArrayCount(); if (pIndex+1<lArrayCount) { memmove (&(mBaseArray[(pIndex)*TypeSize+ GetHeaderOffset() ]), &(mBaseArray[(pIndex+1)*TypeSize+ GetHeaderOffset() ]), TypeSize*(lArrayCount-pIndex-1)); } SetArrayCount( lArrayCount-1 ); #ifdef _DEBUG memset( &(mBaseArray[(GetArrayCount())*TypeSize+ GetHeaderOffset() ]),0,TypeSize); #endif }
bool ValidateIndex | ( | int | pIndex | ) | const [inline, protected] |
Check that the given position is inside the array boundaries.
pIndex | Index value to validate. |
true
if the index value is within the array
boundaries. false
otherwise.Definition at line 783 of file karrayul.h.
{ int lArrayCount = GetArrayCount(); if (pIndex>=0 && pIndex<lArrayCount) { return true; } else { #ifdef KFBX_PRIVATE K_ASSERT_MSG_NOW(_T("ArrayTemplate : Index out of range")); #endif return false; } }
KHeader* const GetHeader | ( | ) | const [inline, protected] |
Definition at line 799 of file karrayul.h.
{ return (KHeader* const)mBaseArray; }
KHeader* GetHeader | ( | ) | [inline, protected] |
Definition at line 803 of file karrayul.h.
{ return (KHeader*)mBaseArray; }
int GetHeaderOffset | ( | ) | const [inline, protected] |
int GetArrayCount | ( | ) | const [inline, protected] |
void SetArrayCount | ( | int | pArrayCount | ) | [inline, protected] |
Definition at line 815 of file karrayul.h.
{ mArrayCount = pArrayCount; }
int GetBlockCount | ( | ) | const [inline, protected] |
Definition at line 819 of file karrayul.h.
{ return GetHeader() ? GetHeader()->mBlockCount : 0; }
void SetBlockCount | ( | int | pArrayCount | ) | [inline, protected] |
Definition at line 823 of file karrayul.h.
{ if (GetHeader()) GetHeader()->mBlockCount = pArrayCount; }
int mArrayCount
[protected] |
Definition at line 829 of file karrayul.h.
char* mBaseArray
[protected] |
Definition at line 830 of file karrayul.h.