oldpool_func.h
Go to the documentation of this file.00001
00002
00005 #ifndef OLDPOOL_FUNC_H
00006 #define OLDPOOL_FUNC_H
00007
00008 #include "oldpool.h"
00009
00017 template<typename T, typename Tid, OldMemoryPool<T> *Tpool> T *PoolItem<T, Tid, Tpool>::AllocateSafeRaw(uint &first)
00018 {
00019 uint last_minus_one = Tpool->GetSize() - 1;
00020
00021 for (T *t = Tpool->Get(first); t != NULL; t = ((uint)t->index < last_minus_one) ? Tpool->Get(t->index + 1U) : NULL) {
00022 if (!t->IsValid()) {
00023 first = t->index;
00024 Tid index = t->index;
00025
00026 memset(t, 0, Tpool->item_size);
00027 t->index = index;
00028 return t;
00029 }
00030 }
00031
00032
00033 if (Tpool->AddBlockToPool()) return AllocateRaw(first);
00034
00035
00036 NOT_REACHED();
00037 }
00038
00046 template<typename T, typename Tid, OldMemoryPool<T> *Tpool> bool PoolItem<T, Tid, Tpool>::CanAllocateItem(uint count)
00047 {
00048 uint last_minus_one = Tpool->GetSize() - 1;
00049 uint orig_count = count;
00050
00051 for (T *t = Tpool->Get(Tpool->first_free_index); count > 0 && t != NULL; t = ((uint)t->index < last_minus_one) ? Tpool->Get(t->index + 1U) : NULL) {
00052 if (!t->IsValid()) count--;
00053 }
00054
00055 if (count == 0) return true;
00056
00057
00058 if (Tpool->AddBlockToPool()) return CanAllocateItem(orig_count);
00059
00060 return false;
00061 }
00062
00063 #endif