diff options
author | Vincent Richard <[email protected]> | 2005-07-12 22:28:02 +0000 |
---|---|---|
committer | Vincent Richard <[email protected]> | 2005-07-12 22:28:02 +0000 |
commit | 681297e10b666e13cc463f6fbb16236f36c3266c (patch) | |
tree | 5d2392e2283232ed3475cd9c69e22897b03e8a97 /src/object.cpp | |
parent | Added contentHandler::extractRaw(). (diff) | |
download | vmime-681297e10b666e13cc463f6fbb16236f36c3266c.tar.gz vmime-681297e10b666e13cc463f6fbb16236f36c3266c.zip |
Reference counting and smart pointers.
Diffstat (limited to 'src/object.cpp')
-rw-r--r-- | src/object.cpp | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/src/object.cpp b/src/object.cpp new file mode 100644 index 00000000..481a3564 --- /dev/null +++ b/src/object.cpp @@ -0,0 +1,130 @@ +// +// VMime library (http://www.vmime.org) +// Copyright (C) 2002-2005 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., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#include "vmime/types.hpp" +#include "vmime/object.hpp" + +#include <algorithm> // std::find +#include <sstream> // std::ostringstream +#include <stdexcept> // std::runtime_error + + +namespace vmime +{ + + +object::object() + : m_strongCount(0) +{ +} + + +object::object(const object&) + : m_strongCount(0) +{ + // Not used +} + + +object::~object() +{ + for (std::vector <utility::weak_ref_base*>::iterator + it = m_weakRefs.begin() ; it != m_weakRefs.end() ; ++it) + { + (*it)->notifyObjectDestroyed(); + } + +#if VMIME_DEBUG + if (m_strongCount != 0) + { + std::ostringstream oss; + oss << "ERROR: Deleting object and strong count != 0." + << " (" << __FILE__ << ", line " << __LINE__ << ")" << std::endl; + + throw std::runtime_error(oss.str()); + } +#endif // VMIME_DEBUG +} + + +void object::addStrong() const +{ + ++m_strongCount; +} + + +void object::addWeak(utility::weak_ref_base* w) const +{ + m_weakRefs.push_back(w); +} + + +void object::releaseStrong() const +{ + if (--m_strongCount == 0) + delete this; +} + + +void object::releaseWeak(utility::weak_ref_base* w) const +{ + std::vector <utility::weak_ref_base*>::iterator + it = std::find(m_weakRefs.begin(), m_weakRefs.end(), w); + + if (it != m_weakRefs.end()) + m_weakRefs.erase(it); +#if VMIME_DEBUG + else + { + std::ostringstream oss; + oss << "ERROR: weak ref does not exist anymore!" + << " (" << __FILE__ << ", line " << __LINE__ << ")" << std::endl; + + throw std::runtime_error(oss.str()); + } +#endif // VMIME_DEBUG +} + + +ref <object> object::thisRef() +{ + return ref <object>::fromPtr(this); +} + + +ref <const object> object::thisRef() const +{ + return ref <const object>::fromPtr(this); +} + + +weak_ref <object> object::thisWeakRef() +{ + return weak_ref <object>(thisRef()); +} + + +weak_ref <const object> object::thisWeakRef() const +{ + return weak_ref <const object>(thisRef()); +} + + +} // vmime + |