1#ifndef SDL3PP_RESOURCE_H_
2#define SDL3PP_RESOURCE_H_
15template<
class T,
class RESOURCE>
17 { *test } -> std::convertible_to<RESOURCE>;
38 : m_resource(std::move(resource))
61 constexpr explicit operator bool()
const {
return m_resource; }
64 constexpr operator value_type()
const {
return m_resource; }
70 constexpr bool operator==(std::nullopt_t)
const {
return !m_resource; }
73 constexpr bool operator==(std::nullptr_t)
const {
return !m_resource; }
76 constexpr T
get()
const {
return m_resource; }
86template<
class RESOURCE>
90 void operator()(RESOURCE& ref)
const { RESOURCE::reset(ref.get()); }
98template<
class RESOURCE>
124 constexpr operator bool()
const {
return bool(m_value); }
129 return m_value == other.m_value;
133 constexpr bool operator==(std::nullptr_t)
const {
return !*
this; }
136 constexpr bool operator==(std::nullopt_t)
const {
return !*
this; }
156template<
class RESOURCE,
class DELETER>
166 , m_deleter(std::move(
deleter))
195template<
class RESOURCE,
class DELETER = DefaultDeleter<RESOURCE>>
206 : base(other, std::move(
deleter))
224template<
class RESOURCE,
class DELETER = DefaultDeleter<RESOURCE>>
236 : base(value, std::move(
deleter))
259 base::operator=(other);
273template<
class UNIQUE>
281template<
class UNIQUE>
285 std::shared_ptr<UNIQUE> m_shared;
289 :
base(shared ? **shared :
nullptr)
290 , m_shared(std::move(shared))
301 , m_shared(std::make_shared<UNIQUE>(std::move(value)))
307 typename UNIQUE::deleter deleter = {})
313 constexpr bool unique()
const {
return m_shared.unique(); }
326template<
class UNIQUE>
329 std::weak_ptr<UNIQUE> m_shared;
337 : m_shared(shared.m_shared)
345 constexpr bool expired()
const {
return m_shared.expired(); }
348 constexpr operator bool()
const {
return !
expired(); }
370template<
class RESOURCE,
class UNIQUE>
406template<
class RESOURCE>
414 :
base(std::move(resource))
426 :
base(std::move(other))
428 other.
get() =
nullptr;
437 base::operator=(other);
438 other.
get() =
nullptr;
449 return std::hash<T>{}(s.get());
458 return hash(s.get());
A detached reference to resource that might be transformed into an owned handle.
Definition SDL3pp_resource.h:373
constexpr DetachedResource(DetachedResource &&other)=default
Move ctor.
constexpr DetachedResource & operator=(DetachedResource &&other)=default
Move assignment.
constexpr DetachedResource(RESOURCE other)
Constructs pointer from anything compatible.
Definition SDL3pp_resource.h:378
Base class for locks.
Definition SDL3pp_resource.h:408
LockBase & operator=(LockBase other)
Move assignment.
Definition SDL3pp_resource.h:435
LockBase(LockBase &&other)
Move ctor.
Definition SDL3pp_resource.h:425
constexpr LockBase(RESOURCE &&resource)
Constructs initializing member.
Definition SDL3pp_resource.h:413
constexpr LockBase()=default
Default ctor.
constexpr ~LockBase()
Dtor.
Definition SDL3pp_resource.h:432
Base class for resource pointer-like owner objects.
Definition SDL3pp_resource.h:158
constexpr ResourceOwnerBase(base::value_type value={}, DELETER deleter={})
Constructs from raw type.
Definition SDL3pp_resource.h:164
void free()
Frees resource.
Definition SDL3pp_resource.h:171
RESOURCE release()
Returns reference and reset this.
Definition SDL3pp_resource.h:178
DELETER deleter
The deleter type.
Definition SDL3pp_resource.h:175
Base class for resource pointer-like objects.
Definition SDL3pp_resource.h:100
constexpr bool operator==(const ResourcePtrBase &other) const
Comparison.
Definition SDL3pp_resource.h:127
constexpr ResourcePtrBase(value_type value={})
Constructs from raw type.
Definition SDL3pp_resource.h:114
constexpr bool operator==(std::nullopt_t) const
Comparison.
Definition SDL3pp_resource.h:136
constexpr bool operator==(std::nullptr_t) const
Comparison.
Definition SDL3pp_resource.h:133
constexpr const reference * operator->() const
Gets addressable reference.
Definition SDL3pp_resource.h:142
constexpr reference operator*() const
Gets reference.
Definition SDL3pp_resource.h:139
reference & get()
Get reference.
Definition SDL3pp_resource.h:120
typename reference::value_type value_type
The raw resource type.
Definition SDL3pp_resource.h:106
reference get() const
Get reference.
Definition SDL3pp_resource.h:148
constexpr reference * operator->()
Gets addressable reference.
Definition SDL3pp_resource.h:145
RESOURCE reference
The reference resource type.
Definition SDL3pp_resource.h:103
Implement shared ownership for a resource.
Definition SDL3pp_resource.h:283
constexpr ResourceShared(base::value_type value, typename UNIQUE::deleter deleter={})
Constructs from raw type.
Definition SDL3pp_resource.h:306
constexpr ResourceShared(std::nullptr_t=nullptr)
Default constructor.
Definition SDL3pp_resource.h:296
constexpr ResourceShared(UNIQUE &&value)
Constructs from unique type.
Definition SDL3pp_resource.h:299
void reset()
Reset this instance.
Definition SDL3pp_resource.h:316
constexpr bool unique() const
True if this is the only shared instance.
Definition SDL3pp_resource.h:313
Implement unique ownership for a resource.
Definition SDL3pp_resource.h:226
constexpr ResourceUnique(std::nullptr_t=nullptr)
Default constructor.
Definition SDL3pp_resource.h:231
void reset()
Resets the value, destroying the resource if not nullptr.
Definition SDL3pp_resource.h:265
constexpr ResourceUnique & operator=(ResourceUnique other)
Assignment operator.
Definition SDL3pp_resource.h:257
constexpr ResourceUnique(base::value_type value, DELETER deleter={})
Constructs from raw type.
Definition SDL3pp_resource.h:234
constexpr ResourceUnique(ResourceUnique &&other)
Move constructor.
Definition SDL3pp_resource.h:241
~ResourceUnique()
Destructor.
Definition SDL3pp_resource.h:254
A dumb pointer to resource.
Definition SDL3pp_resource.h:197
void reset()
Resets the value, destroying the resource if not nullptr.
Definition SDL3pp_resource.h:212
constexpr ResourceUnsafe(RESOURCE other, DELETER deleter={})
Constructs pointer from anything compatible.
Definition SDL3pp_resource.h:205
constexpr ResourceUnsafe()=default
Default constructor.
Implement weak ownership for a resource.
Definition SDL3pp_resource.h:328
ResourceShared< UNIQUE > lock() const
Lock back to ResourceShared.
Definition SDL3pp_resource.h:351
constexpr ResourceWeak(const ResourceShared< UNIQUE > &shared)
Constructs from ResourceShared.
Definition SDL3pp_resource.h:336
constexpr bool expired() const
True if expired.
Definition SDL3pp_resource.h:345
constexpr ResourceWeak()=default
Default constructor.
constexpr bool operator==(const ResourceWeak &other) const =default
Compares.
A SDL managed resource.
Definition SDL3pp_resource.h:29
constexpr bool operator==(const Resource &other) const =default
Comparison.
T value_type
The raw resource type.
Definition SDL3pp_resource.h:34
constexpr T operator->()
Access to fields.
Definition SDL3pp_resource.h:82
constexpr Resource(const ResourceHandle< Resource< T > > auto &resource)
Constructs from pointer like.
Definition SDL3pp_resource.h:43
constexpr Resource(T resource={})
Constructs from the underlying resource.
Definition SDL3pp_resource.h:37
constexpr Resource(std::nullptr_t)
Equivalent to default ctor.
Definition SDL3pp_resource.h:49
constexpr const T operator->() const
Access to fields.
Definition SDL3pp_resource.h:79
constexpr bool operator==(std::nullptr_t) const
Comparison.
Definition SDL3pp_resource.h:73
constexpr T get() const
Return contained resource;.
Definition SDL3pp_resource.h:76
constexpr bool operator==(std::nullopt_t) const
Comparison.
Definition SDL3pp_resource.h:70
constexpr Resource(std::nullopt_t)
Equivalent to default ctor.
Definition SDL3pp_resource.h:55
Concept representing a valid resource handle.
Definition SDL3pp_resource.h:16
#define SDL_assert_paranoid(condition)
An assertion test that is performed only when built with paranoid settings.
Definition SDL3pp_assert.h:364
the main namespace where all SDL3pp public functions and types live
Definition SDL3pp_assert.h:7
std::size_t hash(const SDL::Resource< T > &s) noexcept
Get hash for resource type.
Definition SDL3pp_resource.h:447
Default deleter.
Definition SDL3pp_resource.h:88
void operator()(RESOURCE &ref) const
Deletes resource.
Definition SDL3pp_resource.h:90
Utility class to help creating std::hash.
Definition SDL3pp_resource.h:466
std::size_t operator()(const T &s) const noexcept
Calculate hash.
Definition SDL3pp_resource.h:469