18 #ifndef _DS3D_COMMON_HPP_OBJ_HPP
19 #define _DS3D_COMMON_HPP_OBJ_HPP
21 #include <ds3d/common/abi_obj.h>
22 #include <ds3d/common/common.h>
23 #include <ds3d/common/func_utils.h>
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); }
33 using ShrdPtr = std::shared_ptr<T>;
35 using UniqPtr = std::unique_ptr<T, std::function<void(T*)>>;
37 using Ptr = ShrdPtr<T>;
50 typename std::enable_if_t<TpId<std::remove_cv_t<T>>::__typeid() >= 0,
bool>;
52 template <
typename T,
typename... Args>
55 template <
typename T,
typename... Args>
57 typename std::enable_if<std::is_constructible<T, Args...>::value,
bool>::type;
59 template <
class From,
class To>
61 std::is_convertible<From, To>::value ||
62 std::is_constructible<std::remove_reference<To>, std::remove_reference<From>>::value,
64 template <
class Base,
class Derived>
65 using _EnableIfBaseOf = std::enable_if_t<std::is_base_of<Base, Derived>::value,
bool>;
67 template <
class From,
class To>
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,
74 template <
class From,
class To,
class convertType>
77 template <
class From,
class To, _Convertible<From*, To*> = true>
81 return static_cast<To*
>(a);
84 template <
class From,
class To, _EnableIfBaseOf<From, To> = true>
88 return dynamic_cast<To*
>(a);
91 template <class From, class To, std::enable_if_t<std::is_void<From>::value,
bool> =
true>
95 return static_cast<To*
>(a);
98 template <
class From,
class To>
99 class abiRefCast :
public abiRefT<To> {
100 abiRefT<From>* _from =
nullptr;
101 abiRefCast() =
default;
126 To*
data() const final {
return pointerCast<From, To>(_from->data()); }
130 newptr->_from = _from->refCopy();
137 class SharedRefObj :
public abiRefT<Tp> {
142 template <
class Ty, _PtrConvertible<Ty, Tp> = true>
146 Tp* d = pointerCast<Ty, Tp>(v.get());
151 SharedRefObj(Tp* v, std::function<
void(Tp*)> f) : _ptr(v, (f ? std::move(f) : [](Tp*) {})) {}
153 Tp*
data() const final {
return _ptr.get(); }
161 return new SharedRefObj<Tp>(rawAbiObj, &DeleteTFunc<Tp>);
166 template <
class From,
class To = From>
167 inline SharedRefObj<To>*
170 return new SharedRefObj<To>(std::move(p));
173 template <
class From,
class To = From>
179 abiRefT<From>* copy = p.refCopy();
181 return ShrdPtr<To>(pointerCast<From, To>(p.data()), [copy](To*) {
195 template <
typename... Args>
196 class CBObjT :
public abiCallBackT<Args...> {
198 using cbType = std::function<void(Args...)>;
216 template <
typename ref, _EnableIfBaseOf<abiRefObj, ref> = true>
218 ref* _abiRef =
nullptr;
221 GuardRef() =
default;
225 DS_ASSERT((std::is_base_of<abiRefObj, ref>::value));
226 _abiRef =
static_cast<ref*
>(abiref.refCopy_i());
231 DS_ASSERT(std::is_base_of<abiRefObj, ref>::value);
235 _abiRef = abiref->refCopy();
247 _abiRef = o._abiRef ?
static_cast<ref*
>(o._abiRef->refCopy_i()) :
nullptr;
253 _abiRef = o._abiRef ?
static_cast<ref*
>(o._abiRef->refCopy_i()) :
nullptr;
288 template <
typename abiCB>
289 class GuardCB :
public GuardRef<abiCB> {
290 using _GuardCBBase = GuardRef<abiCB>;
300 template <
typename... Args,
typename F>
304 if (obj && obj->isValid()) {
305 this->reset(obj.release());
314 operator bool() {
return this->abiRef(); }
316 template <
typename... Args>
320 this->abiRef()->notify(std::forward<Args>(args)...);
335 class GuardDataT :
public GuardRef<abiRefT<Tp>> {
346 template <
class Ty, _PtrConvertible<Ty, Tp> = true>
353 template <
class Ty, _PtrConvertible<Ty, Tp> = true>
359 template<
class GuardTy>
361 return GuardTy(this->abiRef(),
false);
368 return this->abiRef()->data();
374 operator bool()
const {
return ptr(); }
378 if (this->abiRef()) {
387 #endif // _DS3D_COMMON_HPP_OBJ_HPP