Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenlib/intern/edgehash.c')
-rw-r--r--source/blender/blenlib/intern/edgehash.c576
1 files changed, 296 insertions, 280 deletions
diff --git a/source/blender/blenlib/intern/edgehash.c b/source/blender/blenlib/intern/edgehash.c
index 564090f734e..528f206c02e 100644
--- a/source/blender/blenlib/intern/edgehash.c
+++ b/source/blender/blenlib/intern/edgehash.c
@@ -37,20 +37,20 @@ typedef struct _EdgeHash_Edge Edge;
typedef struct _EdgeHash_Entry EdgeHashEntry;
typedef struct EdgeHash {
- EdgeHashEntry *entries;
- int32_t *map;
- uint32_t slot_mask;
- uint capacity_exp;
- uint length;
- uint dummy_count;
+ EdgeHashEntry *entries;
+ int32_t *map;
+ uint32_t slot_mask;
+ uint capacity_exp;
+ uint length;
+ uint dummy_count;
} EdgeHash;
typedef struct EdgeSet {
- Edge *entries;
- int32_t *map;
- uint32_t slot_mask;
- uint capacity_exp;
- uint length;
+ Edge *entries;
+ int32_t *map;
+ uint32_t slot_mask;
+ uint capacity_exp;
+ uint length;
} EdgeSet;
/* -------------------------------------------------------------------- */
@@ -59,18 +59,23 @@ typedef struct EdgeSet {
#define ENTRIES_CAPACITY(container) (uint)(1 << (container)->capacity_exp)
#define MAP_CAPACITY(container) (uint)(1 << ((container)->capacity_exp + 1))
-#define CLEAR_MAP(container) memset((container)->map, 0xFF, sizeof(int32_t) * MAP_CAPACITY(container))
-#define UPDATE_SLOT_MASK(container) { (container)->slot_mask = MAP_CAPACITY(container) - 1; } ((void)0)
+#define CLEAR_MAP(container) \
+ memset((container)->map, 0xFF, sizeof(int32_t) * MAP_CAPACITY(container))
+#define UPDATE_SLOT_MASK(container) \
+ { \
+ (container)->slot_mask = MAP_CAPACITY(container) - 1; \
+ } \
+ ((void)0)
#define PERTURB_SHIFT 5
#define ITER_SLOTS(CONTAINER, EDGE, SLOT, INDEX) \
- uint32_t hash = calc_edge_hash(EDGE); \
- uint32_t mask = (CONTAINER)->slot_mask; \
- uint32_t perturb = hash; \
- int32_t *map = (CONTAINER)->map; \
- uint32_t SLOT = mask & hash; \
- int INDEX = map[SLOT]; \
- for (;;SLOT = mask & ((5 * SLOT) + 1 + perturb), perturb >>= PERTURB_SHIFT, INDEX = map[SLOT])
+ uint32_t hash = calc_edge_hash(EDGE); \
+ uint32_t mask = (CONTAINER)->slot_mask; \
+ uint32_t perturb = hash; \
+ int32_t *map = (CONTAINER)->map; \
+ uint32_t SLOT = mask & hash; \
+ int INDEX = map[SLOT]; \
+ for (;; SLOT = mask & ((5 * SLOT) + 1 + perturb), perturb >>= PERTURB_SHIFT, INDEX = map[SLOT])
#define SLOT_EMPTY -1
#define SLOT_DUMMY -2
@@ -85,38 +90,38 @@ typedef struct EdgeSet {
BLI_INLINE uint32_t calc_edge_hash(Edge edge)
{
- return (edge.v_low << 8) ^ edge.v_high;
+ return (edge.v_low << 8) ^ edge.v_high;
}
BLI_INLINE Edge init_edge(uint v0, uint v1)
{
- /* If there are use cases where we need this it could be removed (or flag to allow),
- * for now this helps avoid incorrect usage (creating degenerate geometry). */
- BLI_assert(v0 != v1);
- Edge edge;
- if (v0 < v1) {
- edge.v_low = v0;
- edge.v_high = v1;
- }
- else {
- edge.v_low = v1;
- edge.v_high = v0;
- }
- return edge;
+ /* If there are use cases where we need this it could be removed (or flag to allow),
+ * for now this helps avoid incorrect usage (creating degenerate geometry). */
+ BLI_assert(v0 != v1);
+ Edge edge;
+ if (v0 < v1) {
+ edge.v_low = v0;
+ edge.v_high = v1;
+ }
+ else {
+ edge.v_low = v1;
+ edge.v_high = v0;
+ }
+ return edge;
}
BLI_INLINE bool edges_equal(Edge e1, Edge e2)
{
- return memcmp(&e1, &e2, sizeof(Edge)) == 0;
+ return memcmp(&e1, &e2, sizeof(Edge)) == 0;
}
static uint calc_capacity_exp_for_reserve(uint reserve)
{
- uint result = 1;
- while (reserve >>= 1) {
- result++;
- }
- return result;
+ uint result = 1;
+ while (reserve >>= 1) {
+ result++;
+ }
+ return result;
}
/** \} */
@@ -125,89 +130,94 @@ static uint calc_capacity_exp_for_reserve(uint reserve)
/** \name Internal Utility API
* \{ */
-#define EH_INDEX_HAS_EDGE(eh, index, edge) ((index) >= 0 && edges_equal((edge), (eh)->entries[index].edge))
+#define EH_INDEX_HAS_EDGE(eh, index, edge) \
+ ((index) >= 0 && edges_equal((edge), (eh)->entries[index].edge))
static void edgehash_free_values(EdgeHash *eh, EdgeHashFreeFP free_value)
{
- if (free_value) {
- for (uint i = 0; i < eh->length; i++) {
- free_value(eh->entries[i].value);
- }
- }
+ if (free_value) {
+ for (uint i = 0; i < eh->length; i++) {
+ free_value(eh->entries[i].value);
+ }
+ }
}
BLI_INLINE void edgehash_insert_index(EdgeHash *eh, Edge edge, uint entry_index)
{
- ITER_SLOTS(eh, edge, slot, index) {
- if (index == SLOT_EMPTY) {
- eh->map[slot] = (int32_t)entry_index;
- break;
- }
- }
+ ITER_SLOTS(eh, edge, slot, index)
+ {
+ if (index == SLOT_EMPTY) {
+ eh->map[slot] = (int32_t)entry_index;
+ break;
+ }
+ }
}
BLI_INLINE EdgeHashEntry *edgehash_insert_at_slot(EdgeHash *eh, uint slot, Edge edge, void *value)
{
- EdgeHashEntry *entry = &eh->entries[eh->length];
- entry->edge = edge;
- entry->value = value;
- eh->map[slot] = (int32_t)eh->length;
- eh->length++;
- return entry;
+ EdgeHashEntry *entry = &eh->entries[eh->length];
+ entry->edge = edge;
+ entry->value = value;
+ eh->map[slot] = (int32_t)eh->length;
+ eh->length++;
+ return entry;
}
BLI_INLINE bool edgehash_ensure_can_insert(EdgeHash *eh)
{
- if (UNLIKELY(ENTRIES_CAPACITY(eh) <= eh->length + eh->dummy_count)) {
- eh->capacity_exp++;
- UPDATE_SLOT_MASK(eh);
- eh->dummy_count = 0;
- eh->entries = MEM_reallocN(eh->entries, sizeof(EdgeHashEntry) * ENTRIES_CAPACITY(eh));
- eh->map = MEM_reallocN(eh->map, sizeof(int32_t) * MAP_CAPACITY(eh));
- CLEAR_MAP(eh);
- for (uint i = 0; i < eh->length; i++) {
- edgehash_insert_index(eh, eh->entries[i].edge, i);
- }
- return true;
- }
- return false;
+ if (UNLIKELY(ENTRIES_CAPACITY(eh) <= eh->length + eh->dummy_count)) {
+ eh->capacity_exp++;
+ UPDATE_SLOT_MASK(eh);
+ eh->dummy_count = 0;
+ eh->entries = MEM_reallocN(eh->entries, sizeof(EdgeHashEntry) * ENTRIES_CAPACITY(eh));
+ eh->map = MEM_reallocN(eh->map, sizeof(int32_t) * MAP_CAPACITY(eh));
+ CLEAR_MAP(eh);
+ for (uint i = 0; i < eh->length; i++) {
+ edgehash_insert_index(eh, eh->entries[i].edge, i);
+ }
+ return true;
+ }
+ return false;
}
BLI_INLINE EdgeHashEntry *edgehash_insert(EdgeHash *eh, Edge edge, void *value)
{
- ITER_SLOTS(eh, edge, slot, index) {
- if (index == SLOT_EMPTY) {
- return edgehash_insert_at_slot(eh, slot, edge, value);
- }
- else if (index == SLOT_DUMMY) {
- eh->dummy_count--;
- return edgehash_insert_at_slot(eh, slot, edge, value);
- }
- }
+ ITER_SLOTS(eh, edge, slot, index)
+ {
+ if (index == SLOT_EMPTY) {
+ return edgehash_insert_at_slot(eh, slot, edge, value);
+ }
+ else if (index == SLOT_DUMMY) {
+ eh->dummy_count--;
+ return edgehash_insert_at_slot(eh, slot, edge, value);
+ }
+ }
}
BLI_INLINE EdgeHashEntry *edgehash_lookup_entry(EdgeHash *eh, uint v0, uint v1)
{
- Edge edge = init_edge(v0, v1);
+ Edge edge = init_edge(v0, v1);
- ITER_SLOTS(eh, edge, slot, index) {
- if (EH_INDEX_HAS_EDGE(eh, index, edge)) {
- return &eh->entries[index];
- }
- else if (index == SLOT_EMPTY) {
- return NULL;
- }
- }
+ ITER_SLOTS(eh, edge, slot, index)
+ {
+ if (EH_INDEX_HAS_EDGE(eh, index, edge)) {
+ return &eh->entries[index];
+ }
+ else if (index == SLOT_EMPTY) {
+ return NULL;
+ }
+ }
}
BLI_INLINE void edgehash_change_index(EdgeHash *eh, Edge edge, int new_index)
{
- ITER_SLOTS(eh, edge, slot, index) {
- if (EH_INDEX_HAS_EDGE(eh, index, edge)) {
- eh->map[slot] = new_index;
- break;
- }
- }
+ ITER_SLOTS(eh, edge, slot, index)
+ {
+ if (EH_INDEX_HAS_EDGE(eh, index, edge)) {
+ eh->map[slot] = new_index;
+ break;
+ }
+ }
}
/** \} */
@@ -218,52 +228,51 @@ BLI_INLINE void edgehash_change_index(EdgeHash *eh, Edge edge, int new_index)
EdgeHash *BLI_edgehash_new_ex(const char *info, const uint reserve)
{
- EdgeHash *eh = MEM_mallocN(sizeof(EdgeHash), info);
- eh->capacity_exp = calc_capacity_exp_for_reserve(reserve);
- UPDATE_SLOT_MASK(eh);
- eh->length = 0;
- eh->dummy_count = 0;
- eh->entries = MEM_calloc_arrayN(sizeof(EdgeHashEntry), ENTRIES_CAPACITY(eh), "eh entries");
- eh->map = MEM_malloc_arrayN(sizeof(int32_t), MAP_CAPACITY(eh), "eh map");
- CLEAR_MAP(eh);
- return eh;
+ EdgeHash *eh = MEM_mallocN(sizeof(EdgeHash), info);
+ eh->capacity_exp = calc_capacity_exp_for_reserve(reserve);
+ UPDATE_SLOT_MASK(eh);
+ eh->length = 0;
+ eh->dummy_count = 0;
+ eh->entries = MEM_calloc_arrayN(sizeof(EdgeHashEntry), ENTRIES_CAPACITY(eh), "eh entries");
+ eh->map = MEM_malloc_arrayN(sizeof(int32_t), MAP_CAPACITY(eh), "eh map");
+ CLEAR_MAP(eh);
+ return eh;
}
EdgeHash *BLI_edgehash_new(const char *info)
{
- return BLI_edgehash_new_ex(info, 1 << CAPACITY_EXP_DEFAULT);
+ return BLI_edgehash_new_ex(info, 1 << CAPACITY_EXP_DEFAULT);
}
void BLI_edgehash_free(EdgeHash *eh, EdgeHashFreeFP free_value)
{
- edgehash_free_values(eh, free_value);
- MEM_freeN(eh->map);
- MEM_freeN(eh->entries);
- MEM_freeN(eh);
+ edgehash_free_values(eh, free_value);
+ MEM_freeN(eh->map);
+ MEM_freeN(eh->entries);
+ MEM_freeN(eh);
}
void BLI_edgehash_print(EdgeHash *eh)
{
- printf("Edgehash at %p:\n", eh);
- printf(" Map:\n");
- for (uint i = 0; i < MAP_CAPACITY(eh); i++) {
- int index = eh->map[i];
- printf(" %u: %d", i, index);
- if (index >= 0) {
- EdgeHashEntry entry = eh->entries[index];
- printf(" -> (%u, %u) -> %p", entry.edge.v_low, entry.edge.v_high, entry.value);
- }
- printf("\n");
- }
- printf(" Entries:\n");
- for (uint i = 0; i < ENTRIES_CAPACITY(eh); i++) {
- if (i == eh->length) {
- printf(" **** below is rest capacity ****\n");
- }
- EdgeHashEntry entry = eh->entries[i];
- printf(" %u: (%u, %u) -> %p\n", i, entry.edge.v_low, entry.edge.v_high, entry.value);
-
- }
+ printf("Edgehash at %p:\n", eh);
+ printf(" Map:\n");
+ for (uint i = 0; i < MAP_CAPACITY(eh); i++) {
+ int index = eh->map[i];
+ printf(" %u: %d", i, index);
+ if (index >= 0) {
+ EdgeHashEntry entry = eh->entries[index];
+ printf(" -> (%u, %u) -> %p", entry.edge.v_low, entry.edge.v_high, entry.value);
+ }
+ printf("\n");
+ }
+ printf(" Entries:\n");
+ for (uint i = 0; i < ENTRIES_CAPACITY(eh); i++) {
+ if (i == eh->length) {
+ printf(" **** below is rest capacity ****\n");
+ }
+ EdgeHashEntry entry = eh->entries[i];
+ printf(" %u: (%u, %u) -> %p\n", i, entry.edge.v_low, entry.edge.v_high, entry.value);
+ }
}
/**
@@ -272,9 +281,9 @@ void BLI_edgehash_print(EdgeHash *eh)
*/
void BLI_edgehash_insert(EdgeHash *eh, uint v0, uint v1, void *value)
{
- edgehash_ensure_can_insert(eh);
- Edge edge = init_edge(v0, v1);
- edgehash_insert(eh, edge, value);
+ edgehash_ensure_can_insert(eh);
+ Edge edge = init_edge(v0, v1);
+ edgehash_insert(eh, edge, value);
}
/**
@@ -282,23 +291,24 @@ void BLI_edgehash_insert(EdgeHash *eh, uint v0, uint v1, void *value)
*/
bool BLI_edgehash_reinsert(EdgeHash *eh, uint v0, uint v1, void *value)
{
- Edge edge = init_edge(v0, v1);
-
- ITER_SLOTS(eh, edge, slot, index) {
- if (EH_INDEX_HAS_EDGE(eh, index, edge)) {
- eh->entries[index].value = value;
- return false;
- }
- else if (index == SLOT_EMPTY) {
- if (edgehash_ensure_can_insert(eh)) {
- edgehash_insert(eh, edge, value);
- }
- else {
- edgehash_insert_at_slot(eh, slot, edge, value);
- }
- return true;
- }
- }
+ Edge edge = init_edge(v0, v1);
+
+ ITER_SLOTS(eh, edge, slot, index)
+ {
+ if (EH_INDEX_HAS_EDGE(eh, index, edge)) {
+ eh->entries[index].value = value;
+ return false;
+ }
+ else if (index == SLOT_EMPTY) {
+ if (edgehash_ensure_can_insert(eh)) {
+ edgehash_insert(eh, edge, value);
+ }
+ else {
+ edgehash_insert_at_slot(eh, slot, edge, value);
+ }
+ return true;
+ }
+ }
}
/**
@@ -306,8 +316,8 @@ bool BLI_edgehash_reinsert(EdgeHash *eh, uint v0, uint v1, void *value)
*/
void *BLI_edgehash_lookup_default(EdgeHash *eh, uint v0, uint v1, void *default_value)
{
- EdgeHashEntry *entry = edgehash_lookup_entry(eh, v0, v1);
- return entry ? entry->value : default_value;
+ EdgeHashEntry *entry = edgehash_lookup_entry(eh, v0, v1);
+ return entry ? entry->value : default_value;
}
/**
@@ -318,8 +328,8 @@ void *BLI_edgehash_lookup_default(EdgeHash *eh, uint v0, uint v1, void *default_
*/
void *BLI_edgehash_lookup(EdgeHash *eh, uint v0, uint v1)
{
- EdgeHashEntry *entry = edgehash_lookup_entry(eh, v0, v1);
- return entry ? entry->value : NULL;
+ EdgeHashEntry *entry = edgehash_lookup_entry(eh, v0, v1);
+ return entry ? entry->value : NULL;
}
/**
@@ -328,8 +338,8 @@ void *BLI_edgehash_lookup(EdgeHash *eh, uint v0, uint v1)
*/
void **BLI_edgehash_lookup_p(EdgeHash *eh, uint v0, uint v1)
{
- EdgeHashEntry *entry = edgehash_lookup_entry(eh, v0, v1);
- return entry ? &entry->value : NULL;
+ EdgeHashEntry *entry = edgehash_lookup_entry(eh, v0, v1);
+ return entry ? &entry->value : NULL;
}
/**
@@ -348,23 +358,24 @@ void **BLI_edgehash_lookup_p(EdgeHash *eh, uint v0, uint v1)
*/
bool BLI_edgehash_ensure_p(EdgeHash *eh, uint v0, uint v1, void ***r_value)
{
- Edge edge = init_edge(v0, v1);
-
- ITER_SLOTS(eh, edge, slot, index) {
- if (EH_INDEX_HAS_EDGE(eh, index, edge)) {
- *r_value = &eh->entries[index].value;
- return true;
- }
- else if (index == SLOT_EMPTY) {
- if (edgehash_ensure_can_insert(eh)) {
- *r_value = &edgehash_insert(eh, edge, NULL)->value;
- }
- else {
- *r_value = &edgehash_insert_at_slot(eh, slot, edge, NULL)->value;
- }
- return false;
- }
- }
+ Edge edge = init_edge(v0, v1);
+
+ ITER_SLOTS(eh, edge, slot, index)
+ {
+ if (EH_INDEX_HAS_EDGE(eh, index, edge)) {
+ *r_value = &eh->entries[index].value;
+ return true;
+ }
+ else if (index == SLOT_EMPTY) {
+ if (edgehash_ensure_can_insert(eh)) {
+ *r_value = &edgehash_insert(eh, edge, NULL)->value;
+ }
+ else {
+ *r_value = &edgehash_insert_at_slot(eh, slot, edge, NULL)->value;
+ }
+ return false;
+ }
+ }
}
/**
@@ -376,12 +387,12 @@ bool BLI_edgehash_ensure_p(EdgeHash *eh, uint v0, uint v1, void ***r_value)
*/
bool BLI_edgehash_remove(EdgeHash *eh, uint v0, uint v1, EdgeHashFreeFP free_value)
{
- uint old_length = eh->length;
- void *value = BLI_edgehash_popkey(eh, v0, v1);
- if (free_value && value) {
- free_value(value);
- }
- return old_length > eh->length;
+ uint old_length = eh->length;
+ void *value = BLI_edgehash_popkey(eh, v0, v1);
+ if (free_value && value) {
+ free_value(value);
+ }
+ return old_length > eh->length;
}
/* same as above but return the value,
@@ -394,24 +405,25 @@ bool BLI_edgehash_remove(EdgeHash *eh, uint v0, uint v1, EdgeHashFreeFP free_val
*/
void *BLI_edgehash_popkey(EdgeHash *eh, uint v0, uint v1)
{
- Edge edge = init_edge(v0, v1);
-
- ITER_SLOTS(eh, edge, slot, index) {
- if (EH_INDEX_HAS_EDGE(eh, index, edge)) {
- void *value = eh->entries[index].value;
- eh->length--;
- eh->dummy_count++;
- eh->map[slot] = SLOT_DUMMY;
- eh->entries[index] = eh->entries[eh->length];
- if ((uint)index < eh->length) {
- edgehash_change_index(eh, eh->entries[index].edge, index);
- }
- return value;
- }
- else if (index == SLOT_EMPTY) {
- return NULL;
- }
- }
+ Edge edge = init_edge(v0, v1);
+
+ ITER_SLOTS(eh, edge, slot, index)
+ {
+ if (EH_INDEX_HAS_EDGE(eh, index, edge)) {
+ void *value = eh->entries[index].value;
+ eh->length--;
+ eh->dummy_count++;
+ eh->map[slot] = SLOT_DUMMY;
+ eh->entries[index] = eh->entries[eh->length];
+ if ((uint)index < eh->length) {
+ edgehash_change_index(eh, eh->entries[index].edge, index);
+ }
+ return value;
+ }
+ else if (index == SLOT_EMPTY) {
+ return NULL;
+ }
+ }
}
/**
@@ -419,7 +431,7 @@ void *BLI_edgehash_popkey(EdgeHash *eh, uint v0, uint v1)
*/
bool BLI_edgehash_haskey(EdgeHash *eh, uint v0, uint v1)
{
- return edgehash_lookup_entry(eh, v0, v1) != NULL;
+ return edgehash_lookup_entry(eh, v0, v1) != NULL;
}
/**
@@ -427,7 +439,7 @@ bool BLI_edgehash_haskey(EdgeHash *eh, uint v0, uint v1)
*/
int BLI_edgehash_len(EdgeHash *eh)
{
- return (int)eh->length;
+ return (int)eh->length;
}
/**
@@ -435,12 +447,12 @@ int BLI_edgehash_len(EdgeHash *eh)
*/
void BLI_edgehash_clear_ex(EdgeHash *eh, EdgeHashFreeFP free_value, const uint UNUSED(reserve))
{
- /* TODO: handle reserve */
- edgehash_free_values(eh, free_value);
- eh->length = 0;
- eh->dummy_count = 0;
- eh->capacity_exp = CAPACITY_EXP_DEFAULT;
- CLEAR_MAP(eh);
+ /* TODO: handle reserve */
+ edgehash_free_values(eh, free_value);
+ eh->length = 0;
+ eh->dummy_count = 0;
+ eh->capacity_exp = CAPACITY_EXP_DEFAULT;
+ CLEAR_MAP(eh);
}
/**
@@ -448,7 +460,7 @@ void BLI_edgehash_clear_ex(EdgeHash *eh, EdgeHashFreeFP free_value, const uint U
*/
void BLI_edgehash_clear(EdgeHash *eh, EdgeHashFreeFP free_value)
{
- BLI_edgehash_clear_ex(eh, free_value, 0);
+ BLI_edgehash_clear_ex(eh, free_value, 0);
}
/** \} */
@@ -464,9 +476,9 @@ void BLI_edgehash_clear(EdgeHash *eh, EdgeHashFreeFP free_value)
*/
EdgeHashIterator *BLI_edgehashIterator_new(EdgeHash *eh)
{
- EdgeHashIterator *ehi = MEM_mallocN(sizeof(EdgeHashIterator), __func__);
- BLI_edgehashIterator_init(ehi, eh);
- return ehi;
+ EdgeHashIterator *ehi = MEM_mallocN(sizeof(EdgeHashIterator), __func__);
+ BLI_edgehashIterator_init(ehi, eh);
+ return ehi;
}
/**
@@ -479,9 +491,9 @@ EdgeHashIterator *BLI_edgehashIterator_new(EdgeHash *eh)
*/
void BLI_edgehashIterator_init(EdgeHashIterator *ehi, EdgeHash *eh)
{
- ehi->entries = eh->entries;
- ehi->length = eh->length;
- ehi->index = 0;
+ ehi->entries = eh->entries;
+ ehi->length = eh->length;
+ ehi->index = 0;
}
/**
@@ -489,10 +501,9 @@ void BLI_edgehashIterator_init(EdgeHashIterator *ehi, EdgeHash *eh)
*/
void BLI_edgehashIterator_free(EdgeHashIterator *ehi)
{
- MEM_freeN(ehi);
+ MEM_freeN(ehi);
}
-
/** \} */
/* -------------------------------------------------------------------- */
@@ -501,66 +512,68 @@ void BLI_edgehashIterator_free(EdgeHashIterator *ehi)
* Use edgehash API to give 'set' functionality
* \{ */
-#define ES_INDEX_HAS_EDGE(es, index, edge) (index) >= 0 && edges_equal((edge), (es)->entries[index])
+#define ES_INDEX_HAS_EDGE(es, index, edge) \
+ (index) >= 0 && edges_equal((edge), (es)->entries[index])
EdgeSet *BLI_edgeset_new_ex(const char *info, const uint reserve)
{
- EdgeSet *es = MEM_mallocN(sizeof(EdgeSet), info);
- es->capacity_exp = calc_capacity_exp_for_reserve(reserve);
- UPDATE_SLOT_MASK(es);
- es->length = 0;
- es->entries = MEM_malloc_arrayN(sizeof(Edge), ENTRIES_CAPACITY(es), "es entries");
- es->map = MEM_malloc_arrayN(sizeof(int32_t), MAP_CAPACITY(es), "es map");
- CLEAR_MAP(es);
- return es;
+ EdgeSet *es = MEM_mallocN(sizeof(EdgeSet), info);
+ es->capacity_exp = calc_capacity_exp_for_reserve(reserve);
+ UPDATE_SLOT_MASK(es);
+ es->length = 0;
+ es->entries = MEM_malloc_arrayN(sizeof(Edge), ENTRIES_CAPACITY(es), "es entries");
+ es->map = MEM_malloc_arrayN(sizeof(int32_t), MAP_CAPACITY(es), "es map");
+ CLEAR_MAP(es);
+ return es;
}
EdgeSet *BLI_edgeset_new(const char *info)
{
- return BLI_edgeset_new_ex(info, 1 << CAPACITY_EXP_DEFAULT);
+ return BLI_edgeset_new_ex(info, 1 << CAPACITY_EXP_DEFAULT);
}
void BLI_edgeset_free(EdgeSet *es)
{
- MEM_freeN(es->entries);
- MEM_freeN(es->map);
- MEM_freeN(es);
+ MEM_freeN(es->entries);
+ MEM_freeN(es->map);
+ MEM_freeN(es);
}
int BLI_edgeset_len(EdgeSet *es)
{
- return (int)es->length;
+ return (int)es->length;
}
static void edgeset_insert_index(EdgeSet *es, Edge edge, uint entry_index)
{
- ITER_SLOTS(es, edge, slot, index) {
- if (index == SLOT_EMPTY) {
- es->map[slot] = (int)entry_index;
- break;
- }
- }
+ ITER_SLOTS(es, edge, slot, index)
+ {
+ if (index == SLOT_EMPTY) {
+ es->map[slot] = (int)entry_index;
+ break;
+ }
+ }
}
BLI_INLINE void edgeset_ensure_can_insert(EdgeSet *es)
{
- if (UNLIKELY(ENTRIES_CAPACITY(es) <= es->length)) {
- es->capacity_exp++;
- UPDATE_SLOT_MASK(es);
- es->entries = MEM_reallocN(es->entries, sizeof(Edge) * ENTRIES_CAPACITY(es));
- es->map = MEM_reallocN(es->map, sizeof(int32_t) * MAP_CAPACITY(es));
- CLEAR_MAP(es);
- for (uint i = 0; i < es->length; i++) {
- edgeset_insert_index(es, es->entries[i], i);
- }
- }
+ if (UNLIKELY(ENTRIES_CAPACITY(es) <= es->length)) {
+ es->capacity_exp++;
+ UPDATE_SLOT_MASK(es);
+ es->entries = MEM_reallocN(es->entries, sizeof(Edge) * ENTRIES_CAPACITY(es));
+ es->map = MEM_reallocN(es->map, sizeof(int32_t) * MAP_CAPACITY(es));
+ CLEAR_MAP(es);
+ for (uint i = 0; i < es->length; i++) {
+ edgeset_insert_index(es, es->entries[i], i);
+ }
+ }
}
BLI_INLINE void edgeset_insert_at_slot(EdgeSet *es, uint slot, Edge edge)
{
- es->entries[es->length] = edge;
- es->map[slot] = (int)es->length;
- es->length++;
+ es->entries[es->length] = edge;
+ es->map[slot] = (int)es->length;
+ es->length++;
}
/**
@@ -571,18 +584,19 @@ BLI_INLINE void edgeset_insert_at_slot(EdgeSet *es, uint slot, Edge edge)
*/
bool BLI_edgeset_add(EdgeSet *es, uint v0, uint v1)
{
- edgeset_ensure_can_insert(es);
- Edge edge = init_edge(v0, v1);
+ edgeset_ensure_can_insert(es);
+ Edge edge = init_edge(v0, v1);
- ITER_SLOTS(es, edge, slot, index) {
- if (ES_INDEX_HAS_EDGE(es, index, edge)) {
- return false;
- }
- else if (index == SLOT_EMPTY) {
- edgeset_insert_at_slot(es, slot, edge);
- return true;
- }
- }
+ ITER_SLOTS(es, edge, slot, index)
+ {
+ if (ES_INDEX_HAS_EDGE(es, index, edge)) {
+ return false;
+ }
+ else if (index == SLOT_EMPTY) {
+ edgeset_insert_at_slot(es, slot, edge);
+ return true;
+ }
+ }
}
/**
@@ -591,43 +605,45 @@ bool BLI_edgeset_add(EdgeSet *es, uint v0, uint v1)
*/
void BLI_edgeset_insert(EdgeSet *es, uint v0, uint v1)
{
- edgeset_ensure_can_insert(es);
- Edge edge = init_edge(v0, v1);
+ edgeset_ensure_can_insert(es);
+ Edge edge = init_edge(v0, v1);
- ITER_SLOTS(es, edge, slot, index) {
- if (index == SLOT_EMPTY) {
- edgeset_insert_at_slot(es, slot, edge);
- return;
- }
- }
+ ITER_SLOTS(es, edge, slot, index)
+ {
+ if (index == SLOT_EMPTY) {
+ edgeset_insert_at_slot(es, slot, edge);
+ return;
+ }
+ }
}
bool BLI_edgeset_haskey(EdgeSet *es, uint v0, uint v1)
{
- Edge edge = init_edge(v0, v1);
+ Edge edge = init_edge(v0, v1);
- ITER_SLOTS(es, edge, slot, index) {
- if (ES_INDEX_HAS_EDGE(es, index, edge)) {
- return true;
- }
- else if (index == SLOT_EMPTY) {
- return false;
- }
- }
+ ITER_SLOTS(es, edge, slot, index)
+ {
+ if (ES_INDEX_HAS_EDGE(es, index, edge)) {
+ return true;
+ }
+ else if (index == SLOT_EMPTY) {
+ return false;
+ }
+ }
}
EdgeSetIterator *BLI_edgesetIterator_new(EdgeSet *es)
{
- EdgeSetIterator *esi = MEM_mallocN(sizeof(EdgeSetIterator), __func__);
- esi->edges = es->entries;
- esi->length = es->length;
- esi->index = 0;
- return esi;
+ EdgeSetIterator *esi = MEM_mallocN(sizeof(EdgeSetIterator), __func__);
+ esi->edges = es->entries;
+ esi->length = es->length;
+ esi->index = 0;
+ return esi;
}
void BLI_edgesetIterator_free(EdgeSetIterator *esi)
{
- MEM_freeN(esi);
+ MEM_freeN(esi);
}
/** \} */