summaryrefslogtreecommitdiff
path: root/src/memory.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/memory.hpp')
-rw-r--r--src/memory.hpp34
1 files changed, 26 insertions, 8 deletions
diff --git a/src/memory.hpp b/src/memory.hpp
index 50be56b..b93890a 100644
--- a/src/memory.hpp
+++ b/src/memory.hpp
@@ -35,16 +35,26 @@ void Pke_EndTransientBucket(MemBucket *bkt);
void Pke_MemoryFlush();
template <typename T>
-inline T *Pke_New() {
- void *ptr = Pke_New(sizeof(T));
+inline T *Pke_New(MemBucket *bucket = nullptr) {
+ void *ptr = nullptr;
+ if (bucket) {
+ ptr = Pke_New(sizeof(T), bucket);
+ } else {
+ ptr = Pke_New(sizeof(T));
+ }
if IS_CONSTRUCTIBLE(T) {
return new (ptr) T{};
}
return reinterpret_cast<T *>(ptr);
}
template <typename T>
-inline T *Pke_New(long count) {
- char *ptr = static_cast<char *>(Pke_New(sizeof(T) * count));
+inline T *Pke_New(long count, MemBucket *bucket = nullptr) {
+ char *ptr = nullptr;
+ if (bucket) {
+ ptr = static_cast<char *>(Pke_New(sizeof(T) * count, bucket));
+ } else {
+ ptr = static_cast<char *>(Pke_New(sizeof(T) * count));
+ }
if IS_CONSTRUCTIBLE(T) {
for (long i = 0; i < count; ++i) {
new (ptr + (i * sizeof(T))) T{};
@@ -53,20 +63,28 @@ inline T *Pke_New(long count) {
return reinterpret_cast<T *>(ptr);
}
template <typename T>
-inline void Pke_Delete(const void *ptr) {
+inline void Pke_Delete(const void *ptr, MemBucket *bucket = nullptr) {
if IS_DESTRUCTIBLE(T) {
reinterpret_cast<const T *>(ptr)->~T();
}
- return Pke_Delete(ptr, sizeof(T));
+ if (bucket) {
+ return Pke_Delete(ptr, sizeof(T), bucket);
+ } else {
+ return Pke_Delete(ptr, sizeof(T));
+ }
}
template <typename T>
-inline void Pke_Delete(const void *ptr, long count) {
+inline void Pke_Delete(const void *ptr, long count, MemBucket *bucket = nullptr) {
if IS_DESTRUCTIBLE(T) {
for (long i = 0; i < count; ++i) {
reinterpret_cast<const T *>(reinterpret_cast<const char *>(ptr) + (i * sizeof(T)))->~T();
}
}
- return Pke_Delete(ptr, sizeof(T) * count);
+ if (bucket) {
+ return Pke_Delete(ptr, sizeof(T) * count, bucket);
+ } else {
+ return Pke_Delete(ptr, sizeof(T) * count);
+ }
}