14 #ifndef _DS3D_COMMON_HPP_OBJ_HPP
15 #define _DS3D_COMMON_HPP_OBJ_HPP
21 #define DS3D_REF_COPY_DESTROY_IMPL(clss) \
22 void destroy() final { delete this; } \
23 ~clss() override = default; \
24 abiRefObj* refCopy_i() const final { return new clss(*this); }
31 using UniqPtr = std::unique_ptr<T, std::function<void(T*)>>;
46 typename std::enable_if_t<TpId<std::remove_cv_t<T>>::__typeid() >= 0,
bool>;
48 template <
typename T,
typename... Args>
51 template <
typename T,
typename... Args>
53 typename std::enable_if<std::is_constructible<T, Args...>::value,
bool>::type;
55 template <
class From,
class To>
57 std::is_convertible<From, To>::value ||
58 std::is_constructible<std::remove_reference<To>, std::remove_reference<From>>::value,
60 template <
class Base,
class Derived>
61 using _EnableIfBaseOf = std::enable_if_t<std::is_base_of<Base, Derived>::value,
bool>;
63 template <
class From,
class To>
65 std::is_convertible<From*, To*>::value ||
66 std::is_constructible<std::remove_reference<To*>, std::remove_reference<From*>>::value ||
67 std::is_base_of<From, To>::value,
70 template <
class From,
class To,
class convertType>
73 template <
class From,
class To, _Convertible<From*, To*> = true>
77 return static_cast<To*
>(a);
80 template <
class From,
class To, _EnableIfBaseOf<From, To> = true>
84 return dynamic_cast<To*
>(a);
87 template <class From, class To, std::enable_if_t<std::is_void<From>::value,
bool> =
true>
91 return static_cast<To*
>(a);
94 template <
class From,
class To>
122 To*
data() const final {
return pointerCast<From, To>(_from->
data()); }
126 newptr->_from = _from->
refCopy();
138 template <
class Ty, _PtrConvertible<Ty, Tp> = true>
142 Tp* d = pointerCast<Ty, Tp>(v.get());
147 SharedRefObj(Tp* v, std::function<
void(Tp*)> f) : _ptr(v, (f ? std::move(f) : [](Tp*) {})) {}
149 Tp*
data() const final {
return _ptr.get(); }
162 template <
class From,
class To = From>
169 template <
class From,
class To = From>
191 template <
typename... Args>
194 using cbType = std::function<void(Args...)>;
212 template <
typename ref, _EnableIfBaseOf<abiRefObj, ref> = true>
214 ref* _abiRef =
nullptr;
221 DS_ASSERT((std::is_base_of<abiRefObj, ref>::value));
222 _abiRef =
static_cast<ref*
>(abiref.refCopy_i());
227 DS_ASSERT(std::is_base_of<abiRefObj, ref>::value);
231 _abiRef = abiref->refCopy();
243 _abiRef = o._abiRef ?
static_cast<ref*
>(o._abiRef->refCopy_i()) :
nullptr;
249 _abiRef = o._abiRef ?
static_cast<ref*
>(o._abiRef->refCopy_i()) :
nullptr;
284 template <
typename abiCB>
296 template <
typename... Args,
typename F>
299 auto obj = std::make_unique<
CBObjT<Args...>>(std::move(f));
300 if (obj && obj->isValid()) {
301 this->reset(obj.release());
310 operator bool() {
return this->abiRef(); }
312 template <
typename... Args>
316 this->abiRef()->notify(std::forward<Args>(args)...);
342 template <
class Ty, _PtrConvertible<Ty, Tp> = true>
349 template <
class Ty, _PtrConvertible<Ty, Tp> = true>
355 template<
class GuardTy>
357 return GuardTy(this->abiRef(),
false);
364 return this->abiRef()->data();
370 operator bool()
const {
return ptr(); }
374 if (this->abiRef()) {
383 #endif // _DS3D_COMMON_HPP_OBJ_HPP