Cogs.Core
ResourcePointer.h
1#pragma once
2
3#include "Utilities.h"
4
5namespace Cogs
6{
7 template<class T>
9 {
10 ResourcePointer() : resource(nullptr) {}
11 ResourcePointer(T * resource) : resource(resource) {}
12
13 ResourcePointer(const ResourcePointer & resourcePointer)
14 {
15 this->resource = resourcePointer.resource;
16
17 if (this->resource) {
18 this->resource->AddRef();
19 }
20 }
21
22 ResourcePointer(ResourcePointer && resourcePointer)
23 {
24 this->resource = resourcePointer.resource;
25 resourcePointer.resource = nullptr;
26 }
27
28 ~ResourcePointer() { this->release(); }
29
30 void release()
31 {
32 T * t = this->resource;
33
34 if (t) {
35 this->resource = nullptr;
36 if (!t->Release()) {
37 UnregisterGPUResource(t);
38 }
39 }
40 }
41
42 ResourcePointer & operator=(const ResourcePointer & resourcePointer)
43 {
44 this->release();
45
46 this->resource = resourcePointer.resource;
47
48 if (this->resource) {
49 this->resource->AddRef();
50 }
51
52 return *this;
53 }
54
55 ResourcePointer & operator=(ResourcePointer && resourcePointer) noexcept
56 {
57 this->release();
58
59 this->resource = resourcePointer.resource;
60 resourcePointer.resource = nullptr;
61
62 return *this;
63 }
64
65 T ** internalPointer() { this->release(); return &resource; }
66 void ** internalVoidPointer() { this->release(); return reinterpret_cast<void**>(&resource); }
67
68 T * const * operator &() const { return &resource; }
69
70 operator T *() const { return resource; }
71
72 T * operator->() { return resource; }
73
74 const T * operator->() const { return resource; }
75
76 T & operator*() { return *resource; }
77
78 const T & operator*() const { return *resource; }
79
80 template<typename U>
81 U * get()
82 {
83 return static_cast<U *>(resource);
84 }
85
86 private:
87 T * resource;
88 };
89}
Contains all Cogs related functionality.
Definition: FieldSetter.h:23