Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
SharedPtr.hpp
1#pragma once
2
3#include <functional>
4
5namespace Grindstone {
6 template<typename T>
7 class SharedPtr {
8 public:
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}
Definition SharedPtr.hpp:7
Definition Assert.hpp:16