dynarray.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 535 行 · 第 1/3 页
CPP
535 行
/* grow the array */ \
void name::Grow(size_t nIncrement) \
{ \
/* only do it if no more place */ \
if( (m_nCount == m_nSize) || ((m_nSize - m_nCount) < nIncrement) ) { \
if( m_nSize == 0 ) { \
/* was empty, determine initial size */ \
size_t size = WX_ARRAY_DEFAULT_INITIAL_SIZE; \
if (size < nIncrement) size = nIncrement; \
/* allocate some memory */ \
m_pItems = new T[size]; \
/* only grow if allocation succeeded */ \
if ( m_pItems ) { \
m_nSize = size; \
} \
} \
else \
{ \
/* add at least 50% but not too much */ \
size_t ndefIncrement = m_nSize < WX_ARRAY_DEFAULT_INITIAL_SIZE \
? WX_ARRAY_DEFAULT_INITIAL_SIZE : m_nSize >> 1; \
if ( ndefIncrement > ARRAY_MAXSIZE_INCREMENT ) \
ndefIncrement = ARRAY_MAXSIZE_INCREMENT; \
if ( nIncrement < ndefIncrement ) \
nIncrement = ndefIncrement; \
Realloc(m_nSize + nIncrement); \
} \
} \
} \
\
/* make sure that the array has at least count elements */ \
void name::SetCount(size_t count, T defval) \
{ \
if ( m_nSize < count ) \
{ \
/* need to realloc memory: don't overallocate it here as if */ \
/* SetCount() is called, it probably means that the caller */ \
/* knows in advance how many elements there will be in the */ \
/* array and so it won't be necessary to realloc it later */ \
if ( !Realloc(count) ) \
{ \
/* out of memory -- what can we do? */ \
return; \
} \
} \
\
/* add new elements if we extend the array */ \
while ( m_nCount < count ) \
{ \
m_pItems[m_nCount++] = defval; \
} \
} \
\
/* dtor */ \
name::~name() \
{ \
wxDELETEA(m_pItems); \
} \
\
/* clears the list */ \
void name::Clear() \
{ \
m_nSize = \
m_nCount = 0; \
\
wxDELETEA(m_pItems); \
} \
\
/* pre-allocates memory (frees the previous data!) */ \
void name::Alloc(size_t nSize) \
{ \
/* only if old buffer was not big enough */ \
if ( nSize > m_nSize ) { \
wxDELETEA(m_pItems); \
m_nSize = 0; \
m_pItems = new T[nSize]; \
/* only alloc if allocation succeeded */ \
if ( m_pItems ) { \
m_nSize = nSize; \
} \
} \
\
m_nCount = 0; \
} \
\
/* minimizes the memory usage by freeing unused memory */ \
void name::Shrink() \
{ \
/* only do it if we have some memory to free */ \
if( m_nCount < m_nSize ) { \
/* allocates exactly as much memory as we need */ \
T *pNew = new T[m_nCount]; \
/* only shrink if allocation succeeded */ \
if ( pNew ) { \
/* copy data to new location */ \
memcpy(pNew, m_pItems, m_nCount*sizeof(T)); \
delete [] m_pItems; \
m_pItems = pNew; \
\
/* update the size of the new block */ \
m_nSize = m_nCount; \
} \
/* else: don't do anything, better keep old memory block! */ \
} \
} \
\
/* add item at the end */ \
void name::Add(T lItem, size_t nInsert) \
{ \
if (nInsert == 0) \
return; \
Grow(nInsert); \
for (size_t i = 0; i < nInsert; i++) \
m_pItems[m_nCount++] = lItem; \
} \
\
/* add item at the given position */ \
void name::Insert(T lItem, size_t nIndex, size_t nInsert) \
{ \
wxCHECK_RET( nIndex <= m_nCount, wxT("bad index in wxArray::Insert") ); \
wxCHECK_RET( m_nCount <= m_nCount + nInsert, \
wxT("array size overflow in wxArray::Insert") ); \
\
if (nInsert == 0) \
return; \
Grow(nInsert); \
\
memmove(&m_pItems[nIndex + nInsert], &m_pItems[nIndex], \
(m_nCount - nIndex)*sizeof(T)); \
for (size_t i = 0; i < nInsert; i++) \
m_pItems[nIndex + i] = lItem; \
m_nCount += nInsert; \
} \
\
/* search for a place to insert item into sorted array (binary search) */ \
size_t name::IndexForInsert(T lItem, CMPFUNC fnCompare) const \
{ \
size_t i, \
lo = 0, \
hi = m_nCount; \
int res; \
\
while ( lo < hi ) { \
i = (lo + hi)/2; \
\
res = (*fnCompare)((const void *)(wxUIntPtr)lItem, \
(const void *)(wxUIntPtr)(m_pItems[i])); \
if ( res < 0 ) \
hi = i; \
else if ( res > 0 ) \
lo = i + 1; \
else { \
lo = i; \
break; \
} \
} \
\
return lo; \
} \
\
/* search for an item in a sorted array (binary search) */ \
int name::Index(T lItem, CMPFUNC fnCompare) const \
{ \
size_t n = IndexForInsert(lItem, fnCompare); \
\
return (n >= m_nCount || \
(*fnCompare)((const void *)(wxUIntPtr)lItem, \
((const void *)(wxUIntPtr)m_pItems[n]))) \
? wxNOT_FOUND \
: (int)n; \
} \
\
/* removes item from array (by index) */ \
void name::RemoveAt(size_t nIndex, size_t nRemove) \
{ \
wxCHECK_RET( nIndex < m_nCount, wxT("bad index in wxArray::RemoveAt") ); \
wxCHECK_RET( nIndex + nRemove <= m_nCount, \
wxT("removing too many elements in wxArray::RemoveAt") ); \
\
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?