SDL3pp
A slim C++ wrapper for SDL3
Loading...
Searching...
No Matches
SDL3pp_resource.h
1#ifndef SDL3PP_RESOURCE_H_
2#define SDL3PP_RESOURCE_H_
3
4#include <cstdlib>
5
6namespace SDL {
7
16
18template<typename RAW_POINTER, typename RAW_CONST_POINTER = RAW_POINTER>
20{
21public:
23 using RawPointer = RAW_POINTER;
24
26 using RawConstPointer = RAW_CONST_POINTER;
27
29 constexpr ResourceBase(RawPointer resource)
30 : m_resource(resource)
31 {
32 }
33
35 constexpr ResourceBase(std::nullptr_t = nullptr)
36 : m_resource{}
37 {
38 }
39
41 constexpr explicit operator bool() const { return !!m_resource; }
42
44 constexpr auto operator<=>(const ResourceBase& other) const = default;
45
47 constexpr RawConstPointer operator->() const noexcept { return m_resource; }
48
50 constexpr RawPointer operator->() noexcept { return m_resource; }
51
53 constexpr RawPointer get() const noexcept { return m_resource; }
54
56 constexpr RawPointer release() noexcept
57 {
58 auto r = m_resource;
59 m_resource = {};
60 return r;
61 }
62
63 friend constexpr void swap(ResourceBase& lhs, ResourceBase& rhs) noexcept
64 {
65 std::swap(lhs.m_resource, rhs.m_resource);
66 }
67
68private:
69 RawPointer m_resource;
70};
71
73template<typename RAW_POINTER>
75{
76public:
78 using RawPointer = RAW_POINTER;
79
81 constexpr ResourceLegacyRef(RawPointer resource)
82 : m_resource(resource)
83 {
84 }
85
87 constexpr ResourceLegacyRef(std::nullptr_t = nullptr)
88 : m_resource(nullptr)
89 {
90 }
91
93 constexpr explicit operator bool() const { return !!m_resource; }
94
96 constexpr auto operator<=>(const ResourceLegacyRef& other) const = default;
97
99 constexpr operator RawPointer() const { return m_resource; }
100
102 constexpr auto operator->() const { return m_resource; }
103
104private:
105 RawPointer m_resource;
106};
107
109template<typename RAW_POINTER, typename RAW_CONST_POINTER>
111{
112public:
114 using RawPointer = RAW_POINTER;
115
117 using RawConstPointer = RAW_CONST_POINTER;
118
121 : m_resource(resource)
122 {
123 }
124
126 constexpr ResourceConstRef(std::nullptr_t = nullptr)
127 : m_resource(nullptr)
128 {
129 }
130
132 constexpr explicit operator bool() const { return !!m_resource; }
133
135 constexpr auto operator<=>(const ResourceConstRef& other) const = default;
136
138 constexpr operator RawConstPointer() const { return m_resource; }
139
141 constexpr operator RawPointer() const
142 {
143 return const_cast<RawPointer>(m_resource);
144 }
145
147 constexpr auto operator->() const { return m_resource; }
148
149private:
150 RawConstPointer m_resource;
151};
152
154template<typename RESOURCE>
155struct ResourceRef : RESOURCE
156{
157 using RESOURCE::RESOURCE;
158
160 using RawPointer = RESOURCE::RawPointer;
161
163 using RawConstPointer = RESOURCE::RawConstPointer;
164
172 constexpr ResourceRef(RawPointer resource) noexcept
173 : RESOURCE(resource)
174 {
175 }
176
184 constexpr ResourceRef(const RESOURCE& resource) noexcept
185 : RESOURCE(resource.get())
186 {
187 }
188
196 constexpr ResourceRef(RESOURCE&& resource) noexcept
197 : RESOURCE(std::move(resource).release())
198 {
199 }
200
202 constexpr ResourceRef(const ResourceRef& other) noexcept
203 : RESOURCE(other.get())
204 {
205 }
206
208 constexpr ResourceRef(ResourceRef&& other) noexcept
209 : RESOURCE(other.get())
210 {
211 }
212
214 ~ResourceRef() { this->release(); }
215
217 ResourceRef& operator=(const ResourceRef& other) noexcept
218 {
219 this->release();
220 RESOURCE::operator=(RESOURCE(other.get()));
221 return *this;
222 }
223
225 constexpr operator RawPointer() const noexcept { return this->get(); }
226};
227
229
230} // namespace SDL
231
232#endif /* SDL3PP_RESOURCE_H_ */
Base class for resources.
Definition SDL3pp_resource.h:20
constexpr RawPointer get() const noexcept
Retrieves underlying resource pointer.
Definition SDL3pp_resource.h:53
constexpr RawPointer release() noexcept
Retrieves underlying resource pointer and clear this.
Definition SDL3pp_resource.h:56
constexpr auto operator<=>(const ResourceBase &other) const =default
Comparison.
constexpr RawConstPointer operator->() const noexcept
member access to underlying resource pointer.
Definition SDL3pp_resource.h:47
constexpr ResourceBase(RawPointer resource)
Constructs from resource pointer.
Definition SDL3pp_resource.h:29
constexpr ResourceBase(std::nullptr_t=nullptr)
Constructs null/invalid.
Definition SDL3pp_resource.h:35
constexpr RawPointer operator->() noexcept
member access to underlying resource pointer.
Definition SDL3pp_resource.h:50
RAW_CONST_POINTER RawConstPointer
The underlying const raw pointer type.
Definition SDL3pp_resource.h:26
RAW_POINTER RawPointer
The underlying raw pointer type.
Definition SDL3pp_resource.h:23
AnimationRaw RawPointer
Definition SDL3pp_resource.h:114
AnimationRawConst RawConstPointer
Definition SDL3pp_resource.h:117
constexpr ResourceConstRef(RawConstPointer resource)
Constructs from const pointer.
Definition SDL3pp_resource.h:120
constexpr auto operator<=>(const ResourceConstRef &other) const =default
Comparison.
constexpr ResourceConstRef(std::nullptr_t=nullptr)
Constructs null/invalid.
Definition SDL3pp_resource.h:126
constexpr auto operator->() const
member access to underlying type.
Definition SDL3pp_resource.h:147
constexpr auto operator->() const
member access to underlying type.
Definition SDL3pp_resource.h:102
constexpr ResourceLegacyRef(RawPointer resource)
Constructs from RawPointer.
Definition SDL3pp_resource.h:81
RAW_POINTER RawPointer
The underlying raw pointer type.
Definition SDL3pp_resource.h:78
constexpr auto operator<=>(const ResourceLegacyRef &other) const =default
Comparison.
constexpr ResourceLegacyRef(std::nullptr_t=nullptr)
Constructs null/invalid.
Definition SDL3pp_resource.h:87
Main include header for the SDL3pp library.
constexpr ResourceRef(RawPointer resource) noexcept
Constructs from raw resource.
Definition SDL3pp_resource.h:172
constexpr ResourceRef(RESOURCE &&resource) noexcept
Constructs from RESOURCE.
Definition SDL3pp_resource.h:196
~ResourceRef()
Destructor.
Definition SDL3pp_resource.h:214
constexpr ResourceRef(ResourceRef &&other) noexcept
Move constructor.
Definition SDL3pp_resource.h:208
AsyncIO::RawConstPointer RawConstPointer
Definition SDL3pp_resource.h:163
AsyncIO::RawPointer RawPointer
Definition SDL3pp_resource.h:160
constexpr ResourceRef(const RESOURCE &resource) noexcept
Constructs from resource.
Definition SDL3pp_resource.h:184
constexpr ResourceRef(const ResourceRef &other) noexcept
Copy constructor.
Definition SDL3pp_resource.h:202
ResourceRef & operator=(const ResourceRef &other) noexcept
Assignment operator.
Definition SDL3pp_resource.h:217