diff options
Diffstat (limited to 'src/keeper.hpp')
-rw-r--r-- | src/keeper.hpp | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/src/keeper.hpp b/src/keeper.hpp index 5cebe07..f1083b3 100644 --- a/src/keeper.hpp +++ b/src/keeper.hpp | |||
@@ -26,12 +26,6 @@ struct Keeper | |||
26 | std::mutex mutex; | 26 | std::mutex mutex; |
27 | KeeperState K{ static_cast<lua_State*>(nullptr) }; | 27 | KeeperState K{ static_cast<lua_State*>(nullptr) }; |
28 | 28 | ||
29 | [[nodiscard]] | ||
30 | static void* operator new[](size_t size_, Universe* U_) noexcept; | ||
31 | // can't actually delete the operator because the compiler generates stack unwinding code that could call it in case of exception | ||
32 | static void operator delete[](void* p_, Universe* U_); | ||
33 | |||
34 | |||
35 | ~Keeper() = default; | 29 | ~Keeper() = default; |
36 | Keeper() = default; | 30 | Keeper() = default; |
37 | // non-copyable, non-movable | 31 | // non-copyable, non-movable |
@@ -51,14 +45,15 @@ struct Keepers | |||
51 | private: | 45 | private: |
52 | struct DeleteKV | 46 | struct DeleteKV |
53 | { | 47 | { |
54 | Universe* U{}; | 48 | Universe& U; |
55 | size_t count{}; | 49 | size_t count{}; |
56 | void operator()(Keeper* k_) const; | 50 | void operator()(Keeper* k_) const; |
57 | }; | 51 | }; |
58 | // can't use std::vector<Keeper> because Keeper contains a mutex, so we need a raw memory buffer | 52 | // can't use std::unique_ptr<Keeper[]> because of interactions with placement new and custom deleters |
53 | // and I'm not using std::vector<Keeper> because I don't have an allocator to plug on the Universe (yet) | ||
59 | struct KV | 54 | struct KV |
60 | { | 55 | { |
61 | std::unique_ptr<Keeper[], DeleteKV> keepers; | 56 | std::unique_ptr<Keeper, DeleteKV> keepers; |
62 | size_t nbKeepers{}; | 57 | size_t nbKeepers{}; |
63 | }; | 58 | }; |
64 | std::variant<std::monostate, Keeper, KV> keeper_array; | 59 | std::variant<std::monostate, Keeper, KV> keeper_array; |