Grindstone Game Engine
v0.2.0
An open source game engine and toolkit.
Toggle main menu visibility
Loading...
Searching...
No Matches
SharedPtr.hpp
1
#pragma once
2
3
#include <functional>
4
5
namespace
Grindstone
{
6
template
<
typename
T>
7
class
SharedPtr {
8
public
:
9
struct
SharedPtrRefCounter
{
10
unsigned
int
refCount = 1;
11
};
12
13
SharedPtr() =
default
;
14
15
SharedPtr(T* ptr, std::function<
void
(
void
*)> deleteFn)
16
: ptr(ptr),
17
refCounter(new
SharedPtrRefCounter
()),
18
deleteFn(deleteFn) {}
19
20
SharedPtr
(
const
SharedPtr
& obj)
21
: ptr(obj.ptr), refCounter(obj.refCounter), deleteFn(obj.deleteFn) {
22
if
(refCounter) {
23
++refCounter->refCount;
24
}
25
}
26
27
SharedPtr& operator=(
const
SharedPtr& obj) {
28
if
(ptr && refCounter && --refCounter->refCount == 0) {
29
ptr->~T();
30
deleteFn(ptr);
31
delete
refCounter;
32
}
33
34
ptr = obj.ptr;
35
deleteFn = obj.deleteFn;
36
refCounter = obj.refCounter;
37
38
if
(ptr && refCounter) {
39
++refCounter->refCount;
40
}
41
42
return
*
this
;
43
}
44
45
T* operator->() {
46
return
this->ptr;
47
}
48
49
T& operator*() {
50
return
*(this->ptr);
51
}
52
53
const
T* operator->()
const
{
54
return
this->ptr;
55
}
56
57
const
T& operator*()
const
{
58
return
*(this->ptr);
59
}
60
61
~SharedPtr() {
62
if
(refCounter !=
nullptr
&&
63
ptr !=
nullptr
&&
64
--refCounter->refCount == 0
65
) {
66
ptr->~T();
67
deleteFn(ptr);
68
delete
refCounter;
69
}
70
}
71
72
private
:
73
T* ptr =
nullptr
;
74
SharedPtrRefCounter
* refCounter =
nullptr
;
75
std::function<void(
void
*)> deleteFn;
76
};
77
78
template
<
typename
T,
typename
... Args>
79
SharedPtr<T>
MakeShared(Args&&... params) {
80
return
new
T(std::forward<Args>(params)...);
81
}
82
}
Grindstone::SharedPtr
Definition
SharedPtr.hpp:7
Grindstone
Definition
Assert.hpp:16
Grindstone::SharedPtr::SharedPtrRefCounter
Definition
SharedPtr.hpp:9
sources
code
Common
Memory
SmartPointers
SharedPtr.hpp
Generated by
1.17.0