X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/e39c12fcbf218f0964782a48d6e66145e1ce5039..c2bbed774d6e5c51b4af23a60a95aca74aa5d4e9:/lib/base/smartptr.h diff --git a/lib/base/smartptr.h b/lib/base/smartptr.h index 7e441ab2..782ff48e 100644 --- a/lib/base/smartptr.h +++ b/lib/base/smartptr.h @@ -3,14 +3,9 @@ #include "object.h" #include +#include -#ifdef SWIG -#define TEMPLATE_TYPEDEF(x, y) \ -%template(y) x; \ -typedef x y -#else -#define TEMPLATE_TYPEDEF(x, y) typedef x y -#endif +inline void ptrAssert(void *p) { if (!p) *(unsigned long*)0=0; } template class ePtr @@ -59,10 +54,14 @@ public: ptr->Release(); } +#ifndef SWIG T* grabRef() { if (!ptr) return 0; ptr->AddRef(); return ptr; } T* &ptrref() { assert(!ptr); return ptr; } - T* operator->() const { assert(ptr); return ptr; } +#endif + T* operator->() const { ptrAssert(ptr); return ptr; } operator T*() const { return this->ptr; } + + operator bool() const { return !!this->ptr; } }; @@ -134,9 +133,11 @@ public: } } +#ifndef SWIG T* grabRef() { if (!ptr) return 0; ptr->AddRef(); ptr->AddUse(); return ptr; } T* &ptrref() { assert(!ptr); return ptr; } - T* operator->() const { assert(ptr); return ptr; } +#endif + T* operator->() const { ptrAssert(ptr); return ptr; } operator T*() const { return this->ptr; } }; @@ -184,13 +185,13 @@ public: } - ePtrHelper operator->() { assert(ptr); return ePtrHelper(ptr); } + ePtrHelper operator->() { ptrAssert(ptr); return ePtrHelper(ptr); } /* for const objects, we don't need the helper, as they can't */ /* be changed outside the program flow. at least this is */ /* what the compiler assumes, so in case you're using const */ /* eMutablePtrs note that they have to be const. */ - const T* operator->() const { assert(ptr); return ptr; } + const T* operator->() const { ptrAssert(ptr); return ptr; } }; #endif