9#ifndef __MEM_CACHELIMITER_H__
10#define __MEM_CACHELIMITER_H__
49#ifndef __MEM_CACHELIMITERC_API_H__
61 : data(data_), 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());
201 if (data_size_func) {
202 cur_size = data_size_func(elem->
get()->get_data());
209 if (data_size_func) {
225 if (item_priority_func ==
nullptr) {
226 queue[handle->pos] = queue.back();
227 queue[handle->pos]->pos = handle->pos;
229 queue.push_back(handle);
230 handle->pos = queue.size() - 1;
236 this->item_priority_func = item_priority_func;
241 this->item_destroyable_func = item_destroyable_func;
246 using MEM_CacheQueue = std::vector<MEM_CacheElementPtr, MEM_Allocator<MEM_CacheElementPtr>>;
247 using iterator =
typename MEM_CacheQueue::iterator;
250 bool can_destroy_element(MEM_CacheElementPtr &elem)
252 if (!elem->can_destroy()) {
256 if (item_destroyable_func) {
257 if (!item_destroyable_func(elem->get()->get_data())) {
264 MEM_CacheElementPtr get_least_priority_destroyable_element()
270 MEM_CacheElementPtr best_match_elem = NULL;
272 if (!item_priority_func) {
273 for (iterator it = queue.begin(); it != queue.end(); it++) {
274 MEM_CacheElementPtr elem = *it;
275 if (!can_destroy_element(elem)) {
278 best_match_elem = elem;
283 int best_match_priority = 0;
286 for (i = 0; i < queue.size(); i++) {
287 MEM_CacheElementPtr elem = queue[i];
289 if (!can_destroy_element(elem)) {
296 int priority = -((int)(queue.size()) - i - 1);
297 priority = item_priority_func(elem->get()->get_data(), priority);
299 if (priority < best_match_priority || best_match_elem == NULL) {
300 best_match_priority = priority;
301 best_match_elem = elem;
306 return best_match_elem;
309 MEM_CacheQueue queue;
int(*)(void *, int) MEM_CacheLimiter_ItemPriority_Func
size_t(*)(void *) MEM_CacheLimiter_DataSize_Func
bool(*)(void *) MEM_CacheLimiter_ItemDestroyable_Func
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)
size_t(*)(void *) MEM_CacheLimiter_DataSize_Func
bool(*)(void *) MEM_CacheLimiter_ItemDestroyable_Func
size_t get_memory_in_use()
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)
int(*)(void *, int) MEM_CacheLimiter_ItemPriority_Func
void set_item_priority_func(MEM_CacheLimiter_ItemPriority_Func item_priority_func)
MEM_CacheLimiterHandle< T > * insert(T *elem)
size_t(* MEM_get_memory_in_use)(void)