]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/dynarray.h
send more page change events (patch 750521); document this behaviour
[wxWidgets.git] / include / wx / dynarray.h
index 1a7bf28d2f5a0b00ca51595c21f978e81d869aeb..fbcf446866aaee3f775b8b33d0495c04c717a833 100644 (file)
@@ -6,13 +6,13 @@
 // 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
 
@@ -57,7 +57,7 @@
 
 /*
     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.
  */
@@ -90,11 +90,13 @@ public:                                                             \
   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]; }   \
@@ -103,23 +105,23 @@ protected:                                                          \
   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
@@ -166,14 +168,15 @@ public:                                                               \
     { 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,                    \
@@ -223,7 +226,8 @@ public:                                                               \
   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,                    \
@@ -259,11 +263,11 @@ public:                                                                  \
                                                                          \
   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); }                                \
                                                                          \
@@ -273,7 +277,7 @@ public:                                                                  \
   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); }        \
                                                                          \
@@ -324,14 +328,17 @@ private:                                                                 \
 // ----------------------------------------------------------------------------
 
 #define WX_DEFINE_TYPEARRAY(T, name, base)                        \
-    WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, base, wxARRAY_DEFAULT_EXPORT)
+    WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class wxARRAY_DEFAULT_EXPORT)
 
 #define WX_DEFINE_EXPORTED_TYPEARRAY(T, name, base)               \
-    WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, base, WXDLLEXPORT)
+    WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class WXDLLEXPORT)
+
+#define WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, base, expdecl) \
+    WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class expdecl)
 
-#define WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, base, expmode) \
+#define WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, classdecl) \
     typedef T _wxArray##name;                                     \
-    _WX_DEFINE_TYPEARRAY(_wxArray##name, name, base, class expmode)
+    _WX_DEFINE_TYPEARRAY(_wxArray##name, name, base, classdecl)
 
 // ----------------------------------------------------------------------------
 // WX_DEFINE_SORTED_TYPEARRAY: this is the same as the previous macro, but it
@@ -463,11 +470,16 @@ private:                                                                 \
 // Some commonly used predefined base arrays
 // ----------------------------------------------------------------------------
 
-WX_DECLARE_EXPORTED_BASEARRAY(const void *, wxBaseArrayPtrVoid);
-WX_DECLARE_EXPORTED_BASEARRAY(short,        wxBaseArrayShort);
-WX_DECLARE_EXPORTED_BASEARRAY(int,          wxBaseArrayInt);
-WX_DECLARE_EXPORTED_BASEARRAY(long,         wxBaseArrayLong);
-WX_DECLARE_EXPORTED_BASEARRAY(double,       wxBaseArrayDouble);
+WX_DECLARE_USER_EXPORTED_BASEARRAY(const void *, wxBaseArrayPtrVoid,
+                                   WXDLLIMPEXP_BASE);
+WX_DECLARE_USER_EXPORTED_BASEARRAY(short,        wxBaseArrayShort,
+                                   WXDLLIMPEXP_BASE);
+WX_DECLARE_USER_EXPORTED_BASEARRAY(int,          wxBaseArrayInt,
+                                   WXDLLIMPEXP_BASE);
+WX_DECLARE_USER_EXPORTED_BASEARRAY(long,         wxBaseArrayLong,
+                                   WXDLLIMPEXP_BASE);
+WX_DECLARE_USER_EXPORTED_BASEARRAY(double,       wxBaseArrayDouble,
+                                   WXDLLIMPEXP_BASE);
 
 // ----------------------------------------------------------------------------
 // Convenience macros to define arrays from base arrays
@@ -478,35 +490,35 @@ WX_DECLARE_EXPORTED_BASEARRAY(double,       wxBaseArrayDouble);
 #define WX_DEFINE_EXPORTED_ARRAY(T, name)                              \
     WX_DEFINE_EXPORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid)
 #define WX_DEFINE_USER_EXPORTED_ARRAY(T, name, expmode)                \
-    WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid, expmode)
+    WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayPtrVoid, expmode)
 
 #define WX_DEFINE_ARRAY_SHORT(T, name)                                 \
     WX_DEFINE_TYPEARRAY(T, name, wxBaseArrayShort)
 #define WX_DEFINE_EXPORTED_ARRAY_SHORT(T, name)                        \
     WX_DEFINE_EXPORTED_TYPEARRAY(T, name, wxBaseArrayShort)
 #define WX_DEFINE_USER_EXPORTED_ARRAY_SHORT(T, name, expmode)          \
-    WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayShort, expmode)
+    WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayShort, expmode)
 
 #define WX_DEFINE_ARRAY_INT(T, name)                                   \
     WX_DEFINE_TYPEARRAY(T, name, wxBaseArrayInt)
 #define WX_DEFINE_EXPORTED_ARRAY_INT(T, name)                          \
     WX_DEFINE_EXPORTED_TYPEARRAY(T, name, wxBaseArrayInt)
 #define WX_DEFINE_USER_EXPORTED_ARRAY_INT(T, name, expmode)            \
-    WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayInt, expmode)
+    WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayInt, expmode)
 
 #define WX_DEFINE_ARRAY_LONG(T, name)                                  \
     WX_DEFINE_TYPEARRAY(T, name, wxBaseArrayLong)
 #define WX_DEFINE_EXPORTED_ARRAY_LONG(T, name)                         \
     WX_DEFINE_EXPORTED_TYPEARRAY(T, name, wxBaseArrayLong)
 #define WX_DEFINE_USER_EXPORTED_ARRAY_LONG(T, name, expmode)           \
-    WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayLong, expmode)
+    WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayLong, expmode)
 
 #define WX_DEFINE_ARRAY_DOUBLE(T, name)                                \
     WX_DEFINE_TYPEARRAY(T, name, wxBaseArrayDouble)
 #define WX_DEFINE_EXPORTED_ARRAY_DOUBLE(T, name)                       \
     WX_DEFINE_EXPORTED_TYPEARRAY(T, name, wxBaseArrayDouble)
 #define WX_DEFINE_USER_EXPORTED_ARRAY_DOUBLE(T, name, expmode)         \
-    WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayDouble, expmode)
+    WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayDouble, expmode)
 
 // ----------------------------------------------------------------------------
 // Convenience macros to define sorted arrays from base arrays
@@ -584,10 +596,10 @@ WX_DECLARE_EXPORTED_BASEARRAY(double,       wxBaseArrayDouble);
 // Some commonly used predefined arrays
 // ----------------------------------------------------------------------------
 
-WX_DEFINE_EXPORTED_ARRAY_SHORT (short,  wxArrayShort);
-WX_DEFINE_EXPORTED_ARRAY_INT   (int,    wxArrayInt);
-WX_DEFINE_EXPORTED_ARRAY_LONG  (long,   wxArrayLong);
-WX_DEFINE_EXPORTED_ARRAY       (void *, wxArrayPtrVoid);
+WX_DEFINE_USER_EXPORTED_ARRAY_SHORT (short,  wxArrayShort,   class WXDLLIMPEXP_BASE);
+WX_DEFINE_USER_EXPORTED_ARRAY_INT   (int,    wxArrayInt,     class WXDLLIMPEXP_BASE);
+WX_DEFINE_USER_EXPORTED_ARRAY_LONG  (long,   wxArrayLong,    class WXDLLIMPEXP_BASE);
+WX_DEFINE_USER_EXPORTED_ARRAY       (void *, wxArrayPtrVoid, class WXDLLIMPEXP_BASE);
 
 // -----------------------------------------------------------------------------
 // convenience macros