[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42232] branches/bmesh/blender/source/ blender/bmesh: inline BMIter_Step() and BMIter_New() since the compiler can optimize out the switch statement when BMIter_New() is called with the define (which is common).

Campbell Barton ideasman42 at gmail.com
Mon Nov 28 21:21:54 CET 2011


Revision: 42232
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42232
Author:   campbellbarton
Date:     2011-11-28 20:21:44 +0000 (Mon, 28 Nov 2011)
Log Message:
-----------
inline BMIter_Step() and BMIter_New() since the compiler can optimize out the switch statement when BMIter_New() is called with the define (which is common).

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators_inline.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h	2011-11-28 19:49:05 UTC (rev 42231)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h	2011-11-28 20:21:44 UTC (rev 42232)
@@ -75,8 +75,34 @@
 	int htype, count;
 }BMIter;
 
-void *BMIter_New(struct BMIter *iter, struct BMesh *bm, const char htype, void *data);
-void *BMIter_Step(struct BMIter *iter);
 void *BMIter_AtIndex(struct BMesh *bm, const char htype, void *data, int index);
 
+/* private for bmesh_iterators_inline.c */
+void  bmiter__vert_of_mesh_begin(struct BMIter *iter);
+void *bmiter__vert_of_mesh_step(struct BMIter *iter);
+void  bmiter__edge_of_mesh_begin(struct BMIter *iter);
+void *bmiter__edge_of_mesh_step(struct BMIter *iter);
+void  bmiter__face_of_mesh_begin(struct BMIter *iter);
+void *bmiter__face_of_mesh_step(struct BMIter *iter);
+void  bmiter__edge_of_vert_begin(struct BMIter *iter);
+void *bmiter__edge_of_vert_step(struct BMIter *iter);
+void  bmiter__face_of_vert_begin(struct BMIter *iter);
+void *bmiter__face_of_vert_step(struct BMIter *iter);
+void  bmiter__loop_of_vert_begin(struct BMIter *iter);
+void *bmiter__loop_of_vert_step(struct BMIter *iter);
+void  bmiter__loops_of_edge_begin(struct BMIter *iter);
+void *bmiter__loops_of_edge_step(struct BMIter *iter);
+void  bmiter__loops_of_loop_begin(struct BMIter *iter);
+void *bmiter__loops_of_loop_step(struct BMIter *iter);
+void  bmiter__face_of_edge_begin(struct BMIter *iter);
+void *bmiter__face_of_edge_step(struct BMIter *iter);
+void  bmiter__vert_of_face_begin(struct BMIter *iter);
+void *bmiter__vert_of_face_step(struct BMIter *iter);
+void  bmiter__edge_of_face_begin(struct BMIter *iter);
+void *bmiter__edge_of_face_step(struct BMIter *iter);
+void  bmiter__loop_of_face_begin(struct BMIter *iter);
+void *bmiter__loop_of_face_step(struct BMIter *iter);
+
+#include "intern/bmesh_iterators_inline.c"
+
 #endif

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c	2011-11-28 19:49:05 UTC (rev 42231)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c	2011-11-28 20:21:44 UTC (rev 42232)
@@ -24,6 +24,8 @@
  *  \ingroup bmesh
  *
  * Functions to abstract looping over bmesh data structures.
+ *
+ * See: bmesh_iterators_inlin.c too, some functions are here for speed reasons.
  */
 
 #include <string.h>
@@ -55,18 +57,6 @@
 }
 
 /*
- *	BMESH ITERATOR STEP
- *
- *  Calls an iterators step fucntion to return
- *  the next element.
-*/
-
-void *BMIter_Step(BMIter *iter)
-{
-	return iter->step(iter);
-}
-
-/*
  * INIT ITERATOR
  *
  * Clears the internal state of an iterator
@@ -95,41 +85,44 @@
  * When the end of a sequence is
  * reached, next should always equal NULL
  *
-*/
+ * The 'bmiter__' prefix is used because these are used in
+ * bmesh_iterators_inine.c but should otherwise be seen as
+ * private.
+ */
 
 /*
  * VERT OF MESH CALLBACKS
  *
 */
 
-static void vert_of_mesh_begin(BMIter *iter)
+void bmiter__vert_of_mesh_begin(BMIter *iter)
 {
 	BLI_mempool_iternew(iter->bm->vpool, &iter->pooliter);
 }
 
-static void *vert_of_mesh_step(BMIter *iter)
+void  *bmiter__vert_of_mesh_step(BMIter *iter)
 {
 	return BLI_mempool_iterstep(&iter->pooliter);
 
 }
 
-static void edge_of_mesh_begin(BMIter *iter)
+void  bmiter__edge_of_mesh_begin(BMIter *iter)
 {
 	BLI_mempool_iternew(iter->bm->epool, &iter->pooliter);
 }
 
-static void *edge_of_mesh_step(BMIter *iter)
+void  *bmiter__edge_of_mesh_step(BMIter *iter)
 {
 	return BLI_mempool_iterstep(&iter->pooliter);
 
 }
 
-static void face_of_mesh_begin(BMIter *iter)
+void  bmiter__face_of_mesh_begin(BMIter *iter)
 {
 	BLI_mempool_iternew(iter->bm->fpool, &iter->pooliter);
 }
 
-static void *face_of_mesh_step(BMIter *iter)
+void  *bmiter__face_of_mesh_step(BMIter *iter)
 {
 	return BLI_mempool_iterstep(&iter->pooliter);
 
@@ -140,7 +133,7 @@
  *
 */
 
-static void edge_of_vert_begin(BMIter *iter)
+void  bmiter__edge_of_vert_begin(BMIter *iter)
 {
 	init_iterator(iter);
 	if(iter->vdata->e){
@@ -149,7 +142,7 @@
 	}
 }
 
-static void *edge_of_vert_step(BMIter *iter)
+void  *bmiter__edge_of_vert_step(BMIter *iter)
 {
 	BMEdge *current = iter->nextedge;
 
@@ -166,7 +159,7 @@
  *
 */
 
-static void face_of_vert_begin(BMIter *iter)
+void  bmiter__face_of_vert_begin(BMIter *iter)
 {
 	init_iterator(iter);
 	iter->count = 0;
@@ -179,7 +172,7 @@
 		iter->nextloop = iter->firstloop;
 	}
 }
-static void *face_of_vert_step(BMIter *iter)
+void  *bmiter__face_of_vert_step(BMIter *iter)
 {
 	BMLoop *current = iter->nextloop;
 
@@ -206,7 +199,7 @@
  *
 */
 
-static void loop_of_vert_begin(BMIter *iter)
+void  bmiter__loop_of_vert_begin(BMIter *iter)
 {
 	init_iterator(iter);
 	iter->count = 0;
@@ -219,7 +212,7 @@
 		iter->nextloop = iter->firstloop;
 	}
 }
-static void *loop_of_vert_step(BMIter *iter)
+void  *bmiter__loop_of_vert_step(BMIter *iter)
 {
 	BMLoop *current = iter->nextloop;
 
@@ -241,7 +234,7 @@
 }
 
 
-static void loops_of_edge_begin(BMIter *iter)
+void  bmiter__loops_of_edge_begin(BMIter *iter)
 {
 	BMLoop *l;
 
@@ -253,7 +246,7 @@
 	iter->firstloop = iter->nextloop = l;
 }
 
-static void *loops_of_edge_step(BMIter *iter)
+void  *bmiter__loops_of_edge_step(BMIter *iter)
 {
 	BMLoop *current = iter->nextloop;
 
@@ -267,7 +260,7 @@
 	return NULL;
 }
 
-static void loops_of_loop_begin(BMIter *iter)
+void  bmiter__loops_of_loop_begin(BMIter *iter)
 {
 	BMLoop *l;
 
@@ -283,7 +276,7 @@
 		iter->nextloop = NULL;
 }
 
-static void *loops_of_loop_step(BMIter *iter)
+void  *bmiter__loops_of_loop_step(BMIter *iter)
 {
 	BMLoop *current = iter->nextloop;
 	
@@ -299,7 +292,7 @@
  *
 */
 
-static void face_of_edge_begin(BMIter *iter)
+void  bmiter__face_of_edge_begin(BMIter *iter)
 {
 	init_iterator(iter);
 	
@@ -309,7 +302,7 @@
 	}
 }
 
-static void *face_of_edge_step(BMIter *iter)
+void  *bmiter__face_of_edge_step(BMIter *iter)
 {
 	BMLoop *current = iter->nextloop;
 
@@ -325,13 +318,13 @@
  *
 */
 
-static void vert_of_face_begin(BMIter *iter)
+void  bmiter__vert_of_face_begin(BMIter *iter)
 {
 	init_iterator(iter);
 	iter->firstloop = iter->nextloop = ((BMLoopList*)iter->pdata->loops.first)->first;
 }
 
-static void *vert_of_face_step(BMIter *iter)
+void  *bmiter__vert_of_face_step(BMIter *iter)
 {
 	BMLoop *current = iter->nextloop;
 
@@ -347,13 +340,13 @@
  *
 */
 
-static void edge_of_face_begin(BMIter *iter)
+void  bmiter__edge_of_face_begin(BMIter *iter)
 {
 	init_iterator(iter);
 	iter->firstloop = iter->nextloop = ((BMLoopList*)iter->pdata->loops.first)->first;
 }
 
-static void *edge_of_face_step(BMIter *iter)
+void  *bmiter__edge_of_face_step(BMIter *iter)
 {
 	BMLoop *current = iter->nextloop;
 
@@ -369,13 +362,13 @@
  *
 */
 
-static void loop_of_face_begin(BMIter *iter)
+void  bmiter__loop_of_face_begin(BMIter *iter)
 {
 	init_iterator(iter);
 	iter->firstloop = iter->nextloop = bm_firstfaceloop(iter->pdata);
 }
 
-static void *loop_of_face_step(BMIter *iter)
+void  *bmiter__loop_of_face_step(BMIter *iter)
 {
 	BMLoop *current = iter->nextloop;
 
@@ -384,111 +377,3 @@
 
 	return current;
 }
-
-/*
- * BMESH ITERATOR INIT
- *
- * Takes a bmesh iterator structure and fills
- * it with the appropriate function pointers based
- * upon its type and then calls BMeshIter_step()
- * to return the first element of the iterator.
- *
-*/
-void *BMIter_New(BMIter *iter, BMesh *bm, const char htype, void *data)
-{
-	/* int argtype; */
-	iter->htype = htype;
-	iter->bm = bm;
-
-	switch(htype){
-		case BM_VERTS_OF_MESH:
-			iter->begin = vert_of_mesh_begin;
-			iter->step = vert_of_mesh_step;
-			break;
-		case BM_EDGES_OF_MESH:
-			iter->begin = edge_of_mesh_begin;
-			iter->step = edge_of_mesh_step;
-			break;
-		case BM_FACES_OF_MESH:
-			iter->begin = face_of_mesh_begin;
-			iter->step = face_of_mesh_step;
-			break;
-		case BM_EDGES_OF_VERT:
-			if (!data)
-				return NULL;
-
-			iter->begin = edge_of_vert_begin;
-			iter->step = edge_of_vert_step;
-			iter->vdata = data;
-			break;
-		case BM_FACES_OF_VERT:
-			if (!data)
-				return NULL;
-
-			iter->begin = face_of_vert_begin;
-			iter->step = face_of_vert_step;
-			iter->vdata = data;
-			break;
-		case BM_LOOPS_OF_VERT:
-			if (!data)
-				return NULL;
-
-			iter->begin = loop_of_vert_begin;
-			iter->step = loop_of_vert_step;
-			iter->vdata = data;
-			break;
-		case BM_FACES_OF_EDGE:
-			if (!data)
-				return NULL;
-
-			iter->begin = face_of_edge_begin;
-			iter->step = face_of_edge_step;
-			iter->edata = data;
-			break;
-		case BM_VERTS_OF_FACE:
-			if (!data)
-				return NULL;
-
-			iter->begin = vert_of_face_begin;
-			iter->step = vert_of_face_step;
-			iter->pdata = data;
-			break;
-		case BM_EDGES_OF_FACE:
-			if (!data)
-				return NULL;
-
-			iter->begin = edge_of_face_begin;
-			iter->step = edge_of_face_step;
-			iter->pdata = data;
-			break;
-		case BM_LOOPS_OF_FACE:
-			if (!data)
-				return NULL;
-
-			iter->begin = loop_of_face_begin;
-			iter->step = loop_of_face_step;
-			iter->pdata = data;
-			break;
-		case BM_LOOPS_OF_LOOP:
-			if (!data)
-				return NULL;
-
-			iter->begin = loops_of_loop_begin;
-			iter->step = loops_of_loop_step;
-			iter->ldata = data;
-			break;
-		case BM_LOOPS_OF_EDGE:
-			if (!data)
-				return NULL;
-
-			iter->begin = loops_of_edge_begin;
-			iter->step = loops_of_edge_step;
-			iter->edata = data;
-			break;
-		default:
-			break;
-	}
-
-	iter->begin(iter);
-	return BMIter_Step(iter);
-}

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators_inline.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators_inline.c	2011-11-28 19:49:05 UTC (rev 42231)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators_inline.c	2011-11-28 20:21:44 UTC (rev 42232)
@@ -23,12 +23,142 @@
 /** \file blender/bmesh/intern/bmesh_iterators_inline.c
  *  \ingroup bmesh
  *
- * TODO
+ * BMesh inline iterator functions.
  */
 
 #ifndef BM_ITERATORS_INLINE_C
 #define BM_ITERATORS_INLINE_C
 
+#include "bmesh.h"
 
+#ifndef NULL
+#  define NULL (void *)0
+#endif
 
+/* inline here optimizes out the switch statement when called with
+ * constant values (which is very common), nicer for loop-in-loop situations */
+
+/*
+ *	BMESH ITERATOR STEP
+ *
+ *  Calls an iterators step fucntion to return
+ *  the next element.
+*/
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list