]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/hashmap.h
made wxTextInputStream Unicode safe and general cleanup (patch 653775)
[wxWidgets.git] / include / wx / hashmap.h
index 5bd69cea774c49a365a94b3459db7231f1e38557..554030a5648722af119924918f820315b618f0ad 100644 (file)
@@ -21,7 +21,7 @@
 #include <stddef.h>             // for ptrdiff_t
 
 // private
-struct WXDLLEXPORT _wxHashTable_NodeBase
+struct WXDLLIMPEXP_BASE _wxHashTable_NodeBase
 {
     _wxHashTable_NodeBase() : m_nxt(0) {}
 
@@ -33,7 +33,7 @@ struct WXDLLEXPORT _wxHashTable_NodeBase
 };
 
 // private
-class WXDLLEXPORT _wxHashTableBase2
+class WXDLLIMPEXP_BASE _wxHashTableBase2
 {
 public:
     typedef void (*NodeDtor)(_wxHashTable_NodeBase*);
@@ -278,8 +278,11 @@ protected: \
                 return node; \
             node = node->m_next(); \
         } \
- \
-        node = new Node( value ); \
+       return CreateNode( value  , bucket); \
+    }\
+    Node * CreateNode( const value_type& value, size_t bucket ) \
+    {\
+        Node* node = new Node( value ); \
         node->m_nxt = m_table[bucket]; \
         m_table[bucket] = node; \
  \
@@ -290,6 +293,10 @@ protected: \
  \
         return node; \
     } \
+    void CreateNode( const value_type& value ) \
+    {\
+        CreateNode(value, m_hasher( m_getKey(value) ) % m_tableBuckets ); \
+    }\
  \
     /* returns NULL if not found */ \
     Node** GetNodePtr( const const_key_type& key ) const \
@@ -407,7 +414,7 @@ inline bool grow_lf70( size_t buckets, size_t items )
 //     in the hash table class assignment operator (where they're assigned)
 
 // integer types
-class WXDLLEXPORT wxIntegerHash
+class WXDLLIMPEXP_BASE wxIntegerHash
 {
 public:
     wxIntegerHash() { }
@@ -421,7 +428,7 @@ public:
     wxIntegerHash& operator=(const wxIntegerHash&) { return *this; }
 };
 
-class WXDLLEXPORT wxIntegerEqual
+class WXDLLIMPEXP_BASE wxIntegerEqual
 {
 public:
     wxIntegerEqual() { }
@@ -436,7 +443,7 @@ public:
 };
 
 // pointers
-class WXDLLEXPORT wxPointerHash
+class WXDLLIMPEXP_BASE wxPointerHash
 {
 public:
     wxPointerHash() { }
@@ -448,7 +455,7 @@ public:
     wxPointerHash& operator=(const wxPointerHash&) { return *this; }
 };
 
-class WXDLLEXPORT wxPointerEqual
+class WXDLLIMPEXP_BASE wxPointerEqual
 {
 public:
     wxPointerEqual() { }
@@ -458,7 +465,7 @@ public:
 };
 
 // wxString, char*, wxChar*
-class WXDLLEXPORT wxStringHash
+class WXDLLIMPEXP_BASE wxStringHash
 {
 public:
     wxStringHash() {}
@@ -476,7 +483,7 @@ public:
     wxStringHash& operator=(const wxStringHash&) { return *this; }
 };
 
-class WXDLLEXPORT wxStringEqual
+class WXDLLIMPEXP_BASE wxStringEqual
 {
 public:
     wxStringEqual() {}
@@ -556,5 +563,19 @@ public: \
     _WX_DECLARE_HASH_MAP( void*, VALUE_T, wxPointerHash, wxPointerEqual, \
                           CLASSNAME, class WXDLLEXPORT )
 
+// delete all hash elements
+//
+// NB: the class declaration of the hash elements must be visible from the
+//     place where you use this macro, otherwise the proper destructor may not
+//     be called (a decent compiler should give a warning about it, but don't
+//     count on it)!
+#define WX_CLEAR_HASH_MAP(type, hashmap)                                     \
+    {                                                                        \
+        type##::iterator it, en;                                             \
+        for( it = (hashmap).begin(), en = (hashmap).end(); it != en; ++it )  \
+            delete it->second;                                               \
+        (hashmap).clear();                                                   \
+    }
+
 #endif // _WX_HASHMAP_H_