translations
[enigma2.git] / lib / base / smartptr.h
index 159eeb2c0122ff43fa16786fb7dd787c20eaeb62..814d7457e29eafaa0420012b7cb53fbb6c93c40c 100644 (file)
@@ -3,14 +3,7 @@
 
 #include "object.h"
 #include <stdio.h>
-
-#ifdef SWIG
-#define TEMPLATE_TYPEDEF(x, y) \
-%template(y) x; \
-typedef x y
-#else
-#define TEMPLATE_TYPEDEF(x, y) typedef x y
-#endif
+#include <lib/python/swig.h>
 
 template<class T>
 class ePtr
@@ -63,6 +56,83 @@ public:
        T* &ptrref() { assert(!ptr); return ptr; }
        T* operator->() const { assert(ptr); return ptr; }
        operator T*() const { return this->ptr; }
+       
+       operator bool() const { return !!this->ptr; }
+};
+
+
+template<class T>
+class eUsePtr
+{
+protected:
+       T *ptr;
+public:
+       T &operator*() { return *ptr; }
+       eUsePtr(): ptr(0)
+       {
+       }
+       eUsePtr(T *c): ptr(c)
+       {
+               if (c)
+               {
+                       c->AddRef();
+                       c->AddUse();
+               }
+       }
+       eUsePtr(const eUsePtr &c)
+       {
+               ptr=c.ptr;
+               if (ptr)
+               {
+                       ptr->AddRef();
+                       ptr->AddUse();
+               }
+       }
+       eUsePtr &operator=(T *c)
+       {
+               if (c)
+               {
+                       c->AddRef();
+                       c->AddUse();
+               }
+               if (ptr)
+               {
+                       ptr->ReleaseUse();
+                       ptr->Release();
+               }
+               ptr=c;
+               return *this;
+       }
+       
+       eUsePtr &operator=(eUsePtr<T> &c)
+       {
+               if (c.ptr)
+               {
+                       c.ptr->AddRef();
+                       c.ptr->AddUse();
+               }
+               if (ptr)
+               {
+                       ptr->ReleaseUse();
+                       ptr->Release();
+               }
+               ptr=c.ptr;
+               return *this;
+       }
+       
+       ~eUsePtr()
+       {
+               if (ptr)
+               {
+                       ptr->ReleaseUse();
+                       ptr->Release();
+               }
+       }
+       
+       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; }
+       operator T*() const { return this->ptr; }
 };