Face Engine SDK 5.25.0
A face detection, recognition and tracking engine.
Loading...
Searching...
No Matches
Ref.h
1#pragma once
2
3#include <cassert>
4#include <type_traits>
5
6#include <fsdk/Def.h>
7#include <fsdk/Types/RefBase.h>
8
9namespace fsdk {
10#ifndef DOXYGEN_SHOULD_SKIP_THIS
11
12 /* Forward declarations. */
13 template <typename T>
14 struct WeakRef;
15
16#endif /* DOXYGEN_SHOULD_SKIP_THIS */
17
25 template <typename T>
26 struct Ref : RefBase<T> {
27
31 Ref() noexcept = default;
32
35 Ref(std::nullptr_t) noexcept {
36 }
37
42 FSDK_DEPRECATED("construction from raw pointer is deprecated, use make_ref function instead")
43
44 explicit Ref(T* ptr) noexcept {
45 *this = ptr;
46 }
47
52 Ref(const Ref& other)
53 : RefBase<T>() {
54 *this = other;
55 }
56
61 template <class D, typename = typename std::enable_if<std::is_convertible<D*, T*>::value>::type>
62 explicit Ref(const Ref<D>& other)
63 : RefBase<T>() {
64 *this = other;
65 }
66
67#ifndef DOXYGEN_SHOULD_SKIP_THIS
68
72 Ref(const WeakRef<T>& other) noexcept {
73 *this = other;
74 }
75
76#endif /* DOXYGEN_SHOULD_SKIP_THIS */
77
80 ~Ref() noexcept {
81 reset();
82 }
83
88 T* operator->() const noexcept {
89 assert(!this->isNull());
90 return this->get();
91 }
92
97 T** getInitReference() noexcept {
98 if(this->get())
99 this->get()->release();
100
101 this->set(nullptr);
102
103 return &this->m_ptr;
104 }
105
110 bool operator==(const Ref& other) const noexcept {
111 return this->get() == other.get();
112 }
113
118 bool operator!=(const Ref& other) const noexcept {
119 return !(*this == other);
120 }
121
122#ifndef DOXYGEN_SHOULD_SKIP_THIS
123
128 Ref& operator=(const WeakRef<T>& other) noexcept;
129
130#endif /* DOXYGEN_SHOULD_SKIP_THIS */
131
136 Ref& operator=(const Ref& other) noexcept {
137 assign(other.get());
138 return *this;
139 }
140
145 template <class D, typename = typename std::enable_if<std::is_convertible<D*, T*>::value>::type>
146 Ref& operator=(const Ref<D>& other) noexcept {
147 assign(other.get());
148 return *this;
149 }
150
156 FSDK_DEPRECATED("Assignment from raw pointer is deprecated, use make_ref function instead")
157
158 Ref& operator=(T* ptr) noexcept {
159 assign(ptr);
160 return *this;
161 }
162
167 Ref& operator=(std::nullptr_t) noexcept {
168 reset();
169 return *this;
170 }
171
176 Ref& assign(T* ptr) noexcept {
177 if(this->get() != ptr) {
178 if(this->get())
179 this->get()->release();
180
181 this->set(ptr);
182
183 if(this->get())
184 this->get()->retain();
185 }
186
187 return *this;
188 }
189
193 Ref& acquire(T* ptr) noexcept {
194 if(this->get() != ptr) {
195 if(this->get())
196 this->get()->release();
197
198 this->set(ptr);
199 }
200
201 return *this;
202 }
203
207 Ref& make_ref(T* ptr) noexcept {
208 return assign(ptr);
209 }
210
214 T* reset() noexcept {
215 T* ptr = this->get();
216 assign(nullptr);
217 return ptr;
218 }
219
223 template <typename S>
224 Ref<S> as() const noexcept {
225 Ref<S> ref;
226 ref.make_ref(static_cast<S*>(this->get()));
227 return ref;
228 }
229 };
230
235 template <typename T>
236 inline Ref<T> make_ref(T* ptr) noexcept {
237 Ref<T> ref;
238 ref.make_ref(ptr);
239 return ref;
240 }
241
247 template <typename S, typename T>
248 inline Ref<S> make_ref_as(T* ptr) noexcept {
249 Ref<T> ref;
250 ref.make_ref(ptr);
251 return ref.template as<S>();
252 }
253
258 template <typename T>
259 inline Ref<T> acquire(T* ptr) noexcept {
260 Ref<T> ref;
261 ref.acquire(ptr);
262 return ref;
263 }
264
270 template <typename S, typename T>
271 inline Ref<S> acquire_as(T* ptr) noexcept {
272 Ref<S> ref;
273 ref.acquire(static_cast<S*>(ptr));
274 return ref;
275 }
276} // namespace fsdk
SDK namespace.
Definition IAGSEstimator.h:8
Ref< S > acquire_as(T *ptr) noexcept
Acquire ownership of IRefCounted based object with a cast to a given type.
Definition Ref.h:271
Ref< S > make_ref_as(T *ptr) noexcept
Make smart reference to a IRefCounted based object without acquiring ownership.
Definition Ref.h:248
Ref< T > acquire(T *ptr) noexcept
Acquire ownership of IRefCounted based object.
Definition Ref.h:259
Ref< T > make_ref(T *ptr) noexcept
Make smart reference to a IRefCounted based object without acquiring ownership.
Definition Ref.h:236
Generic base class of a pointer for reference counted objects.
Definition RefBase.h:16
bool isNull() const noexcept
Check for nullptr.
Definition RefBase.h:71
void set(T *ptr) noexcept
Replace object pointer without any checks or reference management.
Definition RefBase.h:102
T * m_ptr
Raw pointer.
Definition RefBase.h:107
T * get() const noexcept
Get current raw object pointer.
Definition RefBase.h:94
Smart pointer for reference counted objects.
Definition Ref.h:26
Ref(const Ref< D > &other)
Initializes object pointer with other and retains a reference.
Definition Ref.h:62
Ref & operator=(std::nullptr_t) noexcept
Assign a nullptr_t.
Definition Ref.h:167
T * reset() noexcept
Reset reference counted object and assign nullptr to the pointer.
Definition Ref.h:214
Ref(const Ref &other)
Initializes object pointer with other and retains a reference.
Definition Ref.h:52
Ref() noexcept=default
Constructor. Initializes object pointer to nullptr.
bool operator==(const Ref &other) const noexcept
Check if two refs are the same.
Definition Ref.h:110
T * operator->() const noexcept
Access pointer.
Definition Ref.h:88
bool operator!=(const Ref &other) const noexcept
Check if two refs are not the same.
Definition Ref.h:118
~Ref() noexcept
Releases reference being held (if any).
Definition Ref.h:80
T ** getInitReference() noexcept
Access pointer for initialization.
Definition Ref.h:97
Ref & operator=(const Ref &other) noexcept
Assign a strong reference.
Definition Ref.h:136
Ref & acquire(T *ptr) noexcept
Acquire ownership of the object.
Definition Ref.h:193
Ref & assign(T *ptr) noexcept
Assign an object. Presumes shared ownership, increases reference count.
Definition Ref.h:176
Ref & operator=(const Ref< D > &other) noexcept
Assign a strong reference.
Definition Ref.h:146
Ref & make_ref(T *ptr) noexcept
Create ref without acquiring ownership.
Definition Ref.h:207
Ref< S > as() const noexcept
Make smart reference with relative type.
Definition Ref.h:224