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());
195 MEM_CacheElementPtr elem = get_least_priority_destroyable_element();
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;