[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42916] branches/bmesh/blender/source/ blender: un-inline edgehash functions, BLI_edgehash_insert especially was too large to inline

Campbell Barton ideasman42 at gmail.com
Wed Dec 28 10:47:37 CET 2011


Revision: 42916
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42916
Author:   campbellbarton
Date:     2011-12-28 09:47:24 +0000 (Wed, 28 Dec 2011)
Log Message:
-----------
un-inline edgehash functions, BLI_edgehash_insert especially was too large to inline

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenlib/BLI_edgehash.h
    branches/bmesh/blender/source/blender/blenlib/intern/edgehash.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: branches/bmesh/blender/source/blender/blenlib/BLI_edgehash.h
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/BLI_edgehash.h	2011-12-28 09:21:24 UTC (rev 42915)
+++ branches/bmesh/blender/source/blender/blenlib/BLI_edgehash.h	2011-12-28 09:47:24 UTC (rev 42916)
@@ -34,10 +34,6 @@
  *  \brief A general unordered 2-int pair hash table ADT.
  */
 
-#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
-#include "BLI_mempool.h"
-
 struct EdgeHash;
 struct EdgeHashIterator;
 typedef struct EdgeHash EdgeHash;
@@ -51,22 +47,22 @@
 	/* Insert edge (v0,v1) into hash with given value, does
 	 * not check for duplicates.
 	 */
-//void			BLI_edgehash_insert		(EdgeHash *eh, int v0, int v1, void *val);
+void			BLI_edgehash_insert		(EdgeHash *eh, int v0, int v1, void *val);
 
 	/* Return value for given edge (v0,v1), or NULL if
 	 * if key does not exist in hash. (If need exists 
 	 * to differentiate between key-value being NULL and 
 	 * lack of key then see BLI_edgehash_lookup_p().
 	 */
-//void*			BLI_edgehash_lookup		(EdgeHash *eh, int v0, int v1);
+void*			BLI_edgehash_lookup		(EdgeHash *eh, int v0, int v1);
 
 	/* Return pointer to value for given edge (v0,v1),
 	 * or NULL if key does not exist in hash.
 	 */
-//void**			BLI_edgehash_lookup_p	(EdgeHash *eh, int v0, int v1);
+void**			BLI_edgehash_lookup_p	(EdgeHash *eh, int v0, int v1);
 
 	/* Return boolean true/false if edge (v0,v1) in hash. */
-//int				BLI_edgehash_haskey		(EdgeHash *eh, int v0, int v1);
+int				BLI_edgehash_haskey		(EdgeHash *eh, int v0, int v1);
 
 	/* Return number of keys in hash. */
 int				BLI_edgehash_size		(EdgeHash *eh);
@@ -101,99 +97,5 @@
 	/* Determine if an iterator is done. */
 int					BLI_edgehashIterator_isDone		(EdgeHashIterator *ehi);
 
-/**************inlined code************/
-static unsigned int _ehash_hashsizes[]= {
-	1, 3, 5, 11, 17, 37, 67, 131, 257, 521, 1031, 2053, 4099, 8209, 
-	16411, 32771, 65537, 131101, 262147, 524309, 1048583, 2097169, 
-	4194319, 8388617, 16777259, 33554467, 67108879, 134217757, 
-	268435459
-};
-
-#define EDGEHASH(v0,v1)		((v0*39)^(v1*31))
-
-/***/
-
-typedef struct EdgeEntry EdgeEntry;
-struct EdgeEntry {
-	EdgeEntry *next;
-	int v0, v1;
-	void *val;
-};
-
-struct EdgeHash {
-	EdgeEntry **buckets;
-	BLI_mempool *epool;
-	int nbuckets, nentries, cursize;
-};
-
-
-BM_INLINE void BLI_edgehash_insert(EdgeHash *eh, int v0, int v1, void *val) {
-	unsigned int hash;
-	EdgeEntry *e= BLI_mempool_alloc(eh->epool);
-
-	if (v1<v0) {
-		v0 ^= v1;
-		v1 ^= v0;
-		v0 ^= v1;
-	}
-	hash = EDGEHASH(v0,v1)%eh->nbuckets;
-
-	e->v0 = v0;
-	e->v1 = v1;
-	e->val = val;
-	e->next= eh->buckets[hash];
-	eh->buckets[hash]= e;
-	
-	if (++eh->nentries>eh->nbuckets*3) {
-		EdgeEntry *e, **old= eh->buckets;
-		int i, nold= eh->nbuckets;
-		
-		eh->nbuckets= _ehash_hashsizes[++eh->cursize];
-		eh->buckets= MEM_mallocN(eh->nbuckets*sizeof(*eh->buckets), "eh buckets");
-		memset(eh->buckets, 0, eh->nbuckets * sizeof(*eh->buckets));
-
-		for (i=0; i<nold; i++) {
-			for (e= old[i]; e;) {
-				EdgeEntry *n= e->next;
-				
-				hash= EDGEHASH(e->v0,e->v1)%eh->nbuckets;
-				e->next= eh->buckets[hash];
-				eh->buckets[hash]= e;
-				
-				e= n;
-			}
-		}
-		
-		MEM_freeN(old);
-	}
-}
-
-BM_INLINE void** BLI_edgehash_lookup_p(EdgeHash *eh, int v0, int v1) {
-	unsigned int hash;
-	EdgeEntry *e;
-
-	if (v1<v0) {
-		v0 ^= v1;
-		v1 ^= v0;
-		v0 ^= v1;
-	}
-	hash = EDGEHASH(v0,v1)%eh->nbuckets;
-	for (e= eh->buckets[hash]; e; e= e->next)
-		if (v0==e->v0 && v1==e->v1)
-			return &e->val;
-	
-	return NULL;
-}
-
-BM_INLINE void* BLI_edgehash_lookup(EdgeHash *eh, int v0, int v1) {
-	void **value_p = BLI_edgehash_lookup_p(eh,v0,v1);
-
-	return value_p?*value_p:NULL;
-}
-
-BM_INLINE int BLI_edgehash_haskey(EdgeHash *eh, int v0, int v1) {
-	return BLI_edgehash_lookup_p(eh, v0, v1)!=NULL;
-}
-
 #endif
 

Modified: branches/bmesh/blender/source/blender/blenlib/intern/edgehash.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/edgehash.c	2011-12-28 09:21:24 UTC (rev 42915)
+++ branches/bmesh/blender/source/blender/blenlib/intern/edgehash.c	2011-12-28 09:47:24 UTC (rev 42916)
@@ -40,8 +40,33 @@
 #include "BLI_edgehash.h"
 #include "BLI_mempool.h"
 
+/**************inlined code************/
+static unsigned int _ehash_hashsizes[]= {
+	1, 3, 5, 11, 17, 37, 67, 131, 257, 521, 1031, 2053, 4099, 8209,
+	16411, 32771, 65537, 131101, 262147, 524309, 1048583, 2097169,
+	4194319, 8388617, 16777259, 33554467, 67108879, 134217757,
+	268435459
+};
+
+#define EDGEHASH(v0,v1)		((v0*39)^(v1*31))
+
 /***/
 
+typedef struct EdgeEntry EdgeEntry;
+struct EdgeEntry {
+	EdgeEntry *next;
+	int v0, v1;
+	void *val;
+};
+
+struct EdgeHash {
+	EdgeEntry **buckets;
+	BLI_mempool *epool;
+	int nbuckets, nentries, cursize;
+};
+
+/***/
+
 EdgeHash *BLI_edgehash_new(void)
 {
 	EdgeHash *eh= MEM_callocN(sizeof(*eh), "EdgeHash");
@@ -55,6 +80,77 @@
 	return eh;
 }
 
+
+void BLI_edgehash_insert(EdgeHash *eh, int v0, int v1, void *val) {
+	unsigned int hash;
+	EdgeEntry *e= BLI_mempool_alloc(eh->epool);
+
+	if (v1<v0) {
+		v0 ^= v1;
+		v1 ^= v0;
+		v0 ^= v1;
+	}
+	hash = EDGEHASH(v0,v1)%eh->nbuckets;
+
+	e->v0 = v0;
+	e->v1 = v1;
+	e->val = val;
+	e->next= eh->buckets[hash];
+	eh->buckets[hash]= e;
+
+	if (++eh->nentries>eh->nbuckets*3) {
+		EdgeEntry *e, **old= eh->buckets;
+		int i, nold= eh->nbuckets;
+
+		eh->nbuckets= _ehash_hashsizes[++eh->cursize];
+		eh->buckets= MEM_mallocN(eh->nbuckets*sizeof(*eh->buckets), "eh buckets");
+		memset(eh->buckets, 0, eh->nbuckets * sizeof(*eh->buckets));
+
+		for (i=0; i<nold; i++) {
+			for (e= old[i]; e;) {
+				EdgeEntry *n= e->next;
+
+				hash= EDGEHASH(e->v0,e->v1)%eh->nbuckets;
+				e->next= eh->buckets[hash];
+				eh->buckets[hash]= e;
+
+				e= n;
+			}
+		}
+
+		MEM_freeN(old);
+	}
+}
+
+void** BLI_edgehash_lookup_p(EdgeHash *eh, int v0, int v1) {
+	unsigned int hash;
+	EdgeEntry *e;
+
+	if (v1<v0) {
+		v0 ^= v1;
+		v1 ^= v0;
+		v0 ^= v1;
+	}
+	hash = EDGEHASH(v0,v1)%eh->nbuckets;
+	for (e= eh->buckets[hash]; e; e= e->next)
+		if (v0==e->v0 && v1==e->v1)
+			return &e->val;
+
+	return NULL;
+}
+
+void* BLI_edgehash_lookup(EdgeHash *eh, int v0, int v1)
+{
+	void **value_p = BLI_edgehash_lookup_p(eh,v0,v1);
+
+	return value_p?*value_p:NULL;
+}
+
+int BLI_edgehash_haskey(EdgeHash *eh, int v0, int v1)
+{
+	return BLI_edgehash_lookup_p(eh, v0, v1)!=NULL;
+}
+
 int BLI_edgehash_size(EdgeHash *eh)
 {
 	return eh->nentries;
@@ -149,7 +245,8 @@
 		}
 	}
 }
-int BLI_edgehashIterator_isDone(EdgeHashIterator *ehi) {
+int BLI_edgehashIterator_isDone(EdgeHashIterator *ehi)
+{
 	return !ehi->curEntry;
 }
 

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c	2011-12-28 09:21:24 UTC (rev 42915)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c	2011-12-28 09:47:24 UTC (rev 42916)
@@ -35,6 +35,8 @@
 
 #include "DNA_meshdata_types.h"
 
+#include "MEM_guardedalloc.h"
+
 #include "BLI_utildefines.h"
 #include "BLI_math.h"
 #include "BLI_edgehash.h"
@@ -42,8 +44,6 @@
 #include "BLI_smallhash.h"
 #include "BLI_string.h"
 
-#include "MEM_guardedalloc.h"
-
 #include "BKE_cdderivedmesh.h"
 #include "BKE_mesh.h"
 #include "BKE_particle.h"




More information about the Bf-blender-cvs mailing list