GSet, GHash: Add BLI_gset_add, since its common to add members to a set

also rename BLI_edgeset_reinsert -> BLI_edgeset_add, in this case its the same.
This commit is contained in:
Campbell Barton 2014-05-29 14:00:11 +10:00
parent 8bd4b7361b
commit 365ff66987
10 changed files with 39 additions and 16 deletions

View File

@ -2805,15 +2805,15 @@ void CDDM_calc_edges_tessface(DerivedMesh *dm)
eh = BLI_edgeset_new_ex(__func__, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(numFaces));
for (i = 0; i < numFaces; i++, mf++) {
BLI_edgeset_reinsert(eh, mf->v1, mf->v2);
BLI_edgeset_reinsert(eh, mf->v2, mf->v3);
BLI_edgeset_add(eh, mf->v1, mf->v2);
BLI_edgeset_add(eh, mf->v2, mf->v3);
if (mf->v4) {
BLI_edgeset_reinsert(eh, mf->v3, mf->v4);
BLI_edgeset_reinsert(eh, mf->v4, mf->v1);
BLI_edgeset_add(eh, mf->v3, mf->v4);
BLI_edgeset_add(eh, mf->v4, mf->v1);
}
else {
BLI_edgeset_reinsert(eh, mf->v3, mf->v1);
BLI_edgeset_add(eh, mf->v3, mf->v1);
}
}

View File

@ -1323,14 +1323,14 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
/* insert other near springs in edgeset AFTER bending springs are calculated (for selfcolls) */
for (i = 0; i < numedges; i++) { /* struct springs */
BLI_edgeset_reinsert(edgeset, medge[i].v1, medge[i].v2);
BLI_edgeset_add(edgeset, medge[i].v1, medge[i].v2);
}
for (i = 0; i < numfaces; i++) { /* edge springs */
if (mface[i].v4) {
BLI_edgeset_reinsert(edgeset, mface[i].v1, mface[i].v3);
BLI_edgeset_add(edgeset, mface[i].v1, mface[i].v3);
BLI_edgeset_reinsert(edgeset, mface[i].v2, mface[i].v4);
BLI_edgeset_add(edgeset, mface[i].v2, mface[i].v4);
}
}

View File

@ -71,7 +71,7 @@ static void pbvh_bmesh_node_finalize(PBVH *bvh, int node_index, const int cd_ver
v = l_iter->v;
if (!BLI_gset_haskey(n->bm_unique_verts, v)) {
if (BM_ELEM_CD_GET_INT(v, cd_vert_node_offset) != DYNTOPO_NODE_NONE) {
BLI_gset_reinsert(n->bm_other_verts, v, NULL);
BLI_gset_add(n->bm_other_verts, v);
}
else {
BLI_gset_insert(n->bm_unique_verts, v);

View File

@ -360,7 +360,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm,
MVert *mv0 = mvert + (ml[j_next].v);
MVert *mv1 = mvert + (ml[j].v);
if (BLI_edgeset_reinsert(eset, v0, v1)) {
if (BLI_edgeset_add(eset, v0, v1)) {
CCGEdge *e, *orige = ccgSubSurf_getFaceEdge(origf, j_next);
CCGEdgeHDL ehdl = SET_INT_IN_POINTER(mp->loopstart + j_next);
float crease;

View File

@ -102,7 +102,7 @@ EdgeSet *BLI_edgeset_new_ex(const char *info,
const unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT;
EdgeSet *BLI_edgeset_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT;
int BLI_edgeset_size(EdgeSet *es) ATTR_WARN_UNUSED_RESULT;
bool BLI_edgeset_reinsert(EdgeSet *es, unsigned int v0, unsigned int v1);
bool BLI_edgeset_add(EdgeSet *es, unsigned int v0, unsigned int v1);
void BLI_edgeset_insert(EdgeSet *es, unsigned int v0, unsigned int v1);
bool BLI_edgeset_haskey(EdgeSet *eh, unsigned int v0, unsigned int v1) ATTR_WARN_UNUSED_RESULT;
void BLI_edgeset_free(EdgeSet *es);

View File

@ -191,6 +191,7 @@ GSet *BLI_gset_new(GSetHashFP hashfp, GSetCmpFP cmpfp, const char *info) ATTR_M
int BLI_gset_size(GSet *gs) ATTR_WARN_UNUSED_RESULT;
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp);
void BLI_gset_insert(GSet *gh, void *key);
bool BLI_gset_add(GSet *gs, void *key);
bool BLI_gset_reinsert(GSet *gh, void *key, GSetKeyFreeFP keyfreefp);
bool BLI_gset_haskey(GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT;
bool BLI_gset_remove(GSet *gs, void *key, GSetKeyFreeFP keyfreefp);

View File

@ -900,6 +900,25 @@ void BLI_gset_insert(GSet *gs, void *key)
ghash_insert_ex_keyonly((GHash *)gs, key, hash);
}
/**
* A version of BLI_gset_insert which checks first if the key is in the set.
* \returns true if a new key has been added.
*
* \note GHash has no equivalent to this because typically the value would be different.
*/
bool BLI_gset_add(GSet *gs, void *key)
{
const unsigned int hash = ghash_keyhash((GHash *)gs, key);
Entry *e = ghash_lookup_entry_ex((GHash *)gs, key, hash);
if (e) {
return false;
}
else {
ghash_insert_ex_keyonly((GHash *)gs, key, hash);
return true;
}
}
/**
* Adds the key to the set (duplicates are managed).
* Matching #BLI_ghash_reinsert

View File

@ -588,9 +588,12 @@ void BLI_edgeset_insert(EdgeSet *es, unsigned int v0, unsigned int v1)
}
/**
* Assign a new value to a key that may already be in edgehash.
* A version of BLI_edgeset_insert which checks first if the key is in the set.
* \returns true if a new key has been added.
*
* \note EdgeHash has no equivalent to this because typically the value would be different.
*/
bool BLI_edgeset_reinsert(EdgeSet *es, unsigned int v0, unsigned int v1)
bool BLI_edgeset_add(EdgeSet *es, unsigned int v0, unsigned int v1)
{
unsigned int hash;
EdgeEntry *e;

View File

@ -919,8 +919,8 @@ static void *bmw_FaceLoopWalker_step(BMWalker *walker)
}
/* both may already exist */
BLI_gset_reinsert(walker->visit_set_alt, l->e, NULL);
BLI_gset_reinsert(walker->visit_set, l->f, NULL);
BLI_gset_add(walker->visit_set_alt, l->e);
BLI_gset_add(walker->visit_set, l->f);
}
return f;

View File

@ -2595,7 +2595,7 @@ static size_t animdata_filter_remove_duplis(ListBase *anim_data)
* - just use ale->data for now, though it would be nicer to involve
* ale->type in combination too to capture corner cases (where same data performs differently)
*/
if (BLI_gset_reinsert(gs, ale->data, NULL)) {
if (BLI_gset_add(gs, ale->data)) {
/* this entry is 'unique' and can be kept */
items++;
}