21 #ifndef __MEM_CACHELIMITER_H__
22 #define __MEM_CACHELIMITER_H__
63 #ifndef __MEM_CACHELIMITERC_API_H__
75 : data(
data_), refcount(0), parent(parent_)
106 return !data || !refcount;
122 parent->unmanage(
this);
152 for (i = 0; i < queue.size(); i++) {
160 queue.back()->pos = queue.size() - 1;
166 int pos = handle->pos;
167 queue[
pos] = queue.back();
176 if (data_size_func) {
178 for (i = 0; i < queue.size(); i++) {
179 size += data_size_func(queue[i]->get()->get_data());
214 if (data_size_func) {
215 cur_size = data_size_func(elem->
get()->get_data());
222 if (data_size_func) {
238 if (item_priority_func ==
NULL) {
239 queue[handle->pos] = queue.back();
240 queue[handle->pos]->pos = handle->pos;
242 queue.push_back(handle);
243 handle->pos = queue.size() - 1;
249 this->item_priority_func = item_priority_func;
254 this->item_destroyable_func = item_destroyable_func;
259 typedef std::vector<MEM_CacheElementPtr, MEM_Allocator<MEM_CacheElementPtr>> MEM_CacheQueue;
260 typedef typename MEM_CacheQueue::iterator iterator;
263 bool can_destroy_element(MEM_CacheElementPtr &elem)
265 if (!elem->can_destroy()) {
269 if (item_destroyable_func) {
270 if (!item_destroyable_func(elem->get()->get_data()))
276 MEM_CacheElementPtr get_least_priority_destroyable_element(
void)
281 MEM_CacheElementPtr best_match_elem =
NULL;
283 if (!item_priority_func) {
284 for (iterator it = queue.begin(); it != queue.end(); it++) {
285 MEM_CacheElementPtr elem = *it;
286 if (!can_destroy_element(elem))
288 best_match_elem = elem;
293 int best_match_priority = 0;
296 for (i = 0; i < queue.size(); i++) {
297 MEM_CacheElementPtr elem = queue[i];
299 if (!can_destroy_element(elem))
305 int priority = -((int)(queue.size()) - i - 1);
306 priority = item_priority_func(elem->get()->get_data(), priority);
308 if (priority < best_match_priority || best_match_elem ==
NULL) {
309 best_match_priority = priority;
310 best_match_elem = elem;
315 return best_match_elem;
318 MEM_CacheQueue queue;
void MEM_CacheLimiter_set_maximum(size_t m)
void MEM_CacheLimiter_set_disabled(bool disabled)
size_t MEM_CacheLimiter_get_maximum()
bool MEM_CacheLimiter_is_disabled(void)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
bool destroy_if_possible()
MEM_CacheLimiterHandle(T *data_, MEM_CacheLimiter< T > *parent_)
void unmanage(MEM_CacheLimiterHandle< T > *handle)
int(* MEM_CacheLimiter_ItemPriority_Func)(void *item, int default_priority)
bool(* MEM_CacheLimiter_ItemDestroyable_Func)(void *item)
size_t(* MEM_CacheLimiter_DataSize_Func)(void *data)
size_t get_memory_in_use()
MEM_CacheLimiterHandle< T > * insert(T *elem)
MEM_CacheLimiter(MEM_CacheLimiter_DataSize_Func data_size_func)
void set_item_destroyable_func(MEM_CacheLimiter_ItemDestroyable_Func item_destroyable_func)
void touch(MEM_CacheLimiterHandle< T > *handle)
void set_item_priority_func(MEM_CacheLimiter_ItemPriority_Func item_priority_func)
size_t(* MEM_get_memory_in_use)(void)