Win32 doesn't have execinfo.h, so don't include it
authorMikko Rasa <tdb@tdb.fi>
Mon, 11 Jun 2007 06:37:33 +0000 (06:37 +0000)
committerMikko Rasa <tdb@tdb.fi>
Mon, 11 Jun 2007 06:37:33 +0000 (06:37 +0000)
Add KeyError
Add release() to RefPtr

source/core/error.h
source/core/refptr.h
source/debug/backtrace.cpp

index eecda49bd00cf8553a6f1be02c7c739a1e07e667..d030c41c12937e1a3846ce819c445cd2b953e308 100644 (file)
@@ -39,6 +39,15 @@ public:
        InvalidParameterValue(const std::string &w_): Exception(w_) { }
 };
 
+/**
+Thrown when a lookup from a map fails.
+*/
+class KeyError: public Exception
+{
+public:
+       KeyError(const std::string &w_): Exception(w_) { }
+};
+
 /**
 Thrown when the current object state doesn't allow the requested action.
 */
index ee020e0eb8783f3af6579f8960b4ae1707b9b18d..a44c13c84e00da087d35f8a6a7776b2e1281c1e2 100644 (file)
@@ -9,6 +9,10 @@ Distributed under the LGPL
 
 namespace Msp {
 
+/**
+A reference counting smart pointer.  When the last RefPtr for the data gets
+destroyed, the data is deleted as well.
+*/
 template<typename T>
 class RefPtr
 {
@@ -16,8 +20,6 @@ public:
        RefPtr(): data(0), count(0) { }
        RefPtr(T *d): data(d), count(0) { if(data) count=new unsigned(1); }
        RefPtr(const RefPtr &p): data(p.data), count(p.count) { incref(); }
-       ~RefPtr() { decref(); }
-
        RefPtr &operator=(const RefPtr &p)
        {
                decref();
@@ -26,6 +28,22 @@ public:
                incref();
                return *this;
        }
+       
+       ~RefPtr() { decref(); }
+
+       /**
+       Makes the RefPtr release its reference of the data.  Note that if there are
+       other RefPtrs left with the same data, it might still get deleted
+       automatically.
+       */
+       T *release()
+       {
+               T *d=data;
+               data=0;
+               decref();
+               count=0;
+               return d;
+       }
 
        T *get() const        { return data; }
        T &operator*() const  { return *data; }
@@ -33,7 +51,7 @@ public:
        operator bool() const { return data!=0; }
 
        template<typename U>
-       static RefPtr<T> cast_dynamic(const RefPtr<U> &p)  { return RefPtr<T>(dynamic_cast<T *>(p.get()), p.count); }
+       static RefPtr<T> cast_dynamic(const RefPtr<U> &p)  { return RefPtr<T>(dynamic_cast<T *>(p.data), p.count); }
        template<typename U> friend class RefPtr;
 private:
        T        *data;
index 2078996c41d234bb138f8cb29c4805e7894cd9ab..c0bfd9d9ca16158e898b7ecd2625eb9375d3bc6d 100644 (file)
@@ -4,7 +4,9 @@ This file is part of libmspcore
 Copyright © 2007 Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
+#ifndef WIN32
 #include <execinfo.h>
+#endif
 #include "backtrace.h"
 
 using namespace std;