// Created: 12.09.97
// RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence: wxWindows license
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _DYNARRAY_H
#define _DYNARRAY_H
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(__APPLE__)
#pragma interface "dynarray.h"
#endif
/*
Callback compare function for quick sort.
-
+
It must return negative value, 0 or positive value if the first item is
less than, equal to or greater than the second one.
*/
void Alloc(size_t uiSize); \
void Shrink(); \
\
- size_t GetCount() const { return m_nCount; } \
- bool IsEmpty() const { return m_nCount == 0; } \
- size_t Count() const { return m_nCount; } \
+ size_t GetCount() const { return m_nCount; } \
+ void SetCount(size_t n, T defval = T(0)); \
+ bool IsEmpty() const { return m_nCount == 0; } \
+ size_t Count() const { return m_nCount; } \
\
typedef T base_type; \
+ \
protected: \
T& Item(size_t uiIndex) const \
{ wxASSERT( uiIndex < m_nCount ); return m_pItems[uiIndex]; } \
int Index(T lItem, bool bFromEnd = FALSE) const; \
int Index(T lItem, CMPFUNC fnCompare) const; \
size_t IndexForInsert(T lItem, CMPFUNC fnCompare) const; \
- void Add(T lItem); \
+ void Add(T lItem, size_t nInsert = 1); \
void Add(T lItem, CMPFUNC fnCompare); \
- void Insert(T lItem, size_t uiIndex); \
+ void Insert(T lItem, size_t uiIndex, size_t nInsert = 1); \
void Remove(T lItem); \
- void RemoveAt(size_t uiIndex); \
+ void RemoveAt(size_t uiIndex, size_t nRemove = 1); \
\
void Sort(CMPFUNC fnCompare); \
\
private: \
- \
- void Grow(); \
+ void Grow(size_t nIncrement = 0); \
+ bool Realloc(size_t nSize); \
\
size_t m_nSize, \
m_nCount; \
\
T *m_pItems; \
-};
+}
// ============================================================================
// The private helper macros containing the core of the array classes
{ return (T&)(base::Item(Count() - 1)); } \
\
int Index(T Item, bool bFromEnd = FALSE) const \
- { return base::Index(Item, bFromEnd); } \
+ { return base::Index((base_type)Item, bFromEnd); } \
\
- void Add(T Item) \
- { base::Add(Item); } \
- void Insert(T Item, size_t uiIndex) \
- { base::Insert(Item, uiIndex) ; } \
+ void Add(T Item, size_t nInsert = 1) \
+ { base::Add((base_type)Item, nInsert); } \
+ void Insert(T Item, size_t uiIndex, size_t nInsert = 1) \
+ { base::Insert((base_type)Item, uiIndex, nInsert) ; } \
\
- void RemoveAt(size_t uiIndex) { base::RemoveAt(uiIndex); } \
+ void RemoveAt(size_t uiIndex, size_t nRemove = 1) \
+ { base::RemoveAt(uiIndex, nRemove); } \
void Remove(T Item) \
{ int iIndex = Index(Item); \
wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \
void Add(T Item) \
{ base::Add(Item, (CMPFUNC)m_fnCompare); } \
\
- void RemoveAt(size_t uiIndex) { base::RemoveAt(uiIndex); } \
+ void RemoveAt(size_t uiIndex, size_t nRemove = 1) \
+ { base::RemoveAt(uiIndex, nRemove); } \
void Remove(T Item) \
{ int iIndex = Index(Item); \
wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \
\
int Index(const T& Item, bool bFromEnd = FALSE) const; \
\
- void Add(const T& Item); \
+ void Add(const T& Item, size_t nInsert = 1); \
void Add(const T* pItem) \
{ base::Add((T*)pItem); } \
\
- void Insert(const T& Item, size_t uiIndex); \
+ void Insert(const T& Item, size_t uiIndex, size_t nInsert = 1); \
void Insert(const T* pItem, size_t uiIndex) \
{ base::Insert((T*)pItem, uiIndex); } \
\
T* Detach(size_t uiIndex) \
{ T* p = (T*)base::Item(uiIndex); \
base::RemoveAt(uiIndex); return p; } \
- void RemoveAt(size_t uiIndex); \
+ void RemoveAt(size_t uiIndex, size_t nRemove = 1); \
\
void Sort(CMPFUNC##T fCmp) { base::Sort((CMPFUNC##base)fCmp); } \
\