1
1
#pragma once
2
2
3
3
#include < algorithm>
4
+ #include < cstddef>
4
5
#include < unordered_map>
5
6
6
7
namespace sd
@@ -16,8 +17,8 @@ namespace sd
16
17
17
18
class MemoryManager : public IMemoryManager
18
19
{
19
- private:
20
20
#pragma region HelperClasses
21
+ private:
21
22
class Object
22
23
{
23
24
public:
@@ -61,6 +62,9 @@ namespace sd
61
62
void unmark () { _marked = false ; }
62
63
bool isMarked () const { return _marked; }
63
64
const TypeInfo *getTypeInfo () const { return _typeInfo; }
65
+
66
+ bool isValid () const { return !!getTypeInfo (); }
67
+ operator bool () const { return isValid (); }
64
68
};
65
69
66
70
private:
@@ -80,16 +84,29 @@ namespace sd
80
84
};
81
85
82
86
void *getRawPtr () const { return _ptr; }
83
- Metadata &getMetadata () { return _metadata; }
84
- const Metadata &getMetadata () const { return _metadata; }
85
87
const TypeInfo *getTypeInfo () const { return getMetadata ().getTypeInfo (); }
86
88
87
89
size_t getSize () const { return getTypeInfo ()->getSize (); }
88
90
bool isMarked () const { return getMetadata ().isMarked (); }
89
91
void mark () { getMetadata ().mark (); }
90
92
void unmark () { getMetadata ().unmark (); }
91
93
92
- void destroy () { (*getTypeInfo ()->getDeleter ())(getRawPtr ()); }
94
+ bool isValid () const { return !!getRawPtr () && getMetadata (); }
95
+ operator bool () const { return isValid (); }
96
+
97
+ void destroy ()
98
+ {
99
+ if (isValid ())
100
+ {
101
+ (*getTypeInfo ()->getDeleter ())(getRawPtr ());
102
+ }
103
+ _ptr = nullptr ;
104
+ _metadata = Metadata{nullptr };
105
+ }
106
+
107
+ private:
108
+ Metadata &getMetadata () { return _metadata; }
109
+ const Metadata &getMetadata () const { return _metadata; }
93
110
};
94
111
95
112
class ObjectsRegister
@@ -98,14 +115,14 @@ namespace sd
98
115
std::unordered_map<void *, Object> _objectsMap;
99
116
100
117
public:
101
- void registerNew (Object &&object) { _objectsMap.insert ({object.getRawPtr (), std::move (object)}); }
102
- bool contains (void *objectPtr) const { return _objectsMap.contains (objectPtr); }
118
+ void registerObject (Object &&object) { _objectsMap.insert ({object.getRawPtr (), std::move (object)}); }
119
+ bool isObjectRegistered (void *objectPtr) const { return _objectsMap.contains (objectPtr); }
103
120
Object &getObject (void *objectPtr) { return _objectsMap.at (objectPtr); }
104
121
105
122
void clear () { _objectsMap.clear (); }
106
123
107
- size_t numberOfRegisteredObjects () const { return _objectsMap.size (); }
108
- bool anyObjectRegistered () const { return _objectsMap.empty (); }
124
+ size_t size () const { return _objectsMap.size (); }
125
+ bool empty () const { return _objectsMap.empty (); }
109
126
110
127
template <class Fn > void unregisterIf (Fn func)
111
128
{
@@ -117,7 +134,7 @@ namespace sd
117
134
}
118
135
};
119
136
#pragma endregion
120
-
137
+ private:
121
138
ObjectsRegister _objectRegister;
122
139
123
140
size_t _allocatedMemory = 0 ;
@@ -144,7 +161,7 @@ namespace sd
144
161
auto object = Object::create<T>(std::forward<Args>(params)...);
145
162
auto ptr = reinterpret_cast <T *>(object.getRawPtr ());
146
163
_allocatedMemory += object.getSize ();
147
- _objectRegister.registerNew (std::move (object));
164
+ _objectRegister.registerObject (std::move (object));
148
165
if (isGBCollectionNeeded ())
149
166
{
150
167
garbageCollect ();
0 commit comments