@@ -20,60 +20,66 @@ namespace sd
20
20
{
21
21
#pragma region HelperClasses
22
22
private:
23
- struct IObject
23
+ struct IObjectHolder
24
24
{
25
- virtual void *getPtr () const = 0;
25
+ virtual void *getObjectPtr () const = 0;
26
26
27
- virtual size_t getSize () const = 0;
27
+ virtual size_t getObjectSize () const = 0;
28
28
29
29
virtual bool isMarked () const = 0;
30
30
virtual void mark () = 0;
31
31
virtual void unmark () = 0;
32
32
33
+ virtual void destroyObject () = 0;
33
34
virtual bool isValid () const = 0;
34
35
35
- virtual ~IObject () {}
36
+ virtual ~IObjectHolder () {}
36
37
};
37
38
38
- template <class T > class Object final : public IObject
39
+ template <class T > class ObjectHolder final : public IObjectHolder
39
40
{
40
41
private:
41
42
bool _marked = false ;
42
- std::unique_ptr<T> _ptr ;
43
+ std::unique_ptr<T> _objectPtr ;
43
44
44
- Object (T *ptr ) : _ptr(ptr ) {}
45
+ ObjectHolder (T *objectPtr ) : _objectPtr(objectPtr ) {}
45
46
46
47
public:
47
- Object (const Object &) = delete ;
48
- Object &operator =(const Object &) = delete ;
48
+ ObjectHolder (const ObjectHolder &) = delete ;
49
+ ObjectHolder &operator =(const ObjectHolder &) = delete ;
49
50
50
- template <class ... Args> static std::unique_ptr<Object <T>> create (Args &&...params)
51
+ template <class ... Args> static std::unique_ptr<ObjectHolder <T>> create (Args &&...params)
51
52
{
52
- return std::unique_ptr<Object<T>>(new Object{new T{std::forward<Args>(params)...}});
53
+ auto objectPtr = new T{std::forward<Args>(params)...};
54
+ return std::unique_ptr<ObjectHolder<T>>(new ObjectHolder{objectPtr});
53
55
};
54
56
55
- T *getTypedPtr () const { return _ptr .get (); }
56
- void *getPtr () const final { return _ptr .get (); }
57
+ T *getTypedObjectPtr () const { return _objectPtr .get (); }
58
+ void *getObjectPtr () const final { return _objectPtr .get (); }
57
59
58
- size_t getSize () const final { return sizeof (T); }
60
+ size_t getObjectSize () const final { return sizeof (T); }
59
61
60
62
bool isMarked () const final { return _marked; }
61
63
void mark () final { _marked = true ; }
62
64
void unmark () final { _marked = false ; }
63
65
64
- bool isValid () const final { return !!getPtr (); }
66
+ void destroyObject () { _objectPtr.reset (); }
67
+ bool isValid () const final { return !!getObjectPtr (); }
65
68
operator bool () const { return isValid (); }
66
69
};
67
70
68
71
class ObjectsRegister
69
72
{
70
73
private:
71
- std::unordered_map<void *, std::unique_ptr<IObject >> _objectsMap;
74
+ std::unordered_map<void *, std::unique_ptr<IObjectHolder >> _objectsMap;
72
75
73
76
public:
74
- void registerObject (std::unique_ptr<IObject> ob) { _objectsMap.insert ({ob->getPtr (), std::move (ob)}); }
77
+ void registerObject (std::unique_ptr<IObjectHolder> objectHolder)
78
+ {
79
+ _objectsMap.insert ({objectHolder->getObjectPtr (), std::move (objectHolder)});
80
+ }
75
81
bool isObjectRegistered (void *objectPtr) const { return _objectsMap.contains (objectPtr); }
76
- IObject & getObject (void *objectPtr) { return *_objectsMap.at (objectPtr); }
82
+ IObjectHolder & getObjectHolder (void *objectPtr) { return *_objectsMap.at (objectPtr); }
77
83
78
84
void clear () { _objectsMap.clear (); }
79
85
@@ -91,7 +97,7 @@ namespace sd
91
97
};
92
98
#pragma endregion
93
99
private:
94
- ObjectsRegister _objectRegister ;
100
+ ObjectsRegister _objectsRegister ;
95
101
96
102
size_t _allocatedMemory = 0 ;
97
103
size_t _memoryLimit = 1 * 1024 * 1024 ; // ~1MB
@@ -112,12 +118,12 @@ namespace sd
112
118
* Get Pointner to newly created menagable object,
113
119
* if object wont be recheable in stack scope it will be collected
114
120
*/
115
- template <class T , class ... Args> T *create (Args &&...params)
121
+ template <class T , class ... Args> T *createObject (Args &&...params)
116
122
{
117
- std::unique_ptr<Object <T>> object = Object <T>::create (std::forward<Args>(params)...);
118
- T *ptr = object-> getTypedPtr ();
119
- _allocatedMemory += object-> getSize ();
120
- _objectRegister .registerObject (std::move (object ));
123
+ std::unique_ptr<ObjectHolder <T>> objectHolderPtr = ObjectHolder <T>::create (std::forward<Args>(params)...);
124
+ T *ptr = objectHolderPtr-> getTypedObjectPtr ();
125
+ _allocatedMemory += objectHolderPtr-> getObjectSize ();
126
+ _objectsRegister .registerObject (std::move (objectHolderPtr ));
121
127
if (isGBCollectionNeeded ())
122
128
{
123
129
garbageCollect ();
@@ -140,14 +146,15 @@ namespace sd
140
146
size_t getAllocatedMemory () const override ;
141
147
142
148
private:
149
+ void destroyObject (IObjectHolder &objectHolder);
143
150
void clear ();
144
151
145
152
bool isGBCollectionNeeded ();
146
153
void mark ();
147
154
void sweep ();
148
155
149
156
std::vector<void *> getRoots ();
150
- std::vector<void *> getInnerObjects (const IObject &object );
157
+ std::vector<void *> getInnerObjects (const IObjectHolder &objectHolder );
151
158
152
159
size_t getMemoryLimit () const ;
153
160
void bumpMemoryLimit ();
@@ -158,6 +165,6 @@ namespace sd
158
165
*/
159
166
template <class T , class ... Args> T *make (Args &&...params)
160
167
{
161
- return MemoryManager::instance ().create <T>(std::forward<Args>(params)...);
168
+ return MemoryManager::instance ().createObject <T>(std::forward<Args>(params)...);
162
169
}
163
170
} // namespace sd
0 commit comments