[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42917] branches/bmesh/blender/source/ blender: un-inline edgehash functions, BLI_edgehash_insert was far too big to inline.

Campbell Barton ideasman42 at gmail.com
Wed Dec 28 11:06:17 CET 2011


Revision: 42917
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42917
Author:   campbellbarton
Date:     2011-12-28 10:06:10 +0000 (Wed, 28 Dec 2011)
Log Message:
-----------
un-inline edgehash functions, BLI_edgehash_insert was far too big to inline.

and have edge hash use unsigned ints since edge verts are unsigned ints for MEdge's

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh_validate.c
    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/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-12-28 09:47:24 UTC (rev 42916)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-12-28 10:06:10 UTC (rev 42917)
@@ -2504,7 +2504,7 @@
 	index = CustomData_get_layer(&edgeData, CD_ORIGINDEX);
 	for(i = 0; !BLI_edgehashIterator_isDone(ehi);
 		BLI_edgehashIterator_step(ehi), ++i, ++med, ++index) {
-		BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
+		BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2);
 
 		med->flag = ME_EDGEDRAW|ME_EDGERENDER;
 		*index = ORIGINDEX_NONE;
@@ -2567,7 +2567,7 @@
 	index = CustomData_get_layer(&edgeData, CD_ORIGINDEX);
 	for(i = 0; !BLI_edgehashIterator_isDone(ehi);
 	    BLI_edgehashIterator_step(ehi), ++i, ++med, ++index) {
-		BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
+		BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2);
 		j = GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
 
 		med->flag = ME_EDGEDRAW|ME_EDGERENDER;

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh_validate.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh_validate.c	2011-12-28 09:47:24 UTC (rev 42916)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh_validate.c	2011-12-28 10:06:10 UTC (rev 42917)
@@ -527,7 +527,7 @@
 		if(update && (med_orig=BLI_edgehashIterator_getValue(ehi))) {
 			*med= *med_orig; /* copy from the original */
 		} else {
-			BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
+			BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2);
 			med->flag = ME_EDGEDRAW|ME_EDGERENDER|SELECT; /* select for newly created meshes which are selected [#25595] */
 		}
 

Modified: branches/bmesh/blender/source/blender/blenlib/BLI_edgehash.h
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/BLI_edgehash.h	2011-12-28 09:47:24 UTC (rev 42916)
+++ branches/bmesh/blender/source/blender/blenlib/BLI_edgehash.h	2011-12-28 10:06:10 UTC (rev 42917)
@@ -47,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, unsigned int v0, unsigned 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, unsigned int v0, unsigned 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, unsigned int v0, unsigned 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, unsigned int v0, unsigned int v1);
 
 	/* Return number of keys in hash. */
 int				BLI_edgehash_size		(EdgeHash *eh);
@@ -83,7 +83,7 @@
 void				BLI_edgehashIterator_free		(EdgeHashIterator *ehi);
 
 	/* Retrieve the key from an iterator. */
-void 				BLI_edgehashIterator_getKey		(EdgeHashIterator *ehi, int *v0_r, int *v1_r);
+void 				BLI_edgehashIterator_getKey		(EdgeHashIterator *ehi, unsigned int *v0_r, unsigned int *v1_r);
 	
 	/* Retrieve the value from an iterator. */
 void*				BLI_edgehashIterator_getValue	(EdgeHashIterator *ehi);
@@ -98,4 +98,3 @@
 int					BLI_edgehashIterator_isDone		(EdgeHashIterator *ehi);
 
 #endif
-

Modified: branches/bmesh/blender/source/blender/blenlib/intern/edgehash.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/edgehash.c	2011-12-28 09:47:24 UTC (rev 42916)
+++ branches/bmesh/blender/source/blender/blenlib/intern/edgehash.c	2011-12-28 10:06:10 UTC (rev 42917)
@@ -48,14 +48,22 @@
 	268435459
 };
 
-#define EDGEHASH(v0,v1)		((v0*39)^(v1*31))
+#define EDGE_HASH(v0, v1)  ((v0 * 39)^(v1 * 31))
 
+/* ensure v0 is smaller */
+#define EDGE_ORD(v0, v1) \
+	if (v0 < v1) {       \
+		v0 ^= v1;        \
+		v1 ^= v0;        \
+		v0 ^= v1;        \
+	}
+
 /***/
 
 typedef struct EdgeEntry EdgeEntry;
 struct EdgeEntry {
 	EdgeEntry *next;
-	int v0, v1;
+	unsigned int v0, v1;
 	void *val;
 };
 
@@ -69,52 +77,50 @@
 
 EdgeHash *BLI_edgehash_new(void)
 {
-	EdgeHash *eh= MEM_callocN(sizeof(*eh), "EdgeHash");
-	eh->cursize= 0;
-	eh->nentries= 0;
-	eh->nbuckets= _ehash_hashsizes[eh->cursize];
+	EdgeHash *eh = MEM_callocN(sizeof(*eh), "EdgeHash");
+	eh->cursize = 0;
+	eh->nentries = 0;
+	eh->nbuckets = _ehash_hashsizes[eh->cursize];
 	
-	eh->buckets= MEM_callocN(eh->nbuckets*sizeof(*eh->buckets), "eh buckets 2");
+	eh->buckets = MEM_callocN(eh->nbuckets * sizeof(*eh->buckets), "eh buckets 2");
 	eh->epool = BLI_mempool_create(sizeof(EdgeEntry), 512, 512, TRUE, FALSE);
 
 	return eh;
 }
 
 
-void BLI_edgehash_insert(EdgeHash *eh, int v0, int v1, void *val) {
+void BLI_edgehash_insert(EdgeHash *eh, unsigned int v0, unsigned int v1, void *val)
+{
 	unsigned int hash;
-	EdgeEntry *e= BLI_mempool_alloc(eh->epool);
+	EdgeEntry *e = BLI_mempool_alloc(eh->epool);
 
-	if (v1<v0) {
-		v0 ^= v1;
-		v1 ^= v0;
-		v0 ^= v1;
-	}
-	hash = EDGEHASH(v0,v1)%eh->nbuckets;
+	EDGE_ORD(v0, v1); /* ensure v0 is smaller */
 
+	hash = EDGE_HASH(v0, v1) % eh->nbuckets;
+
 	e->v0 = v0;
 	e->v1 = v1;
 	e->val = val;
-	e->next= eh->buckets[hash];
+	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;
+	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");
+		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;
+		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];
+				hash = EDGE_HASH(e->v0, e->v1) % eh->nbuckets;
+				e->next = eh->buckets[hash];
 				eh->buckets[hash]= e;
 
-				e= n;
+				e = n;
 			}
 		}
 
@@ -122,33 +128,31 @@
 	}
 }
 
-void** BLI_edgehash_lookup_p(EdgeHash *eh, int v0, int v1) {
+void **BLI_edgehash_lookup_p(EdgeHash *eh, unsigned int v0, unsigned 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)
+	EDGE_ORD(v0, v1); /* ensure v0 is smaller */
+
+	hash = EDGE_HASH(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 *BLI_edgehash_lookup(EdgeHash *eh, unsigned int v0, unsigned int v1)
 {
-	void **value_p = BLI_edgehash_lookup_p(eh,v0,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)
+int BLI_edgehash_haskey(EdgeHash *eh, unsigned int v0, unsigned int v1)
 {
-	return BLI_edgehash_lookup_p(eh, v0, v1)!=NULL;
+	return BLI_edgehash_lookup_p(eh, v0, v1) != NULL;
 }
 
 int BLI_edgehash_size(EdgeHash *eh)
@@ -160,21 +164,21 @@
 {
 	int i;
 	
-	for (i=0; i<eh->nbuckets; i++) {
+	for (i = 0; i<eh->nbuckets; i++) {
 		EdgeEntry *e;
 		
-		for (e= eh->buckets[i]; e; ) {
-			EdgeEntry *n= e->next;
+		for (e = eh->buckets[i]; e; ) {
+			EdgeEntry *n = e->next;
 			
 			if (valfreefp) valfreefp(e->val);
 			BLI_mempool_free(eh->epool, e);
 			
-			e= n;
+			e = n;
 		}
-		eh->buckets[i]= NULL;
+		eh->buckets[i] = NULL;
 	}
 
-	eh->nentries= 0;
+	eh->nentries = 0;
 }
 
 void BLI_edgehash_free(EdgeHash *eh, EdgeHashFreeFP valfreefp)
@@ -198,15 +202,15 @@
 
 EdgeHashIterator *BLI_edgehashIterator_new(EdgeHash *eh)
 {
-	EdgeHashIterator *ehi= MEM_mallocN(sizeof(*ehi), "eh iter");
-	ehi->eh= eh;
-	ehi->curEntry= NULL;
-	ehi->curBucket= -1;
+	EdgeHashIterator *ehi = MEM_mallocN(sizeof(*ehi), "eh iter");
+	ehi->eh = eh;
+	ehi->curEntry = NULL;
+	ehi->curBucket = -1;
 	while (!ehi->curEntry) {
 		ehi->curBucket++;
-		if (ehi->curBucket==ehi->eh->nbuckets)
+		if (ehi->curBucket == ehi->eh->nbuckets)
 			break;
-		ehi->curEntry= ehi->eh->buckets[ehi->curBucket];
+		ehi->curEntry = ehi->eh->buckets[ehi->curBucket];
 	}
 	return ehi;
 }
@@ -215,7 +219,7 @@
 	MEM_freeN(ehi);
 }
 
-void BLI_edgehashIterator_getKey(EdgeHashIterator *ehi, int *v0_r, int *v1_r)
+void BLI_edgehashIterator_getKey(EdgeHashIterator *ehi, unsigned int *v0_r, unsigned int *v1_r)
 {
 	if (ehi->curEntry) {
 		*v0_r = ehi->curEntry->v0;
@@ -229,19 +233,22 @@
 
 void BLI_edgehashIterator_setValue(EdgeHashIterator *ehi, void *val)
 {
-	if(ehi->curEntry)
-		ehi->curEntry->val= val;
+	if (ehi->curEntry) {
+		ehi->curEntry->val = val;
+	}
 }
 
 void BLI_edgehashIterator_step(EdgeHashIterator *ehi)
 {
 	if (ehi->curEntry) {
-		ehi->curEntry= ehi->curEntry->next;
+		ehi->curEntry = ehi->curEntry->next;
 		while (!ehi->curEntry) {
 			ehi->curBucket++;
-			if (ehi->curBucket==ehi->eh->nbuckets)
+			if (ehi->curBucket == ehi->eh->nbuckets) {
 				break;
-			ehi->curEntry= ehi->eh->buckets[ehi->curBucket];
+			}
+
+			ehi->curEntry = ehi->eh->buckets[ehi->curBucket];
 		}
 	}
 }

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:47:24 UTC (rev 42916)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c	2011-12-28 10:06:10 UTC (rev 42917)
@@ -97,7 +97,7 @@
 		EdgeHash *edge_hash = BLI_edgehash_new();

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list