class RefCountAware : public Polymorphic {
public:
- template <class T>
- static SharedRef<T> asShared(T *obj);
- template <class T>
- static WeakRef<T> asWeak(T *obj);
-
- template <class T>
- static SharedRef<T> asShared(T &obj);
- template <class T>
- static WeakRef<T> asWeak(T &obj);
-
bool isShared() const;
template <class T>
- SharedRef<T> asShared();
- template <class T>
- WeakRef<T> asWeak();
+ SharedRef<T> asSharedThis(T *thisAlias) const;
template <class T>
- SharedRef<const T> asShared() const;
- template <class T>
- WeakRef<const T> asWeak() const;
-
- RefCountAwareSRef asShared();
- RefCountAwareWRef asWeak();
-
- RefCountAwareSCRef asShared() const;
- RefCountAwareWCRef asWeak() const;
+ WeakRef<T> asWeakThis(T *thisAlias) const;
protected:
RefCountAware(RefCountObjBase *rc);
// Non-member functions //
template <class T>
- SharedRef<T> asShared(T *obj);
+ SharedRef<T> asShared(T &obj);
template <class T>
- WeakRef<T> asWeak(T *obj);
+ SharedRef<T> asShared(T *obj);
- template <class T>
- SharedRef<T> asShared(T &obj);
template <class T>
WeakRef<T> asWeak(T &obj);
+ template <class T>
+ WeakRef<T> asWeak(T *obj);
+
+ template <class T, class U, class = typename
+ std::enable_if<!std::is_same<T, U>::value>::type>
+ SharedRef<T> asShared(U &obj);
+ template <class T, class U, class = typename
+ std::enable_if<!std::is_same<T, U>::value>::type>
+ SharedRef<T> asShared(U *obj);
+
+ template <class T, class U, class = typename
+ std::enable_if<!std::is_same<T, U>::value>::type>
+ WeakRef<T> asWeak(U &obj);
+ template <class T, class U, class = typename
+ std::enable_if<!std::is_same<T, U>::value>::type>
+ WeakRef<T> asWeak(U *obj);
+
+ template <class T, class U, class = typename
+ std::enable_if<!std::is_same<T, const U>::value>::type>
+ SharedRef<const T> asShared(const U &obj);
+ template <class T, class U, class = typename
+ std::enable_if<!std::is_same<T, const U>::value>::type>
+ SharedRef<const T> asShared(const U *obj);
+
+ template <class T, class U, class = typename
+ std::enable_if<!std::is_same<T, const U>::value>::type>
+ WeakRef<const T> asWeak(const U &obj);
+ template <class T, class U, class = typename
+ std::enable_if<!std::is_same<T, const U>::value>::type>
+ WeakRef<const T> asWeak(const U *obj);
}
#include "RefCountAware.hpp"
{
}
- template <class T>
- inline SharedRef<T> RefCountAware::asShared(T *obj)
- {
- return (obj ? asShared(*obj) : SharedRef<T>());
- }
-
- template <class T>
- inline WeakRef<T> RefCountAware::asWeak(T *obj)
- {
- return (obj ? asWeak(*obj) : WeakRef<T>());
- }
-
- template <class T>
- inline SharedRef<T> RefCountAware::asShared(T &obj)
- {
- return obj.template asShared<typename std::remove_cv<T>::type>();
- }
-
- template <class T>
- inline WeakRef<T> RefCountAware::asWeak(T &obj)
- {
- return obj.template asWeak<typename std::remove_cv<T>::type>();
- }
-
inline bool RefCountAware::isShared() const
{
return !!m_rc;
}
template <class T>
- inline SharedRef<T> RefCountAware::asShared()
+ inline SharedRef<T> RefCountAware::asSharedThis(T *const thisAlias) const
{
if (!isShared()) {
UCL_ELOG("NOT SHARED: %s", typeid(*this).name());
return {};
}
- return {m_rc, static_cast<T *>(this)};
+ return {m_rc, thisAlias};
}
template <class T>
- inline WeakRef<T> RefCountAware::asWeak()
+ inline WeakRef<T> RefCountAware::asWeakThis(T *const thisAlias) const
{
if (!isShared()) {
UCL_ELOG("NOT SHARED: %s", typeid(*this).name());
return {};
}
- return {m_rc, static_cast<T *>(this)};
+ return {m_rc, thisAlias};
}
+ // Non-member functions //
+
template <class T>
- inline SharedRef<const T> RefCountAware::asShared() const
+ inline SharedRef<T> asShared(T &obj)
{
- if (!isShared()) {
- UCL_ELOG("NOT SHARED: %s", typeid(*this).name());
- return {};
- }
- return {m_rc, static_cast<const T *>(this)};
+ return obj.template asSharedThis<T>(&obj);
}
template <class T>
- inline WeakRef<const T> RefCountAware::asWeak() const
+ inline SharedRef<T> asShared(T *obj)
{
- if (!isShared()) {
- UCL_ELOG("NOT SHARED: %s", typeid(*this).name());
- return {};
- }
- return {m_rc, static_cast<const T *>(this)};
+ if (!obj) return {};
+ return obj->template asSharedThis<T>(obj);
}
- inline RefCountAwareSRef RefCountAware::asShared()
+ template <class T>
+ inline WeakRef<T> asWeak(T &obj)
{
- return asShared<RefCountAware>();
+ return obj.template asWeakThis<T>(&obj);
}
- inline RefCountAwareWRef RefCountAware::asWeak()
+ template <class T>
+ inline WeakRef<T> asWeak(T *obj)
{
- return asWeak<RefCountAware>();
+ if (!obj) return {};
+ return obj->template asWeakThis<T>(obj);
}
- inline RefCountAwareSCRef RefCountAware::asShared() const
+ template <class T, class U, class>
+ inline SharedRef<T> asShared(U &obj)
{
- return asShared<RefCountAware>();
+ return obj.template asSharedThis<T>(&obj);
}
- inline RefCountAwareWCRef RefCountAware::asWeak() const
+ template <class T, class U, class>
+ inline SharedRef<T> asShared(U *obj)
{
- return asWeak<RefCountAware>();
+ if (!obj) return {};
+ return obj->template asSharedThis<T>(obj);
}
- // Non-member functions //
+ template <class T, class U, class>
+ inline WeakRef<T> asWeak(U &obj)
+ {
+ return obj.template asWeakThis<T>(&obj);
+ }
- template <class T>
- inline SharedRef<T> asShared(T *obj)
+ template <class T, class U, class>
+ inline WeakRef<T> asWeak(U *obj)
{
- return RefCountAware::asShared(obj);
+ if (!obj) return {};
+ return obj->template asWeakThis<T>(obj);
}
- template <class T>
- inline WeakRef<T> asWeak(T *obj)
+ template <class T, class U, class>
+ inline SharedRef<const T> asShared(const U &obj)
{
- return RefCountAware::asWeak(obj);
+ return obj.template asSharedThis<const T>(&obj);
}
- template <class T>
- inline SharedRef<T> asShared(T &obj)
+ template <class T, class U, class>
+ inline SharedRef<const T> asShared(const U *obj)
{
- return RefCountAware::asShared(obj);
+ if (!obj) return {};
+ return obj->template asSharedThis<const T>(obj);
}
- template <class T>
- inline WeakRef<T> asWeak(T &obj)
+ template <class T, class U, class>
+ inline WeakRef<const T> asWeak(const U &obj)
+ {
+ return obj.template asWeakThis<const T>(&obj);
+ }
+
+ template <class T, class U, class>
+ inline WeakRef<const T> asWeak(const U *obj)
{
- return RefCountAware::asWeak(obj);
+ if (!obj) return {};
+ return obj->template asWeakThis<const T>(obj);
}
}