fennec
Loading...
Searching...
No Matches
pointers.h
1// =====================================================================================================================
2// fennec, a free and open source game engine
3// Copyright © 2025 Medusa Slockbower
4//
5// This program is free software: you can redistribute it and/or modify
6// it under the terms of the GNU General Public License as published by
7// the Free Software Foundation, either version 3 of the License, or
8// (at your option) any later version.
9//
10// This program is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU General Public License for more details.
14//2
15// You should have received a copy of the GNU General Public License
16// along with this program. If not, see <https://www.gnu.org/licenses/>.
17// =====================================================================================================================
18
19#ifndef FENNEC_MEMORY_POINTERS_H
20#define FENNEC_MEMORY_POINTERS_H
21
23#include <fennec/lang/utility.h>
24
25namespace fennec
26{
27
31template<typename TypeT>
33{
36 constexpr default_delete() noexcept = default;
37
41 template<class ConvT> requires requires { is_convertible<ConvT*, TypeT*>{}.value == true; }
42 constexpr default_delete(const default_delete<ConvT>&) noexcept {}
43
47 constexpr void operator()(TypeT* ptr) const noexcept {
48 static_assert(not is_void_v<TypeT>, "cannot delete a pointer to an incomplete type");
49 static_assert(is_complete_v<TypeT>, "cannot delete a pointer to an incomplete type");
50 delete ptr;
51 }
52};
53
54// Overload for Arrays
55template<typename TypeT>
56struct default_delete<TypeT[]>
57{
60 constexpr default_delete() noexcept = default;
61
65 template<class ConvT> requires requires { is_convertible_v<ConvT(*)[], TypeT(*)[]> == true; }
66 constexpr default_delete(const default_delete<ConvT(*)[]>&) noexcept {}
67
71 template<class ArrT> requires requires { is_convertible_v<ArrT(*)[], TypeT(*)[]> == true; }
72 constexpr void operator()(TypeT* ptr) const noexcept {
73 static_assert(not is_void_v<TypeT>, "cannot delete a pointer to an incomplete type");
74 static_assert(is_complete_v<TypeT>, "cannot delete a pointer to an incomplete type");
75 delete[] ptr;
76 }
77};
78
79
80
85template<typename TypeT, class DeleteT = default_delete<TypeT>>
87{
88public:
90 using element_t = TypeT;
91
94
96 using const_pointer_t = const element_t*;
97
99 using delete_t = DeleteT;
100
103 constexpr unique_ptr() : unique_ptr(nullptr) {}
104
107 constexpr unique_ptr(nullptr_t) noexcept : unique_ptr(nullptr, delete_t()) {}
108
113 explicit constexpr unique_ptr(pointer_t ptr, const delete_t& del = delete_t())
114 : _delete(del)
115 , _handle(ptr) {
116 }
117
121 constexpr unique_ptr(unique_ptr&& other)
122 : _handle(other._handle) {
123 other._handle = nullptr;
124 }
125
126 // Delete copy constructor
127 constexpr unique_ptr(const unique_ptr&) = delete;
128
131 constexpr ~unique_ptr() {
132 reset();
133 }
134
135 constexpr unique_ptr& operator=(const unique_ptr&) = delete;
136
137 constexpr unique_ptr& operator=(unique_ptr&& r) noexcept {
138 _delete = r._delete;
139 _handle = r._handle;
140 r._handle = nullptr;
141 return *this;
142 }
143
144 void reset(pointer_t ptr) {
145 if(_handle) {
146 _delete(_handle);
147 _handle = ptr;
148 }
149 }
150
151 void reset(nullptr_t = nullptr) {
152 if(_handle) {
153 _delete(_handle);
154 _handle = nullptr;
155 }
156 }
157
158 pointer_t release() {
159 pointer_t retval = _handle;
160 _handle = nullptr;
161 return retval;
162 }
163
164 pointer_t get() {
165 return _handle;
166 }
167
168 bool empty() {
169 return _handle == nullptr;
170 }
171
172 pointer_t operator->() {
173 return _handle;
174 }
175
176 const_pointer_t operator->() const {
177 return _handle;
178 }
179
180 operator bool() const {
181 return _handle != nullptr;
182 }
183
184
185private:
186 delete_t _delete;
187 pointer_t _handle;
188};
189
196template<typename TypeT, typename...ArgsT>
197unique_ptr<TypeT> make_unique(ArgsT&&...args) {
198 return unique_ptr<TypeT>(new TypeT(fennec::forward<ArgsT>(args)...));
199}
200
201}
202
203#endif // FENNEC_MEMORY_POINTERS_H
Definition pointers.h:87
constexpr unique_ptr(nullptr_t) noexcept
Nullptr Constructor, creates a unique_ptr that owns nothing.
Definition pointers.h:107
DeleteT delete_t
the deleter
Definition pointers.h:99
constexpr unique_ptr(unique_ptr &&other)
Move Constructor, transfers ownership from other
Definition pointers.h:121
TypeT element_t
the element type
Definition pointers.h:90
const element_t * const_pointer_t
pointer to element type
Definition pointers.h:96
constexpr ~unique_ptr()
Default Constructor, if it owns a resource, it deletes it using delete_t
Definition pointers.h:131
constexpr unique_ptr()
Default Constructor, creates a unique_ptr that owns nothing.
Definition pointers.h:103
element_t * pointer_t
pointer to element type
Definition pointers.h:93
constexpr unique_ptr(pointer_t ptr, const delete_t &del=delete_t())
Pointer Constructor, creates a unique_ptr that owns ptr with deleter del
Definition pointers.h:113
Struct for wrapping C++ delete
Definition pointers.h:33
constexpr void operator()(TypeT *ptr) const noexcept
Function Call Operator, calls delete on ptr
Definition pointers.h:47
constexpr default_delete() noexcept=default
Default constructor.
constexpr default_delete(const default_delete< ConvT > &) noexcept
Conversion Constructor.
Definition pointers.h:42
static constexpr IntT value
value of the constant
Definition constants.h:79
Check if type T0 can be converted T1
Definition type_traits.h:1064
Type Traits
constexpr bool_t is_convertible_v
Shorthand for can_convert<TypeT0, TypeT1>::value
Definition type_traits.h:1070
decltype(nullptr) nullptr_t
Null Pointer Type.
Definition types.h:245
Utility