diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-08-24 21:33:47 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-08-24 21:33:47 +0400 |
commit | 09a52f18b6d8bd77cbffd746f72e866e1740505f (patch) | |
tree | 525d2cd2121cd5e7112bcb26ffcca0445d979328 /source/blender/bmesh/intern | |
parent | 7bd422143e2ebab4f37fd8647206ec5d2235259e (diff) |
ghash: reserve size when its known or can be guessed close enough.
also avoid allocs per node in pbvh_bmesh_node_limit_ensure()
Diffstat (limited to 'source/blender/bmesh/intern')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_log.c | 6 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mesh.c | 6 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_operators.c | 2 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_walkers.c | 10 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_walkers_impl.c | 17 |
5 files changed, 18 insertions, 23 deletions
diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c index 09fdb0c73f6..30728636a58 100644 --- a/source/blender/bmesh/intern/bmesh_log.c +++ b/source/blender/bmesh/intern/bmesh_log.c @@ -407,7 +407,7 @@ static int uint_compare(const void *a_v, const void *b_v) */ static GHash *bm_log_compress_ids_to_indices(unsigned int *ids, int totid) { - GHash *map = BLI_ghash_int_new(AT); + GHash *map = BLI_ghash_int_new_ex(AT, totid); int i; qsort(ids, totid, sizeof(*ids), uint_compare); @@ -441,8 +441,8 @@ BMLog *BM_log_create(BMesh *bm) BMLog *log = MEM_callocN(sizeof(*log), AT); log->unused_ids = range_tree_uint_alloc(0, (unsigned)-1); - log->id_to_elem = BLI_ghash_ptr_new(AT); - log->elem_to_id = BLI_ghash_ptr_new(AT); + log->id_to_elem = BLI_ghash_ptr_new_ex(AT, bm->totvert + bm->totface); + log->elem_to_id = BLI_ghash_ptr_new_ex(AT, bm->totvert + bm->totface); /* Assign IDs to all existing vertices and faces */ bm_log_assign_ids(bm, log); diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c index 64368390444..5ab6fe72f77 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.c +++ b/source/blender/bmesh/intern/bmesh_mesh.c @@ -674,7 +674,7 @@ void BM_mesh_remap(BMesh *bm, int *vert_idx, int *edge_idx, int *face_idx) int *new_idx = NULL; /* Init the old-to-new vert pointers mapping */ - vptr_map = BLI_ghash_ptr_new("BM_mesh_remap vert pointers mapping"); + vptr_map = BLI_ghash_ptr_new_ex("BM_mesh_remap vert pointers mapping", bm->totvert); /* Make a copy of all vertices. */ verts_pool = MEM_callocN(sizeof(BMVert *) * totvert, "BM_mesh_remap verts pool"); @@ -708,7 +708,7 @@ void BM_mesh_remap(BMesh *bm, int *vert_idx, int *edge_idx, int *face_idx) int *new_idx = NULL; /* Init the old-to-new vert pointers mapping */ - eptr_map = BLI_ghash_ptr_new("BM_mesh_remap edge pointers mapping"); + eptr_map = BLI_ghash_ptr_new_ex("BM_mesh_remap edge pointers mapping", bm->totedge); /* Make a copy of all vertices. */ edges_pool = MEM_callocN(sizeof(BMEdge *) * totedge, "BM_mesh_remap edges pool"); @@ -741,7 +741,7 @@ void BM_mesh_remap(BMesh *bm, int *vert_idx, int *edge_idx, int *face_idx) int *new_idx = NULL; /* Init the old-to-new vert pointers mapping */ - fptr_map = BLI_ghash_ptr_new("BM_mesh_remap face pointers mapping"); + fptr_map = BLI_ghash_ptr_new_ex("BM_mesh_remap face pointers mapping", bm->totface); /* Make a copy of all vertices. */ faces_pool = MEM_callocN(sizeof(BMFace *) * totface, "BM_mesh_remap faces pool"); diff --git a/source/blender/bmesh/intern/bmesh_operators.c b/source/blender/bmesh/intern/bmesh_operators.c index b71d5a7e7d4..0483fa20dec 100644 --- a/source/blender/bmesh/intern/bmesh_operators.c +++ b/source/blender/bmesh/intern/bmesh_operators.c @@ -341,7 +341,7 @@ void _bmo_slot_copy(BMOpSlot slot_args_src[BMO_OP_MAX_SLOTS], const char *slot_n } if (!slot_dst->data.ghash) { - slot_dst->data.ghash = BLI_ghash_ptr_new("bmesh operator 2"); + slot_dst->data.ghash = BLI_ghash_ptr_new_ex("bmesh operator 2", BLI_ghash_size(slot_src->data.ghash)); } for (BLI_ghashIterator_init(&it, slot_src->data.ghash); diff --git a/source/blender/bmesh/intern/bmesh_walkers.c b/source/blender/bmesh/intern/bmesh_walkers.c index 80b85ab6edd..c9e36541db7 100644 --- a/source/blender/bmesh/intern/bmesh_walkers.c +++ b/source/blender/bmesh/intern/bmesh_walkers.c @@ -87,8 +87,8 @@ void BMW_init(BMWalker *walker, BMesh *bm, int type, walker->mask_edge = mask_edge; walker->mask_face = mask_face; - walker->visithash = BLI_ghash_ptr_new("bmesh walkers 1"); - walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers sec 1"); + walker->visithash = BLI_ghash_ptr_new("bmesh walkers"); + walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers sec"); if (UNLIKELY(type >= BMW_MAXWALKERS || type < 0)) { fprintf(stderr, @@ -253,8 +253,6 @@ void BMW_reset(BMWalker *walker) BMW_state_remove(walker); } walker->depth = 0; - BLI_ghash_free(walker->visithash, NULL, NULL); - BLI_ghash_free(walker->secvisithash, NULL, NULL); - walker->visithash = BLI_ghash_ptr_new("bmesh walkers 1"); - walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers sec 1"); + BLI_ghash_clear(walker->visithash, NULL, NULL); + BLI_ghash_clear(walker->secvisithash, NULL, NULL); } diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c index 2baa78856f4..2fbda777dcc 100644 --- a/source/blender/bmesh/intern/bmesh_walkers_impl.c +++ b/source/blender/bmesh/intern/bmesh_walkers_impl.c @@ -494,8 +494,7 @@ static void bmw_LoopWalker_begin(BMWalker *walker, void *data) lwalk->lastv = lwalk->startv = BM_edge_other_vert(owalk.cur, lwalk->lastv); - BLI_ghash_free(walker->visithash, NULL, NULL); - walker->visithash = BLI_ghash_ptr_new("bmesh walkers 2"); + BLI_ghash_clear(walker->visithash, NULL, NULL); BLI_ghash_insert(walker->visithash, owalk.cur, NULL); } @@ -751,12 +750,10 @@ static void bmw_FaceLoopWalker_begin(BMWalker *walker, void *data) *lwalk = owalk; lwalk->no_calc = false; - BLI_ghash_free(walker->secvisithash, NULL, NULL); - walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers 3"); + BLI_ghash_clear(walker->secvisithash, NULL, NULL); BLI_ghash_insert(walker->secvisithash, lwalk->l->e, NULL); - BLI_ghash_free(walker->visithash, NULL, NULL); - walker->visithash = BLI_ghash_ptr_new("bmesh walkers 3"); + BLI_ghash_clear(walker->visithash, NULL, NULL); BLI_ghash_insert(walker->visithash, lwalk->l->f, NULL); } @@ -806,8 +803,9 @@ static void *bmw_FaceLoopWalker_step(BMWalker *walker) lwalk->no_calc = false; } - BLI_ghash_insert(walker->secvisithash, l->e, NULL); - BLI_ghash_insert(walker->visithash, l->f, NULL); + /* both may already exist */ + BLI_ghash_reinsert(walker->secvisithash, l->e, NULL, NULL, NULL); + BLI_ghash_reinsert(walker->visithash, l->f, NULL, NULL, NULL); } return f; @@ -858,8 +856,7 @@ static void bmw_EdgeringWalker_begin(BMWalker *walker, void *data) lwalk->l = lwalk->l->radial_next; } - BLI_ghash_free(walker->visithash, NULL, NULL); - walker->visithash = BLI_ghash_ptr_new("bmesh walkers 4"); + BLI_ghash_clear(walker->visithash, NULL, NULL); BLI_ghash_insert(walker->visithash, lwalk->l->e, NULL); } |