7 #ifndef __MEM_CACHELIMITER_H__
8 #define __MEM_CACHELIMITER_H__
49 #ifndef __MEM_CACHELIMITERC_API_H__
61 : data(
data_), refcount(0), parent(parent_)
92 return !data || !refcount;
108 parent->unmanage(
this);
138 for (i = 0; i < queue.size(); i++) {
146 queue.back()->pos = queue.size() - 1;
152 int pos = handle->pos;
153 queue[
pos] = queue.back();
162 if (data_size_func) {
164 for (i = 0; i < queue.size(); i++) {
165 size += data_size_func(queue[i]->get()->get_data());
200 if (data_size_func) {
201 cur_size = data_size_func(elem->
get()->get_data());
208 if (data_size_func) {
224 if (item_priority_func ==
NULL) {
225 queue[handle->pos] = queue.back();
226 queue[handle->pos]->pos = handle->pos;
228 queue.push_back(handle);
229 handle->pos = queue.size() - 1;
235 this->item_priority_func = item_priority_func;
240 this->item_destroyable_func = item_destroyable_func;
245 typedef std::vector<MEM_CacheElementPtr, MEM_Allocator<MEM_CacheElementPtr>> MEM_CacheQueue;
246 typedef typename MEM_CacheQueue::iterator iterator;
249 bool can_destroy_element(MEM_CacheElementPtr &elem)
251 if (!elem->can_destroy()) {
255 if (item_destroyable_func) {
256 if (!item_destroyable_func(elem->get()->get_data()))
262 MEM_CacheElementPtr get_least_priority_destroyable_element(
void)
267 MEM_CacheElementPtr best_match_elem =
NULL;
269 if (!item_priority_func) {
270 for (iterator it = queue.begin(); it != queue.end(); it++) {
271 MEM_CacheElementPtr elem = *it;
272 if (!can_destroy_element(elem))
274 best_match_elem = elem;
279 int best_match_priority = 0;
282 for (i = 0; i < queue.size(); i++) {
283 MEM_CacheElementPtr elem = queue[i];
285 if (!can_destroy_element(elem))
291 int priority = -((int)(queue.size()) - i - 1);
292 priority = item_priority_func(elem->get()->get_data(), priority);
294 if (priority < best_match_priority || best_match_elem ==
NULL) {
295 best_match_priority = priority;
296 best_match_elem = elem;
301 return best_match_elem;
304 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)