NVIDIA DeepStream SDK API Reference

9.1 Release
sources/includes/ds3d/common/hpp/obj.hpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2021-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef _DS3D_COMMON_HPP_OBJ_HPP
19 #define _DS3D_COMMON_HPP_OBJ_HPP
20 
21 #include <ds3d/common/abi_obj.h>
22 #include <ds3d/common/common.h>
23 #include <ds3d/common/func_utils.h>
24 
25 #define DS3D_REF_COPY_DESTROY_IMPL(clss) \
26  void destroy() final { delete this; } \
27  ~clss() override = default; \
28  abiRefObj* refCopy_i() const final { return new clss(*this); }
29 
30 namespace ds3d {
31 
32 template <class T>
33 using ShrdPtr = std::shared_ptr<T>;
34 template <class T>
35 using UniqPtr = std::unique_ptr<T, std::function<void(T*)>>;
36 template <class T>
37 using Ptr = ShrdPtr<T>;
38 
39 template <class T>
40 void
42 {
43  if (t) {
44  delete t;
45  }
46 }
47 
48 template <typename T>
50  typename std::enable_if_t<TpId<std::remove_cv_t<T>>::__typeid() >= 0, bool>;
51 
52 template <typename T, typename... Args>
53 using _IsConstructible = typename std::is_constructible<T, Args...>::value;
54 
55 template <typename T, typename... Args>
57  typename std::enable_if<std::is_constructible<T, Args...>::value, bool>::type;
58 
59 template <class From, class To>
60 using _Convertible = std::enable_if_t<
61  std::is_convertible<From, To>::value ||
62  std::is_constructible<std::remove_reference<To>, std::remove_reference<From>>::value,
63  bool>;
64 template <class Base, class Derived>
65 using _EnableIfBaseOf = std::enable_if_t<std::is_base_of<Base, Derived>::value, bool>;
66 
67 template <class From, class To>
68 using _PtrConvertible = std::enable_if_t<
69  std::is_convertible<From*, To*>::value ||
70  std::is_constructible<std::remove_reference<To*>, std::remove_reference<From*>>::value ||
71  std::is_base_of<From, To>::value,
72  bool>;
73 
74 template <class From, class To, class convertType>
75 To* pointerCast(From* a);
76 
77 template <class From, class To, _Convertible<From*, To*> = true>
78 To*
79 pointerCast(From* a)
80 {
81  return static_cast<To*>(a);
82 }
83 
84 template <class From, class To, _EnableIfBaseOf<From, To> = true>
85 To*
86 pointerCast(From* a)
87 {
88  return dynamic_cast<To*>(a);
89 }
90 
91 template <class From, class To, std::enable_if_t<std::is_void<From>::value, bool> = true>
92 To*
93 pointerCast(From* a)
94 {
95  return static_cast<To*>(a);
96 }
97 
98 template <class From, class To>
99 class abiRefCast : public abiRefT<To> {
100  abiRefT<From>* _from = nullptr;
101  abiRefCast() = default;
102 
103 public:
104  abiRefCast(const abiRefT<From>& from) { _from = from.refCopy(); }
105  abiRefCast(abiRefT<From>* from, bool takeOwner)
106  {
107  if (takeOwner) {
108  _from = from;
109  } else {
110  _from = from->refCopy();
111  }
112  }
113  void reset()
114  {
115  if (_from) {
116  _from->destroy();
117  _from = nullptr;
118  }
119  }
121  void destroy() final
122  {
123  reset();
124  delete this;
125  }
126  To* data() const final { return pointerCast<From, To>(_from->data()); }
127  abiRefObj* refCopy_i() const final
128  {
129  auto newptr = new abiRefCast();
130  newptr->_from = _from->refCopy();
131  return newptr;
132  }
134 };
135 
136 template <class Tp>
137 class SharedRefObj : public abiRefT<Tp> {
138  ShrdPtr<Tp> _ptr;
139 
140 public:
141  SharedRefObj(ShrdPtr<Tp>&& v) : _ptr(std::move(v)) { DS_ASSERT(_ptr); }
142  template <class Ty, _PtrConvertible<Ty, Tp> = true>
144  {
145  DS_ASSERT(v);
146  Tp* d = pointerCast<Ty, Tp>(v.get());
147  _ptr = ShrdPtr<Tp>(std::move(v), d);
148  }
149  // template <class DelF>
150  // SharedRefObj(Tp* v, DelF f) : _ptr(v, std::move(f))
151  SharedRefObj(Tp* v, std::function<void(Tp*)> f) : _ptr(v, (f ? std::move(f) : [](Tp*) {})) {}
152 
153  Tp* data() const final { return _ptr.get(); }
155 };
156 
157 template <class Tp>
158 abiRefT<Tp>*
159 NewAbiRef(Tp* rawAbiObj)
160 {
161  return new SharedRefObj<Tp>(rawAbiObj, &DeleteTFunc<Tp>);
162 }
163 
165 
166 template <class From, class To = From>
167 inline SharedRefObj<To>*
169 {
170  return new SharedRefObj<To>(std::move(p));
171 }
172 
173 template <class From, class To = From>
174 inline ShrdPtr<To>
176 {
177  if (!p.data())
178  return nullptr;
179  abiRefT<From>* copy = p.refCopy();
180  DS_ASSERT(copy);
181  return ShrdPtr<To>(pointerCast<From, To>(p.data()), [copy](To*) {
182  if (copy) {
183  copy->destroy();
184  }
185  });
186 }
187 
188 /* Examples:
189  * auto f = [](ErrCode c, const char* msg){
190  * printf("error: %s detected, msg: %s", ErrCodeStr(c), msg);
191  * }
192  * // decltype(f) should be same as CBObjT<ErrCode, const char*>::cbType
193  * CBObjT<ErrCode, const char*> cbObj(std::move(f));
194  */
195 template <typename... Args>
196 class CBObjT : public abiCallBackT<Args...> {
197 public:
198  using cbType = std::function<void(Args...)>;
199  bool isValid() const { return bool(_f); }
200  CBObjT(cbType&& f) { _f = std::move(f); }
201  void notify(Args... args) final
202  {
203  if (_f)
204  _f(args...);
205  }
207 private:
208  cbType _f;
209 };
210 
216 template <typename ref, _EnableIfBaseOf<abiRefObj, ref> = true>
217 class GuardRef {
218  ref* _abiRef = nullptr;
219 
220 public:
221  GuardRef() = default;
222  // make a safe copy on data reference abiref
223  GuardRef(const ref& abiref)
224  {
225  DS_ASSERT((std::is_base_of<abiRefObj, ref>::value));
226  _abiRef = static_cast<ref*>(abiref.refCopy_i());
227  }
228  // take owership of the data reference abiref pointer
229  GuardRef(ref* abiref, bool takeowner)
230  {
231  DS_ASSERT(std::is_base_of<abiRefObj, ref>::value);
232  if (takeowner) {
233  _abiRef = abiref;
234  } else {
235  _abiRef = abiref->refCopy();
236  }
237  }
238  // move constructor
240  {
241  _abiRef = o._abiRef;
242  o._abiRef = nullptr;
243  }
244  // copy from another GuardRef
245  GuardRef(const GuardRef& o)
246  {
247  _abiRef = o._abiRef ? static_cast<ref*>(o._abiRef->refCopy_i()) : nullptr;
248  //DS_ASSERT(_abiRef);
249  }
250  // copy from another GuardRef
252  {
253  _abiRef = o._abiRef ? static_cast<ref*>(o._abiRef->refCopy_i()) : nullptr;
254  return *this;
255  }
256  // release this abiRef. user need to take owership of the released abiRef and destroy after use.
257  ref* release()
258  {
259  ref* res = _abiRef;
260  _abiRef = nullptr;
261  return res;
262  }
263  // reset and destroy the abiRef
264  void reset(ref* abiref = nullptr)
265  {
266  if (_abiRef) {
267  _abiRef->destroy();
268  }
269  _abiRef = abiref;
270  }
271  // destructor
272  virtual ~GuardRef() { reset(nullptr); }
273  ref* abiRef() const { return _abiRef; }
274 };
275 
276 /*
277  * examples to get GuardCB from abiCallBackT:
278  * using abiErrorCB = abiCallBackT<ErrCode, const char*>;
279  * const abiErrorCB& cb = ...;
280  * GuardCB<abiErrorCB> guardCB(cb);
281  * guardCB(ErrCode::kGood, "sample");
282  * examples to get GuardCB from std::function
283  * auto errFn = [](ErrCode, const char*) {...};
284  * GuardCB<abiErrorCB> guardCB(errFn);
285  * guardCB(ErrCode::kGood, "sample");
286  */
287 
288 template <typename abiCB>
289 class GuardCB : public GuardRef<abiCB> {
291 
292 public:
293  GuardCB() = default;
294  GuardCB(const abiCB& cb) : _GuardCBBase(cb) {}
295  GuardCB(abiCB* cb, bool takeowner = true) : _GuardCBBase(cb, takeowner) {}
296  GuardCB(nullptr_t) {}
297  GuardCB(const GuardCB& o) : _GuardCBBase(o) {}
298  ~GuardCB() override = default;
299 
300  template <typename... Args, typename F>
301  void setFn(F f)
302  {
303  auto obj = std::make_unique<CBObjT<Args...>>(std::move(f));
304  if (obj && obj->isValid()) {
305  this->reset(obj.release());
306  } else {
307  this->reset();
308  }
309  }
310 
311  // disable operator ->, redirect it to callback abi object.
312  // abiCB* operator->() const { return this->abiRef(); }
313  // check whether it is intialized
314  operator bool() { return this->abiRef(); }
315 
316  template <typename... Args>
317  void operator()(Args&&... args) const
318  {
319  DS_ASSERT(this->abiRef());
320  this->abiRef()->notify(std::forward<Args>(args)...);
321  }
322 };
323 
324 /*
325  * examples:
326  * const abiRefT<abiDataMap>& a_data_map_ref = ...;
327  * GuardDataT<abiDataMap> guard(a_data_map_ref);
328  * guard->bytes(); // -> point to abiDataMap interface.
329  * guard.abiRef() // get abiDataMap ref. abiRefT<abiDataMap>
330  * GuardDataT<abiDataMap> another_guard = guard; // copy into another guard.
331  * Ptr<abiDataMap> data_ptr = guard; // get a abiDataMap safe pointer, which could be copied into
332  * everywhere
333  */
334 template <class Tp>
335 class GuardDataT : public GuardRef<abiRefT<Tp>> {
336 public:
338  GuardDataT() = default;
339  GuardDataT(nullptr_t) {}
340  GuardDataT(const abiRefT<Tp>& rf) : GuardRef<abiRefT<Tp>>(rf) {}
341  GuardDataT(abiRefT<Tp>* refPtr, bool takeOwner) : GuardRef<abiRefT<Tp>>(refPtr, takeOwner) {}
342  GuardDataT(const GuardDataT& o): GuardRef<abiRefT<Tp>>(o) {}
343  ~GuardDataT() override = default;
344 
345  // convert from a derived reference
346  template <class Ty, _PtrConvertible<Ty, Tp> = true>
347  GuardDataT(const abiRefT<Ty>& derived)
348  {
349  this->reset(new abiRefCast<Ty, Tp>(derived));
350  }
351 
352  // convert from a derived ref pointer
353  template <class Ty, _PtrConvertible<Ty, Tp> = true>
354  GuardDataT(abiRefT<Ty>* abiref, bool takeOwner)
355  {
356  this->reset(new abiRefCast<Ty, Tp>(abiref, takeOwner));
357  }
358 
359  template<class GuardTy>
360  GuardTy cast() {
361  return GuardTy(this->abiRef(), false);
362  }
363 
364  // return pointer of the actual data.
365  Tp* ptr() const
366  {
367  if (this->abiRef())
368  return this->abiRef()->data();
369  return nullptr;
370  }
371  // override operator ->, redirect it to abiData object.
372  Tp* operator->() const { return ptr(); }
373  // check whether it is intialized
374  operator bool() const { return ptr(); }
375  // convert it into shared_ptr<Tp> for externer safe use
376  operator ShrdPtr<Tp>()
377  {
378  if (this->abiRef()) {
379  return AbiRefToPtr(*(this->abiRef()));
380  }
381  return nullptr;
382  }
383 };
384 
385 } // namespace ds3d
386 
387 #endif // _DS3D_COMMON_HPP_OBJ_HPP
ds3d::SharedRefObj::SharedRefObj
SharedRefObj(Tp *v, std::function< void(Tp *)> f)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:151
ds3d::AbiRefToPtr
ShrdPtr< To > AbiRefToPtr(const abiRefT< From > &p)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:175
ds3d::UniqPtr
std::unique_ptr< T, std::function< void(T *)> > UniqPtr
Definition: sources/includes/ds3d/common/hpp/obj.hpp:35
ds3d::PtrToAbiRef
SharedRefObj< To > * PtrToAbiRef(ShrdPtr< From > &&p)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:168
ds3d::abiRefCast::destroy
void destroy() final
Definition: sources/includes/ds3d/common/hpp/obj.hpp:121
prometheus::detail::make_unique
std::unique_ptr< T > make_unique(Args &&... args)
Definition: sources/includes/prometheus/detail/future_std.h:11
ds3d::CBObjT::isValid
bool isValid() const
Definition: sources/includes/ds3d/common/hpp/obj.hpp:199
ds3d::GuardCB::GuardCB
GuardCB(abiCB *cb, bool takeowner=true)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:295
ds3d::abiRefT::refCopy
abiRefT * refCopy() const
Definition: sources/includes/ds3d/common/abi_obj.h:45
ds3d::GuardRef::~GuardRef
virtual ~GuardRef()
Definition: sources/includes/ds3d/common/hpp/obj.hpp:272
ds3d::abiRefCast
Definition: sources/includes/ds3d/common/hpp/obj.hpp:99
ds3d::_Convertible
std::enable_if_t< std::is_convertible< From, To >::value||std::is_constructible< std::remove_reference< To >, std::remove_reference< From > >::value, bool > _Convertible
Definition: sources/includes/ds3d/common/hpp/obj.hpp:63
ds3d::GuardRef::abiRef
ref * abiRef() const
Definition: sources/includes/ds3d/common/hpp/obj.hpp:273
ds3d::CBObjT::CBObjT
CBObjT(cbType &&f)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:200
ds3d::GuardDataT::GuardDataT
GuardDataT(const abiRefT< Tp > &rf)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:340
ds3d::_PtrConvertible
std::enable_if_t< std::is_convertible< From *, To * >::value||std::is_constructible< std::remove_reference< To * >, std::remove_reference< From * > >::value||std::is_base_of< From, To >::value, bool > _PtrConvertible
Definition: sources/includes/ds3d/common/hpp/obj.hpp:72
ds3d::SharedRefObj::data
Tp * data() const final
Definition: sources/includes/ds3d/common/hpp/obj.hpp:153
ds3d::GuardCB::operator()
void operator()(Args &&... args) const
Definition: sources/includes/ds3d/common/hpp/obj.hpp:317
ds3d::abiRefCast::abiRefCast
abiRefCast(abiRefT< From > *from, bool takeOwner)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:105
ds3d::abiRefCast::~abiRefCast
~abiRefCast()
Definition: sources/includes/ds3d/common/hpp/obj.hpp:120
ds3d::abiRefT
Definition: sources/includes/ds3d/common/abi_obj.h:43
DS_ASSERT
#define DS_ASSERT(...)
Definition: sources/includes/ds3d/common/defines.h:36
ds3d::GuardRef
Guard to wrapper all abiRefObj& data.
Definition: sources/includes/ds3d/common/hpp/obj.hpp:217
DS3D_REF_COPY_DESTROY_IMPL
#define DS3D_REF_COPY_DESTROY_IMPL(clss)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:25
ds3d::GuardDataT
Definition: sources/includes/ds3d/common/hpp/obj.hpp:335
ds3d::abiRefCast::reset
void reset()
Definition: sources/includes/ds3d/common/hpp/obj.hpp:113
ds3d::abiRefObj::destroy
virtual void destroy()=0
ds3d::GuardCB::setFn
void setFn(F f)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:301
ds3d::pointerCast
To * pointerCast(From *a)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:79
ds3d::GuardCB::GuardCB
GuardCB(const abiCB &cb)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:294
ds3d::DeleteTFunc
void DeleteTFunc(T *t)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:41
ds3d::SharedRefObj::SharedRefObj
SharedRefObj(ShrdPtr< Tp > &&v)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:141
ds3d::CBObjT
Definition: sources/includes/ds3d/common/hpp/obj.hpp:196
ds3d::CBObjT::cbType
std::function< void(Args...)> cbType
Definition: sources/includes/ds3d/common/hpp/obj.hpp:198
ds3d::GuardRef::GuardRef
GuardRef(GuardRef &&o)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:239
ds3d::GuardRef::operator=
GuardRef & operator=(const GuardRef &o)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:251
ds3d::GuardRef::reset
void reset(ref *abiref=nullptr)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:264
ds3d::abiRefCast::DS3D_DISABLE_CLASS_COPY
DS3D_DISABLE_CLASS_COPY(abiRefCast)
ds3d::GuardRef::GuardRef
GuardRef(const GuardRef &o)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:245
ds3d::GuardDataT::cast
GuardTy cast()
Definition: sources/includes/ds3d/common/hpp/obj.hpp:360
ds3d::GuardDataT::GuardDataT
GuardDataT(abiRefT< Tp > *refPtr, bool takeOwner)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:341
ds3d::NewAbiRef
abiRefT< Tp > * NewAbiRef(Tp *rawAbiObj)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:159
ds3d::GuardDataT::operator->
Tp * operator->() const
Definition: sources/includes/ds3d/common/hpp/obj.hpp:372
ds3d::abiRefCast::refCopy_i
abiRefObj * refCopy_i() const final
Definition: sources/includes/ds3d/common/hpp/obj.hpp:127
ds3d::GuardDataT::ptr
Tp * ptr() const
Definition: sources/includes/ds3d/common/hpp/obj.hpp:365
ds3d::_EnableIfValidIdType
typename std::enable_if_t< TpId< std::remove_cv_t< T > >::__typeid() >=0, bool > _EnableIfValidIdType
Definition: sources/includes/ds3d/common/hpp/obj.hpp:50
ds3d::GuardDataT::GuardDataT
GuardDataT(const GuardDataT &o)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:342
ds3d::ShrdPtr
std::shared_ptr< T > ShrdPtr
Definition: sources/includes/ds3d/common/hpp/obj.hpp:33
ds3d::SharedRefObj::SharedRefObj
SharedRefObj(ShrdPtr< Ty > &&v)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:143
ds3d::abiRefObj
Definition: sources/includes/ds3d/common/abi_obj.h:27
ds3d::Ptr
ShrdPtr< T > Ptr
Definition: sources/includes/ds3d/common/hpp/obj.hpp:37
ds3d::GuardRef::release
ref * release()
Definition: sources/includes/ds3d/common/hpp/obj.hpp:257
ds3d::GuardCB::GuardCB
GuardCB(const GuardCB &o)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:297
ds3d::GuardDataT::GuardDataT
GuardDataT(abiRefT< Ty > *abiref, bool takeOwner)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:354
ds3d::CBObjT::notify
void notify(Args... args) final
Definition: sources/includes/ds3d/common/hpp/obj.hpp:201
ds3d::GuardRef::GuardRef
GuardRef(const ref &abiref)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:223
ds3d::GuardCB::GuardCB
GuardCB(nullptr_t)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:296
ds3d::GuardDataT::GuardDataT
GuardDataT(const abiRefT< Ty > &derived)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:347
ds3d::GuardDataT::GuardDataT
GuardDataT(nullptr_t)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:339
ds3d::abiRefCast::data
To * data() const final
Definition: sources/includes/ds3d/common/hpp/obj.hpp:126
ds3d::abiRefT::data
virtual T * data() const =0
ds3d::_IsConstructible
typename std::is_constructible< T, Args... >::value _IsConstructible
Definition: sources/includes/ds3d/common/hpp/obj.hpp:53
ds3d::SharedRefObj
Definition: sources/includes/ds3d/common/hpp/obj.hpp:137
ds3d::_EnableIfConstructible
typename std::enable_if< std::is_constructible< T, Args... >::value, bool >::type _EnableIfConstructible
Definition: sources/includes/ds3d/common/hpp/obj.hpp:57
ds3d
Definition: sources/includes/ds3d/common/abi_dataprocess.h:25
ds3d::abiCallBackT
Definition: sources/includes/ds3d/common/abi_obj.h:75
ds3d::abiRefCast::abiRefCast
abiRefCast(const abiRefT< From > &from)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:104
ds3d::GuardRef::GuardRef
GuardRef(ref *abiref, bool takeowner)
Definition: sources/includes/ds3d/common/hpp/obj.hpp:229
ds3d::_EnableIfBaseOf
std::enable_if_t< std::is_base_of< Base, Derived >::value, bool > _EnableIfBaseOf
Definition: sources/includes/ds3d/common/hpp/obj.hpp:65
ds3d::GuardCB
Definition: sources/includes/ds3d/common/hpp/obj.hpp:289