// -*- c-basic-offset: 4 -*- /* * This file is part of the KDE libraries * Copyright (C) 2005 Apple Computer, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #ifndef KXMLCORE_SHARED_PTR_H #define KXMLCORE_SHARED_PTR_H namespace kxmlcore { template class SharedPtr { public: SharedPtr() : m_ptr(0) {} explicit SharedPtr(T *ptr) : m_ptr(ptr) { if (m_ptr) m_ptr->ref(); } SharedPtr(const SharedPtr &o) : m_ptr(o.m_ptr) { if (m_ptr) m_ptr->ref(); } ~SharedPtr() { if (m_ptr) m_ptr->deref(); } template explicit SharedPtr(SharedPtr o) : m_ptr(o.get()) { if (m_ptr) m_ptr->ref(); } bool isNull() const { return m_ptr == 0; } bool notNull() const { return m_ptr != 0; } void reset() { if (m_ptr) m_ptr->deref(); m_ptr = 0; } void reset(T *o) { if (o) o->ref(); if (m_ptr) m_ptr->deref(); m_ptr = o; } T * get() const { return m_ptr; } T &operator*() const { return *m_ptr; } T *operator->() const { return m_ptr; } bool operator!() const { return m_ptr == 0; } operator bool() const { return m_ptr != 0; } inline friend bool operator==(const SharedPtr &a, const SharedPtr &b) { return a.m_ptr == b.m_ptr; } inline friend bool operator==(const SharedPtr &a, const T *b) { return a.m_ptr == b; } inline friend bool operator==(const T *a, const SharedPtr &b) { return a == b.m_ptr; } SharedPtr &operator=(const SharedPtr &); SharedPtr &operator=(T *); private: T* m_ptr; }; template SharedPtr &SharedPtr::operator=(const SharedPtr &o) { if (o.m_ptr) o.m_ptr->ref(); if (m_ptr) m_ptr->deref(); m_ptr = o.m_ptr; return *this; } template inline SharedPtr &SharedPtr::operator=(T *ptr) { if (ptr) ptr->ref(); if (m_ptr) m_ptr->deref(); m_ptr = ptr; return *this; } template inline bool operator!=(const SharedPtr &a, const SharedPtr &b) { return !(a==b); } template inline bool operator!=(const SharedPtr &a, const T *b) { return !(a == b); } template inline bool operator!=(const T *a, const SharedPtr &b) { return !(a == b); } template inline SharedPtr static_pointer_cast(const SharedPtr &p) { return SharedPtr(static_cast(p.get())); } template inline SharedPtr const_pointer_cast(const SharedPtr &p) { return SharedPtr(const_cast(p.get())); } } #endif // KXMLCORE_SHARED_PTR_H