SDL3pp
A slim C++ wrapper for SDL3
Loading...
Searching...
No Matches
SDL3pp_loadso.h
1#ifndef SDL3PP_LOADSO_H_
2#define SDL3PP_LOADSO_H_
3
4#include <SDL3/SDL_loadso.h>
5#include "SDL3pp_stdinc.h"
6
7namespace SDL {
8
43// Forward decl
44struct SharedObject;
45
47using SharedObjectRaw = SDL_SharedObject*;
48
49// Forward decl
50struct SharedObjectRef;
51
54{
56
59 : value(value)
60 {
61 }
62
64 constexpr SharedObjectParam(std::nullptr_t = nullptr)
65 : value(nullptr)
66 {
67 }
68
70 constexpr explicit operator bool() const { return !!value; }
71
73 constexpr auto operator<=>(const SharedObjectParam& other) const = default;
74
76 constexpr operator SharedObjectRaw() const { return value; }
77};
78
91{
92 SharedObjectRaw m_resource = nullptr;
93
94public:
96 constexpr SharedObject(std::nullptr_t = nullptr) noexcept
97 : m_resource(0)
98 {
99 }
100
108 constexpr explicit SharedObject(const SharedObjectRaw resource) noexcept
109 : m_resource(resource)
110 {
111 }
112
113protected:
115 constexpr SharedObject(const SharedObject& other) noexcept = default;
116
117public:
119 constexpr SharedObject(SharedObject&& other) noexcept
120 : SharedObject(other.release())
121 {
122 }
123
124 constexpr SharedObject(const SharedObjectRef& other) = delete;
125
126 constexpr SharedObject(SharedObjectRef&& other) = delete;
127
143 : m_resource(SDL_LoadObject(sofile))
144 {
145 }
146
148 ~SharedObject() { SDL_UnloadObject(m_resource); }
149
151 constexpr SharedObject& operator=(SharedObject&& other) noexcept
152 {
153 std::swap(m_resource, other.m_resource);
154 return *this;
155 }
156
157protected:
159 constexpr SharedObject& operator=(const SharedObject& other) noexcept =
160 default;
161
162public:
164 constexpr SharedObjectRaw get() const noexcept { return m_resource; }
165
167 constexpr SharedObjectRaw release() noexcept
168 {
169 auto r = m_resource;
170 m_resource = nullptr;
171 return r;
172 }
173
175 constexpr auto operator<=>(const SharedObject& other) const noexcept =
176 default;
177
179 constexpr explicit operator bool() const noexcept { return !!m_resource; }
180
182 constexpr operator SharedObjectParam() const noexcept { return {m_resource}; }
183
196 void Unload();
197
225};
226
229{
231
240 : SharedObject(resource.value)
241 {
242 }
243
252 : SharedObject(resource)
253 {
254 }
255
257 constexpr SharedObjectRef(const SharedObjectRef& other) noexcept = default;
258
261};
262
278{
279 return SharedObject(std::move(sofile));
280}
281
310{
311 return SDL_LoadFunction(handle, name);
312}
313
315{
316 return SDL::LoadFunction(m_resource, std::move(name));
317}
318
334inline void UnloadObject(SharedObjectRaw handle) { SDL_UnloadObject(handle); }
335
337
339
340} // namespace SDL
341
342#endif /* SDL3PP_LOADSO_H_ */
An opaque datatype that represents a loaded shared object.
Definition: SDL3pp_loadso.h:91
constexpr SharedObject(const SharedObjectRaw resource) noexcept
Constructs from SharedObjectParam.
Definition: SDL3pp_loadso.h:108
constexpr SharedObject & operator=(const SharedObject &other) noexcept=default
Assignment operator.
constexpr SharedObjectRaw get() const noexcept
Retrieves underlying SharedObjectRaw.
Definition: SDL3pp_loadso.h:164
SharedObject(StringParam sofile)
Dynamically load a shared object.
Definition: SDL3pp_loadso.h:142
constexpr SharedObject(const SharedObject &other) noexcept=default
Copy constructor.
constexpr auto operator<=>(const SharedObject &other) const noexcept=default
Comparison.
constexpr SharedObject(std::nullptr_t=nullptr) noexcept
Default ctor.
Definition: SDL3pp_loadso.h:96
constexpr SharedObjectRaw release() noexcept
Retrieves underlying SharedObjectRaw and clear this.
Definition: SDL3pp_loadso.h:167
~SharedObject()
Destructor.
Definition: SDL3pp_loadso.h:148
constexpr SharedObject & operator=(SharedObject &&other) noexcept
Assignment operator.
Definition: SDL3pp_loadso.h:151
constexpr SharedObject(SharedObject &&other) noexcept
Move constructor.
Definition: SDL3pp_loadso.h:119
Helpers to use C++ strings parameters.
Definition: SDL3pp_strings.h:43
FunctionPointer LoadFunction(StringParam name)
Look up the address of the named function in a shared object.
Definition: SDL3pp_loadso.h:314
SharedObject LoadObject(StringParam sofile)
Dynamically load a shared object.
Definition: SDL3pp_loadso.h:277
void UnloadObject(SharedObjectRaw handle)
Unload a shared object from memory.
Definition: SDL3pp_loadso.h:334
void Unload()
Unload a shared object from memory.
Definition: SDL3pp_loadso.h:336
FunctionPointer LoadFunction(SharedObjectParam handle, StringParam name)
Look up the address of the named function in a shared object.
Definition: SDL3pp_loadso.h:309
SDL_SharedObject * SharedObjectRaw
Alias to raw representation for SharedObject.
Definition: SDL3pp_loadso.h:47
void(SDLCALL *)() FunctionPointer
A generic function pointer.
Definition: SDL3pp_stdinc.h:6388
Main include header for the SDL3pp library.
Safely wrap SharedObject for non owning parameters.
Definition: SDL3pp_loadso.h:54
SharedObjectRaw value
parameter's SharedObjectRaw
Definition: SDL3pp_loadso.h:55
constexpr SharedObjectParam(std::nullptr_t=nullptr)
Constructs null/invalid.
Definition: SDL3pp_loadso.h:64
constexpr SharedObjectParam(SharedObjectRaw value)
Constructs from SharedObjectRaw.
Definition: SDL3pp_loadso.h:58
constexpr auto operator<=>(const SharedObjectParam &other) const =default
Comparison.
Semi-safe reference for SharedObject.
Definition: SDL3pp_loadso.h:229
SharedObjectRef(SharedObjectParam resource) noexcept
Constructs from SharedObjectParam.
Definition: SDL3pp_loadso.h:239
SharedObjectRef(SharedObjectRaw resource) noexcept
Constructs from SharedObjectParam.
Definition: SDL3pp_loadso.h:251
~SharedObjectRef()
Destructor.
Definition: SDL3pp_loadso.h:260
constexpr SharedObjectRef(const SharedObjectRef &other) noexcept=default
Copy constructor.