aboutsummaryrefslogtreecommitdiffstats
path: root/vmime
diff options
context:
space:
mode:
Diffstat (limited to 'vmime')
-rw-r--r--vmime/utility/smartPtr.hpp60
-rw-r--r--vmime/utility/smartPtrInt.hpp107
2 files changed, 127 insertions, 40 deletions
diff --git a/vmime/utility/smartPtr.hpp b/vmime/utility/smartPtr.hpp
index c52752ed..9b97121c 100644
--- a/vmime/utility/smartPtr.hpp
+++ b/vmime/utility/smartPtr.hpp
@@ -58,86 +58,66 @@ public:
};
-/** Reference counter for shared pointers.
- */
-
-class refCounter
-{
-public:
-
- refCounter(const long initialValue);
- ~refCounter();
-
- const long increment();
- const long decrement();
- const long compareExchange(const long compare, const long exchangeWith);
-
- operator long() const;
-
-private:
-
- long m_value;
-};
-
-
/** Manage the life cycle of an object.
*/
class refManager
{
+protected:
+
+ refManager() {}
+
public:
- refManager(object* obj);
- ~refManager();
+ virtual ~refManager() {}
+
+ /** Create a ref manager for the specified object.
+ *
+ * @return a new manager
+ */
+ static refManager* create(object* obj);
/** Add a strong reference to the managed object.
*/
- const bool addStrong();
+ virtual const bool addStrong() = 0;
/** Release a strong reference to the managed object.
* If it is the last reference, the object is destroyed.
*/
- void releaseStrong();
+ virtual void releaseStrong() = 0;
/** Add a weak reference to the managed object.
*/
- void addWeak();
+ virtual void addWeak() = 0;
/** Release a weak reference to the managed object.
* If it is the last weak reference, the manager is destroyed.
*/
- void releaseWeak();
+ virtual void releaseWeak() = 0;
/** Return a raw pointer to the managed object.
*
* @return pointer to the managed object
*/
- object* getObject();
+ virtual object* getObject() = 0;
/** Return the number of strong refs to this object.
* For debugging purposes only.
*
* @return strong reference count
*/
- const long getStrongRefCount() const;
+ virtual const long getStrongRefCount() const = 0;
/** Return the number of weak refs to this object.
* For debugging purposes only.
*
* @return weak reference count
*/
- const long getWeakRefCount() const;
-
-private:
+ virtual const long getWeakRefCount() const = 0;
- void deleteManager();
- void deleteObject();
-
-
- object* m_object;
+protected:
- refCounter m_strongCount;
- refCounter m_weakCount;
+ void deleteObjectImpl(object* obj);
};
diff --git a/vmime/utility/smartPtrInt.hpp b/vmime/utility/smartPtrInt.hpp
new file mode 100644
index 00000000..b47ce504
--- /dev/null
+++ b/vmime/utility/smartPtrInt.hpp
@@ -0,0 +1,107 @@
+//
+// VMime library (http://www.vmime.org)
+// Copyright (C) 2002-2007 Vincent Richard <[email protected]>
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of
+// the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// Linking this library statically or dynamically with other modules is making
+// a combined work based on this library. Thus, the terms and conditions of
+// the GNU General Public License cover the whole combination.
+//
+
+#ifndef VMIME_UTILITY_SMARTPTRIMPL_HPP_INCLUDED
+#define VMIME_UTILITY_SMARTPTRIMPL_HPP_INCLUDED
+
+
+#include "vmime/config.hpp"
+#include "vmime/utility/smartPtr.hpp"
+
+
+namespace vmime {
+namespace utility {
+
+
+/** Reference counter for shared pointers.
+ */
+
+class refCounter
+{
+public:
+
+ refCounter(const long initialValue);
+ ~refCounter();
+
+ const long increment();
+ const long decrement();
+
+ operator long() const;
+
+private:
+
+#if defined(_WIN32)
+ long m_value;
+#elif defined(__GNUC__) && defined(__GLIBCPP__)
+ mutable volatile int m_value;
+#elif defined (VMIME_HAVE_PTHREAD)
+ volatile long m_value;
+ pthread_mutex_t m_mutex;
+#else // not thread-safe implementation
+ long m_value;
+#endif
+
+};
+
+
+/** Separate implementation of refManager, to avoid polluting global
+ * namespace with system-specific inclusions/definitions.
+ */
+
+class refManagerImpl : public refManager
+{
+public:
+
+ refManagerImpl(object* obj);
+ ~refManagerImpl();
+
+ const bool addStrong();
+ void releaseStrong();
+
+ void addWeak();
+ void releaseWeak();
+
+ object* getObject();
+
+ const long getStrongRefCount() const;
+ const long getWeakRefCount() const;
+
+private:
+
+ void deleteManager();
+ void deleteObject();
+
+
+ object* m_object;
+
+ refCounter m_strongCount;
+ refCounter m_weakCount;
+};
+
+
+} // utility
+} // vmime
+
+
+#endif // VMIME_UTILITY_SMARTPTRIMPL_HPP_INCLUDED
+