Face Engine SDK  5.23.1
A face detection, recognition and tracking engine.
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 
9 namespace 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
fsdk::Ref::reset
T * reset() noexcept
Reset reference counted object and assign nullptr to the pointer.
Definition: Ref.h:214
fsdk::acquire_as
Ref< S > acquire_as(T *ptr) noexcept
Acquire ownership of IRefCounted based object with a cast to a given type.
Definition: Ref.h:271
fsdk::Ref::Ref
Ref(const Ref< D > &other)
Initializes object pointer with other and retains a reference.
Definition: Ref.h:62
fsdk::acquire
Ref< T > acquire(T *ptr) noexcept
Acquire ownership of IRefCounted based object.
Definition: Ref.h:259
fsdk::RefBase::set
void set(T *ptr) noexcept
Replace object pointer without any checks or reference management.
Definition: RefBase.h:102
fsdk::Ref::operator=
Ref & operator=(const Ref &other) noexcept
Assign a strong reference.
Definition: Ref.h:136
fsdk
SDK namespace.
Definition: IAGSEstimator.h:8
fsdk::Ref::operator==
bool operator==(const Ref &other) const noexcept
Check if two refs are the same.
Definition: Ref.h:110
fsdk::Ref::make_ref
Ref & make_ref(T *ptr) noexcept
Create ref without acquiring ownership.
Definition: Ref.h:207
fsdk::Ref::acquire
Ref & acquire(T *ptr) noexcept
Acquire ownership of the object.
Definition: Ref.h:193
fsdk::Ref::Ref
Ref() noexcept=default
Constructor. Initializes object pointer to nullptr.
fsdk::Ref::operator=
Ref & operator=(std::nullptr_t) noexcept
Assign a nullptr_t.
Definition: Ref.h:167
fsdk::Ref::~Ref
~Ref() noexcept
Releases reference being held (if any).
Definition: Ref.h:80
fsdk::RefBase::isNull
bool isNull() const noexcept
Check for nullptr.
Definition: RefBase.h:71
fsdk::make_ref_as
Ref< S > make_ref_as(T *ptr) noexcept
Make smart reference to a IRefCounted based object without acquiring ownership.
Definition: Ref.h:248
fsdk::RefBase
Generic base class of a pointer for reference counted objects.
Definition: RefBase.h:16
fsdk::Ref::assign
Ref & assign(T *ptr) noexcept
Assign an object. Presumes shared ownership, increases reference count.
Definition: Ref.h:176
fsdk::Ref::operator=
Ref & operator=(const Ref< D > &other) noexcept
Assign a strong reference.
Definition: Ref.h:146
fsdk::RefBase::m_ptr
T * m_ptr
Raw pointer.
Definition: RefBase.h:107
fsdk::make_ref
Ref< T > make_ref(T *ptr) noexcept
Make smart reference to a IRefCounted based object without acquiring ownership.
Definition: Ref.h:236
fsdk::Ref::operator!=
bool operator!=(const Ref &other) const noexcept
Check if two refs are not the same.
Definition: Ref.h:118
fsdk::Ref
Smart pointer for reference counted objects.
Definition: Ref.h:26
fsdk::Ref::getInitReference
T ** getInitReference() noexcept
Access pointer for initialization.
Definition: Ref.h:97
fsdk::Ref::as
Ref< S > as() const noexcept
Make smart reference with relative type.
Definition: Ref.h:224
fsdk::Ref::Ref
Ref(const Ref &other)
Initializes object pointer with other and retains a reference.
Definition: Ref.h:52
fsdk::RefBase::get
T * get() const noexcept
Get current raw object pointer.
Definition: RefBase.h:94
fsdk::Ref::operator->
T * operator->() const noexcept
Access pointer.
Definition: Ref.h:88