14 #ifndef _DS3D_COMMON_HPP_OBJ_HPP
15 #define _DS3D_COMMON_HPP_OBJ_HPP
17 #include <ds3d/common/abi_obj.h>
18 #include <ds3d/common/common.h>
19 #include <ds3d/common/func_utils.h>
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); }
29 using ShrdPtr = std::shared_ptr<T>;
31 using UniqPtr = std::unique_ptr<T, std::function<void(T*)>>;
33 using Ptr = ShrdPtr<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>
95 class abiRefCast :
public abiRefT<To> {
96 abiRefT<From>* _from =
nullptr;
97 abiRefCast() =
default;
122 To*
data() const final {
return pointerCast<From, To>(_from->data()); }
126 newptr->_from = _from->refCopy();
133 class SharedRefObj :
public abiRefT<Tp> {
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(); }
157 return new SharedRefObj<Tp>(rawAbiObj, &DeleteTFunc<Tp>);
162 template <
class From,
class To = From>
163 inline SharedRefObj<To>*
166 return new SharedRefObj<To>(std::move(p));
169 template <
class From,
class To = From>
175 abiRefT<From>* copy = p.refCopy();
177 return ShrdPtr<To>(pointerCast<From, To>(p.data()), [copy](To*) {
191 template <
typename... Args>
192 class CBObjT :
public abiCallBackT<Args...> {
194 using cbType = std::function<void(Args...)>;
212 template <
typename ref, _EnableIfBaseOf<abiRefObj, ref> = true>
214 ref* _abiRef =
nullptr;
217 GuardRef() =
default;
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>
285 class GuardCB :
public GuardRef<abiCB> {
286 using _GuardCBBase = GuardRef<abiCB>;
296 template <
typename... Args,
typename 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)...);
331 class GuardDataT :
public GuardRef<abiRefT<Tp>> {
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