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).

This commit is contained in:
2011-11-28 20:21:44 +00:00
parent ed29b35a3f
commit eef0cdb1aa
3 changed files with 189 additions and 148 deletions

View File

@@ -75,8 +75,34 @@ typedef struct BMIter {
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

View File

@@ -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>
@@ -54,18 +56,6 @@ void *BMIter_AtIndex(struct BMesh *bm, const char htype, void *data, int index)
return val;
}
/*
* BMESH ITERATOR STEP
*
* Calls an iterators step fucntion to return
* the next element.
*/
void *BMIter_Step(BMIter *iter)
{
return iter->step(iter);
}
/*
* INIT ITERATOR
*
@@ -95,41 +85,44 @@ static void init_iterator(BMIter *iter)
* 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 *face_of_mesh_step(BMIter *iter)
*
*/
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_begin(BMIter *iter)
}
}
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 *edge_of_vert_step(BMIter *iter)
*
*/
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 @@ static void face_of_vert_begin(BMIter *iter)
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 *face_of_vert_step(BMIter *iter)
*
*/
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 @@ static void loop_of_vert_begin(BMIter *iter)
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 *loop_of_vert_step(BMIter *iter)
}
static void loops_of_edge_begin(BMIter *iter)
void bmiter__loops_of_edge_begin(BMIter *iter)
{
BMLoop *l;
@@ -253,7 +246,7 @@ static void loops_of_edge_begin(BMIter *iter)
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 @@ static void *loops_of_edge_step(BMIter *iter)
return NULL;
}
static void loops_of_loop_begin(BMIter *iter)
void bmiter__loops_of_loop_begin(BMIter *iter)
{
BMLoop *l;
@@ -283,7 +276,7 @@ static void loops_of_loop_begin(BMIter *iter)
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 *loops_of_loop_step(BMIter *iter)
*
*/
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_begin(BMIter *iter)
}
}
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 *face_of_edge_step(BMIter *iter)
*
*/
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 *vert_of_face_step(BMIter *iter)
*
*/
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 *edge_of_face_step(BMIter *iter)
*
*/
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 @@ static void *loop_of_face_step(BMIter *iter)
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);
}

View File

@@ -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.
*/
BM_INLINE void *BMIter_Step(BMIter *iter)
{
return iter->step(iter);
}
/*
* 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.
*
*/
BM_INLINE void *BMIter_New(BMIter *iter, BMesh *bm, const char htype, void *data)
{
/* int argtype; */
iter->htype = htype;
iter->bm = bm;
/* inlining optimizes out this switch when called with the defined type */
switch(htype){
case BM_VERTS_OF_MESH:
iter->begin = bmiter__vert_of_mesh_begin;
iter->step = bmiter__vert_of_mesh_step;
break;
case BM_EDGES_OF_MESH:
iter->begin = bmiter__edge_of_mesh_begin;
iter->step = bmiter__edge_of_mesh_step;
break;
case BM_FACES_OF_MESH:
iter->begin = bmiter__face_of_mesh_begin;
iter->step = bmiter__face_of_mesh_step;
break;
case BM_EDGES_OF_VERT:
if (!data)
return NULL;
iter->begin = bmiter__edge_of_vert_begin;
iter->step = bmiter__edge_of_vert_step;
iter->vdata = data;
break;
case BM_FACES_OF_VERT:
if (!data)
return NULL;
iter->begin = bmiter__face_of_vert_begin;
iter->step = bmiter__face_of_vert_step;
iter->vdata = data;
break;
case BM_LOOPS_OF_VERT:
if (!data)
return NULL;
iter->begin = bmiter__loop_of_vert_begin;
iter->step = bmiter__loop_of_vert_step;
iter->vdata = data;
break;
case BM_FACES_OF_EDGE:
if (!data)
return NULL;
iter->begin = bmiter__face_of_edge_begin;
iter->step = bmiter__face_of_edge_step;
iter->edata = data;
break;
case BM_VERTS_OF_FACE:
if (!data)
return NULL;
iter->begin = bmiter__vert_of_face_begin;
iter->step = bmiter__vert_of_face_step;
iter->pdata = data;
break;
case BM_EDGES_OF_FACE:
if (!data)
return NULL;
iter->begin = bmiter__edge_of_face_begin;
iter->step = bmiter__edge_of_face_step;
iter->pdata = data;
break;
case BM_LOOPS_OF_FACE:
if (!data)
return NULL;
iter->begin = bmiter__loop_of_face_begin;
iter->step = bmiter__loop_of_face_step;
iter->pdata = data;
break;
case BM_LOOPS_OF_LOOP:
if (!data)
return NULL;
iter->begin = bmiter__loops_of_loop_begin;
iter->step = bmiter__loops_of_loop_step;
iter->ldata = data;
break;
case BM_LOOPS_OF_EDGE:
if (!data)
return NULL;
iter->begin = bmiter__loops_of_edge_begin;
iter->step = bmiter__loops_of_edge_step;
iter->edata = data;
break;
default:
break;
}
iter->begin(iter);
return BMIter_Step(iter);
}
#endif