[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42918] trunk/blender/source/blender: copy BLI_edgehash changes from bmesh branch, main change is use of mempool .

Campbell Barton ideasman42 at gmail.com
Wed Dec 28 11:20:48 CET 2011


Revision: 42918
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42918
Author:   campbellbarton
Date:     2011-12-28 10:20:37 +0000 (Wed, 28 Dec 2011)
Log Message:
-----------
copy BLI_edgehash changes from bmesh branch, main change is use of mempool.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
    trunk/blender/source/blender/blenlib/BLI_edgehash.h
    trunk/blender/source/blender/blenlib/intern/edgehash.c
    trunk/blender/source/blender/editors/mesh/editmesh_lib.c
    trunk/blender/source/blender/modifiers/intern/MOD_explode.c
    trunk/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-12-28 10:06:10 UTC (rev 42917)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-12-28 10:20:37 UTC (rev 42918)
@@ -1950,7 +1950,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;

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2011-12-28 10:06:10 UTC (rev 42917)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2011-12-28 10:20:37 UTC (rev 42918)
@@ -829,8 +829,8 @@
 	/* 8: CD_NORMAL */
 	/* 3 floats per normal vector */
 	{sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
-	/* 9: CD_FLAGS */
-	{sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+	/* 9: CD_POLYINDEX */
+	{sizeof(int), "MIntProperty", 1, NULL, NULL, NULL, NULL, NULL, NULL},
 	/* 10: CD_PROP_FLT */
 	{sizeof(MFloatProperty), "MFloatProperty",1,"Float",NULL,NULL,NULL,NULL},
 	/* 11: CD_PROP_INT */
@@ -896,7 +896,6 @@
 	CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV |
 	CD_MASK_MLOOPCOL;
 
-
 static const LayerTypeInfo *layerType_getInfo(int type)
 {
 	if(type < 0 || type >= CD_NUMTYPES) return NULL;

Modified: trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh_validate.c	2011-12-28 10:06:10 UTC (rev 42917)
+++ trunk/blender/source/blender/blenkernel/intern/mesh_validate.c	2011-12-28 10:20:37 UTC (rev 42918)
@@ -509,7 +509,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: trunk/blender/source/blender/blenlib/BLI_edgehash.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_edgehash.h	2011-12-28 10:06:10 UTC (rev 42917)
+++ trunk/blender/source/blender/blenlib/BLI_edgehash.h	2011-12-28 10:20:37 UTC (rev 42918)
@@ -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: trunk/blender/source/blender/blenlib/intern/edgehash.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/edgehash.c	2011-12-28 10:06:10 UTC (rev 42917)
+++ trunk/blender/source/blender/blenlib/intern/edgehash.c	2011-12-28 10:20:37 UTC (rev 42918)
@@ -20,7 +20,7 @@
  *
  * The Original Code is: none of this file.
  *
- * Contributor(s): Daniel Dunbar
+ * Contributor(s): Daniel Dunbar, Joseph Eagar
  *
  * ***** END GPL LICENSE BLOCK *****
  * A general (pointer -> pointer) hash table ADT
@@ -35,30 +35,41 @@
 #include <string.h>
 
 #include "MEM_guardedalloc.h"
+
+#include "BLI_utildefines.h"
 #include "BLI_edgehash.h"
+#include "BLI_mempool.h"
 
-/***/
-
-static unsigned int 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, 
+/**************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))
+#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 Entry Entry;
-struct Entry {
-	Entry *next;
-	int v0, v1;
+typedef struct EdgeEntry EdgeEntry;
+struct EdgeEntry {
+	EdgeEntry *next;
+	unsigned int v0, v1;
 	void *val;
 };
 
 struct EdgeHash {
-	Entry **buckets;
+	EdgeEntry **buckets;
+	BLI_mempool *epool;
 	int nbuckets, nentries, cursize;
 };
 
@@ -66,87 +77,82 @@
 
 EdgeHash *BLI_edgehash_new(void)
 {
-	EdgeHash *eh= MEM_mallocN(sizeof(*eh), "EdgeHash");
-	eh->cursize= 0;
-	eh->nentries= 0;
-	eh->nbuckets= hashsizes[eh->cursize];
+	EdgeHash *eh = MEM_callocN(sizeof(*eh), "EdgeHash");
+	eh->cursize = 0;
+	eh->nentries = 0;
+	eh->nbuckets = _ehash_hashsizes[eh->cursize];
 	
-	eh->buckets= malloc(eh->nbuckets*sizeof(*eh->buckets));
-	memset(eh->buckets, 0, eh->nbuckets*sizeof(*eh->buckets));
-	
+	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;
-	Entry *e= malloc(sizeof(*e));
+	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) {
-		Entry **old= eh->buckets;
-		int i, nold= eh->nbuckets;
-		
-		eh->nbuckets= hashsizes[++eh->cursize];
-		eh->buckets= malloc(eh->nbuckets*sizeof(*eh->buckets));
-		memset(eh->buckets, 0, eh->nbuckets*sizeof(*eh->buckets));
-		
-		for (i=0; i<nold; i++) {
-			for (e= old[i]; e;) {
-				Entry *n= e->next;
-				
-				hash= EDGEHASH(e->v0,e->v1)%eh->nbuckets;
-				e->next= eh->buckets[hash];
+
+	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 = EDGE_HASH(e->v0, e->v1) % eh->nbuckets;
+				e->next = eh->buckets[hash];
 				eh->buckets[hash]= e;
-				
-				e= n;
+
+				e = n;
 			}
 		}
-		
-		free(old);
+
+		MEM_freeN(old);
 	}
 }
 
-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;
-	Entry *e;
+	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)
@@ -158,28 +164,30 @@
 {
 	int i;
 	
-	for (i=0; i<eh->nbuckets; i++) {
-		Entry *e;
+	for (i = 0; i<eh->nbuckets; i++) {
+		EdgeEntry *e;
 		
-		for (e= eh->buckets[i]; e; ) {
-			Entry *n= e->next;
+		for (e = eh->buckets[i]; e; ) {
+			EdgeEntry *n = e->next;
 			
 			if (valfreefp) valfreefp(e->val);
-			free(e);
+			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)
 {
 	BLI_edgehash_clear(eh, valfreefp);
-	
-	free(eh->buckets);
+
+	BLI_mempool_destroy(eh->epool);
+
+	MEM_freeN(eh->buckets);
 	MEM_freeN(eh);
 }
 
@@ -189,29 +197,29 @@
 struct EdgeHashIterator {
 	EdgeHash *eh;
 	int curBucket;
-	Entry *curEntry;
+	EdgeEntry *curEntry;
 };
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list