code cleanup: better use of BLI_array_* (grow in larger steps where possible), includ...
[blender.git] / source / blender / blenlib / BLI_ghash.h
index c77e82f0a2bbcb3ea6fc8830bcadf660cbd3dde1..457f098bff7a085d6c6d7dee87d5eee7ba641e69 100644 (file)
@@ -1,8 +1,4 @@
-/**
- * A general (pointer -> pointer) hash table ADT
- * 
- * $Id$
- *
+/*
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
@@ -17,7 +13,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
  * All rights reserved.
  * ***** END GPL LICENSE BLOCK *****
  */
  
-#ifndef BLI_GHASH_H
-#define BLI_GHASH_H
+#ifndef __BLI_GHASH_H__
+#define __BLI_GHASH_H__
+
+/** \file BLI_ghash.h
+ *  \ingroup bli
+ *  \brief A general (pointer -> pointer) hash table ADT
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef unsigned int   (*GHashHashFP)          (const void *key);
+typedef int                            (*GHashCmpFP)           (const void *a, const void *b);
+typedef        void                    (*GHashKeyFreeFP)       (void *key);
+typedef void                   (*GHashValFreeFP)       (void *val);
+
+typedef struct Entry {
+       struct Entry *next;
 
-struct GHash;
-typedef struct GHash GHash;
+       void *key, *val;
+} Entry;
+
+typedef struct GHash {
+       GHashHashFP     hashfp;
+       GHashCmpFP      cmpfp;
+
+       Entry **buckets;
+       struct BLI_mempool *entrypool;
+       int nbuckets, nentries, cursize;
+} GHash;
 
 typedef struct GHashIterator {
        GHash *gh;
@@ -41,20 +63,15 @@ typedef struct GHashIterator {
        struct Entry *curEntry;
 } GHashIterator;
 
-typedef unsigned int   (*GHashHashFP)          (void *key);
-typedef int                            (*GHashCmpFP)           (void *a, void *b);
-typedef        void                    (*GHashKeyFreeFP)       (void *key);
-typedef void                   (*GHashValFreeFP)       (void *val);
-
-GHash* BLI_ghash_new           (GHashHashFP hashfp, GHashCmpFP cmpfp);
-void   BLI_ghash_free          (GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp);
-
-void   BLI_ghash_insert        (GHash *gh, void *key, void *val);
-int            BLI_ghash_remove        (GHash *gh, void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp);
-void*  BLI_ghash_lookup        (GHash *gh, void *key);
-int            BLI_ghash_haskey        (GHash *gh, void *key);
+/* *** */
 
-int            BLI_ghash_size          (GHash *gh);
+GHash* BLI_ghash_new   (GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info);
+void   BLI_ghash_free  (GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp);
+void   BLI_ghash_insert(GHash *gh, void *key, void *val);
+void * BLI_ghash_lookup(GHash *gh, const void *key);
+int    BLI_ghash_remove(GHash *gh, void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp);
+int    BLI_ghash_haskey(GHash *gh, void *key);
+int       BLI_ghash_size  (GHash *gh);
 
 /* *** */
 
@@ -63,8 +80,8 @@ int           BLI_ghash_size          (GHash *gh);
         * while the iterator is in use, and the iterator will step exactly
         * BLI_ghash_size(gh) times before becoming done.
         * 
-        * @param gh The GHash to iterate over.
-        * @return Pointer to a new DynStr.
+        * \param gh The GHash to iterate over.
+        * \return Pointer to a new DynStr.
         */
 GHashIterator* BLI_ghashIterator_new           (GHash *gh);
        /**
@@ -72,58 +89,71 @@ GHashIterator*      BLI_ghashIterator_new           (GHash *gh);
         * be mutated while the iterator is in use, and the iterator will
         * step exactly BLI_ghash_size(gh) times before becoming done.
         * 
-        * @param ghi The GHashIterator to initialize.
-        * @param gh The GHash to iterate over.
+        * \param ghi The GHashIterator to initialize.
+        * \param gh The GHash to iterate over.
         */
 void BLI_ghashIterator_init(GHashIterator *ghi, GHash *gh);
        /**
         * Free a GHashIterator.
         *
-        * @param ghi The iterator to free.
+        * \param ghi The iterator to free.
         */
 void                   BLI_ghashIterator_free          (GHashIterator *ghi);
 
        /**
         * Retrieve the key from an iterator.
         *
-        * @param ghi The iterator.
-        * @return The key at the current index, or NULL if the 
+        * \param ghi The iterator.
+        * \return The key at the current index, or NULL if the 
         * iterator is done.
         */
 void*                  BLI_ghashIterator_getKey        (GHashIterator *ghi);
        /**
         * Retrieve the value from an iterator.
         *
-        * @param ghi The iterator.
-        * @return The value at the current index, or NULL if the 
+        * \param ghi The iterator.
+        * \return The value at the current index, or NULL if the 
         * iterator is done.
         */
 void*                  BLI_ghashIterator_getValue      (GHashIterator *ghi);
        /**
         * Steps the iterator to the next index.
         *
-        * @param ghi The iterator.
+        * \param ghi The iterator.
         */
 void                   BLI_ghashIterator_step          (GHashIterator *ghi);
        /**
         * Determine if an iterator is done (has reached the end of
         * the hash table).
         *
-        * @param ghi The iterator.
-        * @return True if done, False otherwise.
+        * \param ghi The iterator.
+        * \return True if done, False otherwise.
         */
 int                            BLI_ghashIterator_isDone        (GHashIterator *ghi);
 
 /* *** */
 
-unsigned int   BLI_ghashutil_ptrhash   (void *key);
-int                            BLI_ghashutil_ptrcmp    (void *a, void *b);
+unsigned int   BLI_ghashutil_ptrhash   (const void *key);
+int                            BLI_ghashutil_ptrcmp    (const void *a, const void *b);
+
+unsigned int   BLI_ghashutil_strhash   (const void *key);
+int                            BLI_ghashutil_strcmp    (const void *a, const void *b);
+
+unsigned int   BLI_ghashutil_inthash   (const void *ptr);
+int                            BLI_ghashutil_intcmp    (const void *a, const void *b);
 
-unsigned int   BLI_ghashutil_strhash   (void *key);
-int                            BLI_ghashutil_strcmp    (void *a, void *b);
+typedef struct GHashPair {
+       const void *first;
+       int second;
+} GHashPair;
 
-unsigned int   BLI_ghashutil_inthash   (void *ptr);
-int                            BLI_ghashutil_intcmp(void *a, void *b);
+GHashPair*             BLI_ghashutil_pairalloc (const void *first, int second);
+unsigned int   BLI_ghashutil_pairhash  (const void *ptr);
+int                            BLI_ghashutil_paircmp   (const void *a, const void *b);
+void                   BLI_ghashutil_pairfree  (void *ptr);
 
+#ifdef __cplusplus
+}
 #endif
 
+#endif /* __BLI_GHASH_H__ */