static void outliner_storage_cleanup(SpaceOops *soops) { BLI_mempool *ts = soops->treestore; if (ts) { TreeStoreElem *tselem; int unused = 0; /* each element used once, for ID blocks with more users to have each a treestore */ BLI_mempool_iter iter; BLI_mempool_iternew(ts, &iter); while ((tselem = BLI_mempool_iterstep(&iter))) { tselem->used = 0; } /* cleanup only after reading file or undo step, and always for * RNA datablocks view in order to save memory */ if (soops->storeflag & SO_TREESTORE_CLEANUP) { BLI_mempool_iternew(ts, &iter); while ((tselem = BLI_mempool_iterstep(&iter))) { if (tselem->id == NULL) unused++; } if (unused) { if (BLI_mempool_count(ts) == unused) { BLI_mempool_destroy(ts); soops->treestore = NULL; if (soops->treehash) { BKE_treehash_free(soops->treehash); soops->treehash = NULL; } } else { TreeStoreElem *tsenew; BLI_mempool *new_ts = BLI_mempool_create(sizeof(TreeStoreElem), BLI_mempool_count(ts) - unused, 512, BLI_MEMPOOL_ALLOW_ITER); BLI_mempool_iternew(ts, &iter); while ((tselem = BLI_mempool_iterstep(&iter))) { if (tselem->id) { tsenew = BLI_mempool_alloc(new_ts); *tsenew = *tselem; } } BLI_mempool_destroy(ts); soops->treestore = new_ts; if (soops->treehash) { /* update hash table to fix broken pointers */ BKE_treehash_rebuild_from_treestore(soops->treehash, soops->treestore); } } } } } }
static void fill_treehash(void *treehash, BLI_mempool *treestore) { TreeStoreElem *tselem; BLI_mempool_iter iter; BLI_mempool_iternew(treestore, &iter); BLI_assert(treehash); while ((tselem = BLI_mempool_iterstep(&iter))) { BKE_outliner_treehash_add_element(treehash, tselem); } }
/** * \param data array of pointers at least the size of 'pool->totused' */ void BLI_mempool_as_array(BLI_mempool *pool, void **data) { BLI_mempool_iter iter; void *elem; void **p = data; BLI_assert(pool->flag & BLI_MEMPOOL_ALLOW_ITER); BLI_mempool_iternew(pool, &iter); for (elem = BLI_mempool_iterstep(&iter); elem; elem = BLI_mempool_iterstep(&iter)) { *p++ = elem; } BLI_assert((p - data) == pool->totused); }
static void curve_draw_stroke_to_operator(wmOperator *op) { struct CurveDrawData *cdd = op->customdata; BLI_mempool_iter iter; const struct StrokeElem *selem; BLI_mempool_iternew(cdd->stroke_elem_pool, &iter); for (selem = BLI_mempool_iterstep(&iter); selem; selem = BLI_mempool_iterstep(&iter)) { curve_draw_stroke_to_operator_elem(op, selem); } }
void *BLI_mempool_findelem(BLI_mempool *pool, int index) { BLI_assert(pool->flag & BLI_MEMPOOL_ALLOW_ITER); if ((index >= 0) && (index < pool->totused)) { /* we could have some faster mem chunk stepping code inline */ BLI_mempool_iter iter; void *elem; BLI_mempool_iternew(pool, &iter); for (elem = BLI_mempool_iterstep(&iter); index-- != 0; elem = BLI_mempool_iterstep(&iter)) { /* do nothing */ } return elem; } return NULL; }
void bmiter__face_of_mesh_begin(BMIter *iter) { BLI_mempool_iternew(iter->bm->fpool, &iter->pooliter); }
void bmiter__edge_of_mesh_begin(BMIter *iter) { BLI_mempool_iternew(iter->bm->epool, &iter->pooliter); iter->count = iter->bm->totedge; /* */ }
void bmiter__vert_of_mesh_begin(BMIter *iter) { BLI_mempool_iternew(iter->bm->vpool, &iter->pooliter); }