FastLED 3.10.8
Loading...
Searching...
No Matches
unique_ptr.h
Go to the documentation of this file.
1#pragma once
2
5#include "fl/stl/utility.h" // for fl::move, fl::forward, fl::swap // IWYU pragma: keep
6#include "fl/stl/stdint.h" // for fl::size_t // IWYU pragma: keep
7#include "fl/stl/cstddef.h" // for fl::nullptr_t
8#include "fl/stl/noexcept.h"
10
11namespace fl {
12
13template<typename T>
15 void operator()(T* ptr) const FL_NO_EXCEPT {
16 FL_STATIC_ASSERT(sizeof(T) > 0,
17 "Cannot delete pointer to incomplete type. "
18 "Ensure the type is fully defined where unique_ptr destructor is instantiated.");
19 delete ptr;
20 }
21
22 // Allow conversion from derived to base type deleters
23 template<typename U>
25
27};
28
29template<typename T>
30struct default_delete<T[]> {
31 void operator()(T* ptr) const FL_NO_EXCEPT {
32 delete[] ptr;
33 }
34};
35
36template<typename T, typename Deleter = default_delete<T>>
38public:
39 using element_type = T;
40 using deleter_type = Deleter;
41 using pointer = T*;
42
43private:
45 Deleter mDeleter;
46
47public:
48 // Constructors
49 constexpr unique_ptr() FL_NO_EXCEPT : mPtr(nullptr), mDeleter() {}
52 unique_ptr(pointer p, const Deleter& d) FL_NO_EXCEPT : mPtr(p), mDeleter(d) {}
53 unique_ptr(pointer p, Deleter&& d) FL_NO_EXCEPT : mPtr(p), mDeleter(fl::move(d)) {}
54
55 // Move constructor
56 unique_ptr(unique_ptr&& u) FL_NO_EXCEPT : mPtr(u.release()), mDeleter(fl::move(u.mDeleter)) {}
57
58 // Converting move constructor
59 template<typename U, typename E>
61 : mPtr(u.release()), mDeleter(fl::move(u.get_deleter())) {}
62
63 // Copy semantics deleted
66
67 // Move assignment
69 if (this != &u) {
70 reset(u.release());
71 mDeleter = fl::move(u.mDeleter);
72 }
73 return *this;
74 }
75
76 // Converting move assignment
77 template<typename U, typename E>
79 reset(u.release());
80 mDeleter = fl::move(u.get_deleter());
81 return *this;
82 }
83
84 // nullptr assignment
86 reset();
87 return *this;
88 }
89
90 // Destructor
92 if (mPtr) {
94 }
95 }
96
97 // Observers
98 pointer get() const FL_NO_EXCEPT { return mPtr; }
99 Deleter& get_deleter() FL_NO_EXCEPT { return mDeleter; }
100 const Deleter& get_deleter() const FL_NO_EXCEPT { return mDeleter; }
101 explicit operator bool() const FL_NO_EXCEPT { return mPtr != nullptr; }
102
103 // Access
104 T& operator*() const FL_NO_EXCEPT { return *mPtr; }
106
107 // Modifiers
109 pointer tmp = mPtr;
110 mPtr = nullptr;
111 return tmp;
112 }
113
114 void reset(pointer p = nullptr) FL_NO_EXCEPT {
115 pointer old_ptr = mPtr;
116 mPtr = p;
117 if (old_ptr) {
118 mDeleter(old_ptr);
119 }
120 }
121
123 using fl::swap;
124 swap(mPtr, u.mPtr);
125 swap(mDeleter, u.mDeleter);
126 }
127};
128
129// Array specialization for scoped_array consolidation
130template<typename T, typename Deleter>
131class unique_ptr<T[], Deleter> {
132public:
133 using element_type = T;
134 using deleter_type = Deleter;
135 using pointer = T*;
136
137private:
139 Deleter mDeleter;
140
141public:
142 // Constructors
143 constexpr unique_ptr() FL_NO_EXCEPT : mPtr(nullptr), mDeleter() {}
146 unique_ptr(pointer p, const Deleter& d) FL_NO_EXCEPT : mPtr(p), mDeleter(d) {}
148
149 // Move constructor
150 unique_ptr(unique_ptr&& u) FL_NO_EXCEPT : mPtr(u.release()), mDeleter(fl::move(u.mDeleter)) {}
151
152 // Converting move constructor
153 template<typename U, typename E>
155 : mPtr(u.release()), mDeleter(fl::move(u.get_deleter())) {}
156
157 // Copy semantics deleted
160
161 // Move assignment
163 if (this != &u) {
164 reset(u.release());
165 mDeleter = fl::move(u.mDeleter);
166 }
167 return *this;
168 }
169
170 // Converting move assignment
171 template<typename U, typename E>
173 reset(u.release());
174 mDeleter = fl::move(u.get_deleter());
175 return *this;
176 }
177
178 // nullptr assignment
180 reset();
181 return *this;
182 }
183
184 // Destructor
186 if (mPtr) {
187 mDeleter(mPtr);
188 }
189 }
190
191 // Observers
192 pointer get() const FL_NO_EXCEPT { return mPtr; }
193 Deleter& get_deleter() FL_NO_EXCEPT { return mDeleter; }
194 const Deleter& get_deleter() const FL_NO_EXCEPT { return mDeleter; }
195 explicit operator bool() const FL_NO_EXCEPT { return mPtr != nullptr; }
196
197 // Array access (replaces scoped_array functionality)
198 T& operator[](fl::size_t i) const FL_NO_EXCEPT { return mPtr[i]; }
199
200 // Modifiers
202 pointer tmp = mPtr;
203 mPtr = nullptr;
204 return tmp;
205 }
206
207 void reset(pointer p = nullptr) FL_NO_EXCEPT {
208 pointer old_ptr = mPtr;
209 mPtr = p;
210 if (old_ptr) {
211 mDeleter(old_ptr);
212 }
213 }
214
216 using fl::swap;
217 swap(mPtr, u.mPtr);
218 swap(mDeleter, u.mDeleter);
219 }
220};
221
222// Non-member functions using FL equivalents
223template<typename T, typename Deleter>
225 lhs.swap(rhs);
226}
227
228// Comparison operators using FL equivalents
229template<typename T1, typename Deleter1, typename T2, typename Deleter2>
231 return lhs.get() == rhs.get();
232}
233
234template<typename T1, typename Deleter1, typename T2, typename Deleter2>
236 return !(lhs == rhs);
237}
238
239template<typename T, typename Deleter>
241 return !ptr;
242}
243
244template<typename T, typename Deleter>
246 return !ptr;
247}
248
249template<typename T, typename Deleter>
251 return static_cast<bool>(ptr);
252}
253
254template<typename T, typename Deleter>
256 return static_cast<bool>(ptr);
257}
258
259namespace adl_barrier { // see fl/stl/adl_barrier.h
260// make_unique function for consistency with std::make_unique
261template<typename T, typename... Args>
262typename fl::enable_if<!fl::is_array<T>::value, unique_ptr<T>>::type
264 return unique_ptr<T>(new T(fl::forward<Args>(args)...));
265}
266
267// make_unique for arrays
268template<typename T>
271 typedef typename fl::remove_extent<T>::type U;
272 return unique_ptr<T>(new U[size]());
273}
274} // namespace adl_barrier
275
276} // namespace fl
Keeps fl's generic templates out of argument-dependent lookup (ADL).
pointer get() const FL_NO_EXCEPT
Definition unique_ptr.h:192
unique_ptr & operator=(unique_ptr &&u) FL_NO_EXCEPT
Definition unique_ptr.h:162
unique_ptr(pointer p) FL_NO_EXCEPT
Definition unique_ptr.h:145
void swap(unique_ptr &u) FL_NO_EXCEPT
Definition unique_ptr.h:215
const Deleter & get_deleter() const FL_NO_EXCEPT
Definition unique_ptr.h:194
unique_ptr & operator=(fl::nullptr_t) FL_NO_EXCEPT
Definition unique_ptr.h:179
pointer release() FL_NO_EXCEPT
Definition unique_ptr.h:201
Deleter & get_deleter() FL_NO_EXCEPT
Definition unique_ptr.h:193
unique_ptr & operator=(unique_ptr< U, E > &&u) FL_NO_EXCEPT
Definition unique_ptr.h:172
unique_ptr(unique_ptr &&u) FL_NO_EXCEPT
Definition unique_ptr.h:150
void reset(pointer p=nullptr) FL_NO_EXCEPT
Definition unique_ptr.h:207
unique_ptr(unique_ptr< U, E > &&u) FL_NO_EXCEPT
Definition unique_ptr.h:154
unique_ptr(pointer p, Deleter &&d) FL_NO_EXCEPT
Definition unique_ptr.h:147
unique_ptr(const unique_ptr &) FL_NO_EXCEPT=delete
constexpr unique_ptr(fl::nullptr_t) FL_NO_EXCEPT
Definition unique_ptr.h:144
unique_ptr(pointer p, const Deleter &d) FL_NO_EXCEPT
Definition unique_ptr.h:146
unique_ptr & operator=(const unique_ptr &) FL_NO_EXCEPT=delete
constexpr unique_ptr() FL_NO_EXCEPT
Definition unique_ptr.h:143
T & operator[](fl::size_t i) const FL_NO_EXCEPT
Definition unique_ptr.h:198
unique_ptr & operator=(unique_ptr< U, E > &&u) FL_NO_EXCEPT
Definition unique_ptr.h:78
unique_ptr(const unique_ptr &) FL_NO_EXCEPT=delete
unique_ptr(pointer p, Deleter &&d) FL_NO_EXCEPT
Definition unique_ptr.h:53
unique_ptr(pointer p) FL_NO_EXCEPT
Definition unique_ptr.h:51
constexpr unique_ptr(fl::nullptr_t) FL_NO_EXCEPT
Definition unique_ptr.h:50
constexpr unique_ptr() FL_NO_EXCEPT
Definition unique_ptr.h:49
unique_ptr(unique_ptr &&u) FL_NO_EXCEPT
Definition unique_ptr.h:56
unique_ptr(pointer p, const Deleter &d) FL_NO_EXCEPT
Definition unique_ptr.h:52
const Deleter & get_deleter() const FL_NO_EXCEPT
Definition unique_ptr.h:100
pointer get() const FL_NO_EXCEPT
Definition unique_ptr.h:98
pointer release() FL_NO_EXCEPT
Definition unique_ptr.h:108
void swap(unique_ptr &u) FL_NO_EXCEPT
Definition unique_ptr.h:122
unique_ptr & operator=(const unique_ptr &) FL_NO_EXCEPT=delete
unique_ptr(unique_ptr< U, E > &&u) FL_NO_EXCEPT
Definition unique_ptr.h:60
unique_ptr & operator=(fl::nullptr_t) FL_NO_EXCEPT
Definition unique_ptr.h:85
void reset(pointer p=nullptr) FL_NO_EXCEPT
Definition unique_ptr.h:114
pointer operator->() const FL_NO_EXCEPT
Definition unique_ptr.h:105
Deleter & get_deleter() FL_NO_EXCEPT
Definition unique_ptr.h:99
T & operator*() const FL_NO_EXCEPT
Definition unique_ptr.h:104
~unique_ptr() FL_NO_EXCEPT
Definition unique_ptr.h:91
unique_ptr & operator=(unique_ptr &&u) FL_NO_EXCEPT
Definition unique_ptr.h:68
constexpr remove_reference< T >::type && move(T &&t) FL_NO_EXCEPT
Definition move.h:30
fl::enable_if<!fl::is_array< T >::value, unique_ptr< T > >::type make_unique(Args &&... args) FL_NO_EXCEPT
Definition unique_ptr.h:263
constexpr remove_reference< T >::type && move(T &&t) FL_NO_EXCEPT
Definition s16x16x4.h:30
constexpr T && forward(typename remove_reference< T >::type &t) FL_NO_EXCEPT
Definition s16x16x4.h:236
decltype(nullptr) nullptr_t
Definition s16x16x4.h:13
__SIZE_TYPE__ size_t
Definition s16x16x4.h:16
enable_if_t< is_same< T, U >::value > swap(T &a, U &b) FL_NO_EXCEPT
Definition s16x16x4.h:889
void swap(array< T, N > &lhs, array< T, N > &rhs) FL_NO_EXCEPT
Definition array.h:209
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
FASTLED_FORCE_INLINE bool operator==(const CRGB &lhs, const CRGB &rhs) FL_NO_EXCEPT
Check if two CRGB objects have the same color data.
Definition crgb.h:740
FASTLED_FORCE_INLINE bool operator!=(const CRGB &lhs, const CRGB &rhs) FL_NO_EXCEPT
Check if two CRGB objects do not have the same color data.
Definition crgb.h:746
Base definition for an LED controller.
corkscrew_args args
Definition old.h:149
#define FL_STATIC_ASSERT(...)
Portable compile-time assertion wrapper.
void operator()(T *ptr) const FL_NO_EXCEPT
Definition unique_ptr.h:31
default_delete(const default_delete< U > &) FL_NO_EXCEPT
Definition unique_ptr.h:24
void operator()(T *ptr) const FL_NO_EXCEPT
Definition unique_ptr.h:15
default_delete() FL_NO_EXCEPT=default