yapb-noob-edition/ext/crlib/cr-alloc.h

87 lines
2 KiB
C
Raw Normal View History

2020-06-12 18:52:38 +03:00
//
// YaPB - Counter-Strike Bot based on PODBot by Markus Klinge.
// Copyright © 2004-2020 YaPB Project <yapb@jeefo.net>.
2020-06-12 18:52:38 +03:00
//
// SPDX-License-Identifier: MIT
2020-06-12 18:52:38 +03:00
//
#pragma once
#include <crlib/cr-basic.h>
#include <crlib/cr-movable.h>
#include <crlib/cr-platform.h>
2020-06-15 13:23:44 +03:00
// provide placment new to avoid stdc++ <new> header
inline void *operator new (const size_t, void *ptr) noexcept {
return ptr;
}
2020-06-12 18:52:38 +03:00
CR_NAMESPACE_BEGIN
// default allocator for cr-objects
class Allocator : public Singleton <Allocator> {
public:
Allocator () = default;
~Allocator () = default;
public:
template <typename T> T *allocate (const size_t length = 1) {
2020-10-03 19:02:37 +03:00
auto memory = reinterpret_cast <T *> (malloc (cr::max <size_t> (1u, length * sizeof (T))));
2020-06-12 18:52:38 +03:00
2020-06-15 13:23:44 +03:00
if (!memory) {
2020-06-12 18:52:38 +03:00
plat.abort ();
}
2020-06-15 13:23:44 +03:00
return memory;
2020-06-12 18:52:38 +03:00
}
template <typename T> void deallocate (T *memory) {
free (memory);
memory = nullptr;
}
public:
template <typename T, typename ...Args> void construct (T *memory, Args &&...args) {
new (memory) T (cr::forward <Args> (args)...);
}
template <typename T> void destruct (T *memory) {
memory->~T ();
}
public:
template <typename T, typename ...Args> T *create (Args &&...args) {
2020-06-15 13:23:44 +03:00
auto memory = allocate <T> ();
new (memory) T (cr::forward <Args> (args)...);
2020-06-12 18:52:38 +03:00
2020-06-15 13:23:44 +03:00
return memory;
2020-06-12 18:52:38 +03:00
}
template <typename T> T *createArray (const size_t amount) {
auto memory = allocate <T> (amount);
for (size_t i = 0; i < amount; ++i) {
new (memory + i) T ();
}
return memory;
}
template <typename T> void destroy (T *memory) {
if (memory) {
destruct (memory);
deallocate (memory);
}
}
};
CR_EXPOSE_GLOBAL_SINGLETON (Allocator, alloc);
template <typename T> class UniquePtr;
// implment singleton with UniquePtr
template <typename T> T &Singleton <T>::instance () {
static const UniquePtr <T> instance_ { alloc.create <T> () };
return *instance_;
}
CR_NAMESPACE_END