diff options
Diffstat (limited to 'vmime')
-rw-r--r-- | vmime/utility/smartPtr.hpp | 60 | ||||
-rw-r--r-- | vmime/utility/smartPtrInt.hpp | 107 |
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 + |