servicemp3.cpp: more simple/flexible streaming detection
[enigma2.git] / lib / base / smartptr.h
index 782ff48e913049fb8e00cb528843917275399641..be83528ff7b44b35a032fbe0b0abba53af64805c 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "object.h"
 #include <stdio.h>
 
 #include "object.h"
 #include <stdio.h>
+#include <string.h>
 #include <lib/python/swig.h>
 
 inline void ptrAssert(void *p) { if (!p) *(unsigned long*)0=0; }
 #include <lib/python/swig.h>
 
 inline void ptrAssert(void *p) { if (!p) *(unsigned long*)0=0; }
@@ -12,6 +13,18 @@ class ePtr
 {
 protected:
        T *ptr;
 {
 protected:
        T *ptr;
+       char m_ptrStr[sizeof(void*)*2+1];
+       void updatePtrStr()
+       {
+               if (ptr) {
+                       if (sizeof(void*) > 4)
+                               sprintf(m_ptrStr, "%llx", (unsigned long long)ptr);
+                       else
+                               sprintf(m_ptrStr, "%lx", (unsigned long)ptr);
+               }
+               else
+                       strcpy(m_ptrStr, "NIL");
+       }
 public:
        T &operator*() { return *ptr; }
        ePtr(): ptr(0)
 public:
        T &operator*() { return *ptr; }
        ePtr(): ptr(0)
@@ -21,12 +34,13 @@ public:
        {
                if (c)
                        c->AddRef();
        {
                if (c)
                        c->AddRef();
+               updatePtrStr();
        }
        }
-       ePtr(const ePtr &c)
+       ePtr(const ePtr &c): ptr(c.ptr)
        {
        {
-               ptr=c.ptr;
                if (ptr)
                        ptr->AddRef();
                if (ptr)
                        ptr->AddRef();
+               updatePtrStr();
        }
        ePtr &operator=(T *c)
        {
        }
        ePtr &operator=(T *c)
        {
@@ -35,9 +49,9 @@ public:
                if (ptr)
                        ptr->Release();
                ptr=c;
                if (ptr)
                        ptr->Release();
                ptr=c;
+               updatePtrStr();
                return *this;
        }
                return *this;
        }
-       
        ePtr &operator=(ePtr<T> &c)
        {
                if (c.ptr)
        ePtr &operator=(ePtr<T> &c)
        {
                if (c.ptr)
@@ -45,23 +59,25 @@ public:
                if (ptr)
                        ptr->Release();
                ptr=c.ptr;
                if (ptr)
                        ptr->Release();
                ptr=c.ptr;
+               updatePtrStr();
                return *this;
        }
                return *this;
        }
-       
        ~ePtr()
        {
                if (ptr)
                        ptr->Release();
        }
        ~ePtr()
        {
                if (ptr)
                        ptr->Release();
        }
-       
+       char *getPtrString()
+       {
+               return m_ptrStr;
+       }
 #ifndef SWIG
        T* grabRef() { if (!ptr) return 0; ptr->AddRef(); return ptr; }
 #ifndef SWIG
        T* grabRef() { if (!ptr) return 0; ptr->AddRef(); return ptr; }
-       T* &ptrref() { assert(!ptr); return ptr; }
+       T* &ptrref() { ASSERT(!ptr); return ptr; }
+       operator bool() const { return !!this->ptr; }
 #endif
        T* operator->() const { ptrAssert(ptr); return ptr; }
        operator T*() const { return this->ptr; }
 #endif
        T* operator->() const { ptrAssert(ptr); return ptr; }
        operator T*() const { return this->ptr; }
-       
-       operator bool() const { return !!this->ptr; }
 };
 
 
 };
 
 
@@ -107,7 +123,6 @@ public:
                ptr=c;
                return *this;
        }
                ptr=c;
                return *this;
        }
-       
        eUsePtr &operator=(eUsePtr<T> &c)
        {
                if (c.ptr)
        eUsePtr &operator=(eUsePtr<T> &c)
        {
                if (c.ptr)
@@ -123,7 +138,6 @@ public:
                ptr=c.ptr;
                return *this;
        }
                ptr=c.ptr;
                return *this;
        }
-       
        ~eUsePtr()
        {
                if (ptr)
        ~eUsePtr()
        {
                if (ptr)
@@ -132,10 +146,9 @@ public:
                        ptr->Release();
                }
        }
                        ptr->Release();
                }
        }
-       
 #ifndef SWIG
        T* grabRef() { if (!ptr) return 0; ptr->AddRef(); ptr->AddUse(); return ptr; }
 #ifndef SWIG
        T* grabRef() { if (!ptr) return 0; ptr->AddRef(); ptr->AddUse(); return ptr; }
-       T* &ptrref() { assert(!ptr); return ptr; }
+       T* &ptrref() { ASSERT(!ptr); return ptr; }
 #endif
        T* operator->() const { ptrAssert(ptr); return ptr; }
        operator T*() const { return this->ptr; }
 #endif
        T* operator->() const { ptrAssert(ptr); return ptr; }
        operator T*() const { return this->ptr; }
@@ -169,24 +182,18 @@ public:
        eMutablePtr(): ePtr<T>(0)
        {
        }
        eMutablePtr(): ePtr<T>(0)
        {
        }
-       
        eMutablePtr(T *c): ePtr<T>(c)
        {
        }
        eMutablePtr(T *c): ePtr<T>(c)
        {
        }
-
        eMutablePtr(const eMutablePtr &c): ePtr<T>(c)
        {
        }
        eMutablePtr(const eMutablePtr &c): ePtr<T>(c)
        {
        }
-       
        eMutablePtr &operator=(T *c)
        {
                ePtr<T>::operator=(c);
                return *this;
        }
        eMutablePtr &operator=(T *c)
        {
                ePtr<T>::operator=(c);
                return *this;
        }
-       
-       
        ePtrHelper<T> operator->() { ptrAssert(ptr); return ePtrHelper<T>(ptr); }
        ePtrHelper<T> operator->() { ptrAssert(ptr); return ePtrHelper<T>(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 */
                        /* 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 */