From 23b718f36683ccd5a16d44b460cd9e324cc5e283 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Wed, 11 Mar 2015 01:16:31 +0000 Subject: [PATCH] deleted SharedPtr and renamed MmgedSharedPtr to SharedPtr --- qse/include/qse/Makefile.am | 2 +- qse/include/qse/Makefile.in | 4 +- qse/include/qse/cmn/Makefile.am | 2 +- qse/include/qse/cmn/Makefile.in | 4 +- qse/include/qse/cmn/MmgedSharedPtr.hpp | 173 ------------------------ qse/include/qse/cmn/Mmgr.hpp | 21 --- qse/include/qse/{ => cmn}/SharedPtr.hpp | 119 +++++++++------- 7 files changed, 79 insertions(+), 246 deletions(-) delete mode 100644 qse/include/qse/cmn/MmgedSharedPtr.hpp rename qse/include/qse/{ => cmn}/SharedPtr.hpp (51%) diff --git a/qse/include/qse/Makefile.am b/qse/include/qse/Makefile.am index 7a30bc5a..897a9aeb 100644 --- a/qse/include/qse/Makefile.am +++ b/qse/include/qse/Makefile.am @@ -9,7 +9,7 @@ pkginclude_HEADERS = \ if ENABLE_CXX pkginclude_HEADERS += \ Types.hpp Hashable.hpp Uncopyable.hpp RefCounted.hpp \ - ScopedPtr.hpp SharedPtr.hpp Exception.hpp + ScopedPtr.hpp Exception.hpp endif install-data-hook: diff --git a/qse/include/qse/Makefile.in b/qse/include/qse/Makefile.in index 970f268d..279625c7 100644 --- a/qse/include/qse/Makefile.in +++ b/qse/include/qse/Makefile.in @@ -52,7 +52,7 @@ build_triplet = @build@ host_triplet = @host@ @ENABLE_CXX_TRUE@am__append_1 = \ @ENABLE_CXX_TRUE@ Types.hpp Hashable.hpp Uncopyable.hpp RefCounted.hpp \ -@ENABLE_CXX_TRUE@ ScopedPtr.hpp SharedPtr.hpp Exception.hpp +@ENABLE_CXX_TRUE@ ScopedPtr.hpp Exception.hpp subdir = include/qse DIST_COMMON = $(am__pkginclude_HEADERS_DIST) $(srcdir)/Makefile.am \ @@ -95,7 +95,7 @@ am__can_run_installinfo = \ am__pkginclude_HEADERS_DIST = conf-msw.h conf-os2.h conf-dos.h \ conf-vms.h conf-mac.h conf-inf.h types.h macros.h pack1.h \ unpack.h Types.hpp Hashable.hpp Uncopyable.hpp RefCounted.hpp \ - ScopedPtr.hpp SharedPtr.hpp Exception.hpp + ScopedPtr.hpp Exception.hpp am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ diff --git a/qse/include/qse/cmn/Makefile.am b/qse/include/qse/cmn/Makefile.am index 9d521034..9534f993 100644 --- a/qse/include/qse/cmn/Makefile.am +++ b/qse/include/qse/cmn/Makefile.am @@ -51,7 +51,7 @@ pkginclude_HEADERS = \ if ENABLE_CXX pkginclude_HEADERS += \ - Mmgr.hpp StdMmgr.hpp HeapMmgr.hpp Mmged.hpp MmgedSharedPtr.hpp \ + Mmgr.hpp StdMmgr.hpp HeapMmgr.hpp Mmged.hpp SharedPtr.hpp \ Mpool.hpp Association.hpp LinkedList.hpp HashList.hpp HashTable.hpp \ RedBlackTree.hpp RedBlackTable.hpp \ Array.hpp BinaryHeap.hpp diff --git a/qse/include/qse/cmn/Makefile.in b/qse/include/qse/cmn/Makefile.in index b3b5a3a8..f42622a6 100644 --- a/qse/include/qse/cmn/Makefile.in +++ b/qse/include/qse/cmn/Makefile.in @@ -51,7 +51,7 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @ENABLE_CXX_TRUE@am__append_1 = \ -@ENABLE_CXX_TRUE@ Mmgr.hpp StdMmgr.hpp HeapMmgr.hpp Mmged.hpp MmgedSharedPtr.hpp \ +@ENABLE_CXX_TRUE@ Mmgr.hpp StdMmgr.hpp HeapMmgr.hpp Mmged.hpp SharedPtr.hpp \ @ENABLE_CXX_TRUE@ Mpool.hpp Association.hpp LinkedList.hpp HashList.hpp HashTable.hpp \ @ENABLE_CXX_TRUE@ RedBlackTree.hpp RedBlackTable.hpp \ @ENABLE_CXX_TRUE@ Array.hpp BinaryHeap.hpp @@ -93,7 +93,7 @@ am__pkginclude_HEADERS_DIST = alg.h chr.h cp949.h cp950.h dir.h dll.h \ nwio.h oht.h opt.h path.h pio.h pma.h rbt.h rex.h sck.h sio.h \ sll.h slmb.h str.h task.h time.h tio.h tmr.h tre.h uni.h uri.h \ utf8.h xma.h Mmgr.hpp StdMmgr.hpp HeapMmgr.hpp Mmged.hpp \ - MmgedSharedPtr.hpp Mpool.hpp Association.hpp LinkedList.hpp \ + SharedPtr.hpp Mpool.hpp Association.hpp LinkedList.hpp \ HashList.hpp HashTable.hpp RedBlackTree.hpp RedBlackTable.hpp \ Array.hpp BinaryHeap.hpp am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; diff --git a/qse/include/qse/cmn/MmgedSharedPtr.hpp b/qse/include/qse/cmn/MmgedSharedPtr.hpp deleted file mode 100644 index 9127c05d..00000000 --- a/qse/include/qse/cmn/MmgedSharedPtr.hpp +++ /dev/null @@ -1,173 +0,0 @@ -/* - * $Id$ - * - Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _QSE_CMN_MMGEDSHAREDPTR_HPP_ -#define _QSE_CMN_MMGEDSHAREDPTR_HPP_ - -#include - -///////////////////////////////// -QSE_BEGIN_NAMESPACE(QSE) -///////////////////////////////// - -template -struct MmgedSharedPtrDeleter -{ - void operator() (T* ptr, void* arg) - { - delete ptr; - } -}; - -template -struct MmgedSharedPtrArrayDeleter -{ - void operator() (T* ptr, void* arg) - { - delete[] ptr; - } -}; - -/// -/// The MmgedSharedPtr class is similar to SharedPtr except that i -/// accepts a pointer to a memory manager to allocate the space for -/// shared reference count. -/// -template > -class QSE_EXPORT MmgedSharedPtr: public Mmged -{ -public: - typedef MmgedSharedPtr SelfType; - - typedef MmgedSharedPtrDeleter DefaultDeleter; - - MmgedSharedPtr (T* ptr = (T*)QSE_NULL, void* darg = (void*)QSE_NULL): Mmged(QSE_NULL), _ptr(ptr), _darg(darg) - { - this->_ref = new(this->getMmgr()) qse_size_t; - (*this->_ref) = 1; - } - - MmgedSharedPtr (Mmgr* mmgr, T* ptr = (T*)QSE_NULL, void* darg = (void*)QSE_NULL): Mmged(mmgr), _ptr(ptr), _darg(darg) - { - this->_ref = new(this->getMmgr()) qse_size_t; - (*this->_ref) = 1; - } - - MmgedSharedPtr (const SelfType& ptr): Mmged(ptr), _ref(ptr._ref), _ptr (ptr._ptr), _darg (ptr._darg) - { - (*this->_ref)++; - } - - ~MmgedSharedPtr () - { - (*this->_ref)--; - if (*this->_ref <= 0) - { - if (this->_ptr) this->deleter (this->_ptr, this->_darg); - // no destructor as *this->_ref is a plain type. - ::operator delete (this->_ref, this->getMmgr()); - } - } - - SelfType& operator= (const SelfType& ptr) - { - if (this != &ptr) - { - (*this->_ref)--; - if (*this->_ref <= 0) - { - if (this->_ptr) this->deleter (this->_ptr, this->_darg); - // no destructor as *this->_ref is a plain type. - ::operator delete (this->_ref, this->getMmgr()); - } - - this->mmgr = ptr.getMmgr(); // memory manager must be copied - this->_ptr = ptr._ptr; - this->_darg = ptr._darg; - this->_ref = ptr._ref; - (*this->_ref)++; - } - - return *this; - } - - T& operator* () - { - QSE_ASSERT (this->_ptr != (T*)QSE_NULL); - return *this->_ptr; - } - - const T& operator* () const - { - QSE_ASSERT (this->_ptr != (T*)QSE_NULL); - return *this->_ptr; - } - - T* operator-> () - { - QSE_ASSERT (this->_ptr != (T*)QSE_NULL); - return this->_ptr; - } - - const T* operator-> () const - { - QSE_ASSERT (this->_ptr != (T*)QSE_NULL); - return this->_ptr; - } - - bool operator! () const - { - return this->_ptr == (T*)QSE_NULL; - } - - T& operator[] (qse_size_t idx) - { - QSE_ASSERT (this->_ptr != (T*)QSE_NULL); - return this->_ptr[idx]; - } - - T* get () - { - return this->_ptr; - } - - const T* get () const - { - return this->_ptr; - } - -protected: - qse_size_t* _ref; - T* _ptr; - void* _darg; - DELETER deleter; -}; - -///////////////////////////////// -QSE_END_NAMESPACE(QSE) -///////////////////////////////// - -#endif diff --git a/qse/include/qse/cmn/Mmgr.hpp b/qse/include/qse/cmn/Mmgr.hpp index fb8d8ba8..7950c236 100644 --- a/qse/include/qse/cmn/Mmgr.hpp +++ b/qse/include/qse/cmn/Mmgr.hpp @@ -209,27 +209,6 @@ struct ScopedPtrMmgrDeleter } }; -// Customized deleter for SharedPtr -template -struct SharedPtrMmgrDeleter -{ - void operator() (T* ptr, void* arg) - { - ptr->~T (); - ::operator delete (ptr, (QSE::Mmgr*)arg); - } -}; - -template -struct MmgedSharedPtrMmgrDeleter -{ - void operator() (T* ptr, void* arg) - { - ptr->~T (); - ::operator delete (ptr, (QSE::Mmgr*)arg); - } -}; - ///////////////////////////////// QSE_END_NAMESPACE(QSE) ///////////////////////////////// diff --git a/qse/include/qse/SharedPtr.hpp b/qse/include/qse/cmn/SharedPtr.hpp similarity index 51% rename from qse/include/qse/SharedPtr.hpp rename to qse/include/qse/cmn/SharedPtr.hpp index fb851255..e990dd4a 100644 --- a/qse/include/qse/SharedPtr.hpp +++ b/qse/include/qse/cmn/SharedPtr.hpp @@ -24,11 +24,10 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef _QSE_SHAREDPTR_HPP_ -#define _QSE_SHAREDPTR_HPP_ +#ifndef _QSE_CMN_SHAREDPTR_HPP_ +#define _QSE_CMN_SHAREDPTR_HPP_ -#include -#include +#include ///////////////////////////////// QSE_BEGIN_NAMESPACE(QSE) @@ -52,54 +51,78 @@ struct SharedPtrArrayDeleter } }; +template +struct SharedPtrMmgrDeleter +{ + void operator() (T* ptr, void* arg) + { + ptr->~T (); + ::operator delete (ptr, (QSE::Mmgr*)arg); + } +}; + /// -/// use QSE::MmgedSharedPtr if you want the instance of this class itself -/// to be memory managed. +/// The SharedPtr class provides a smart pointer that can be shared +/// using reference counting. /// template > -class QSE_EXPORT SharedPtr +class QSE_EXPORT SharedPtr: public Mmged { public: typedef SharedPtr SelfType; typedef SharedPtrDeleter DefaultDeleter; - SharedPtr (T* ptr = (T*)QSE_NULL, void* darg = (void*)QSE_NULL): _ptr (ptr), _darg (darg) + SharedPtr (T* ptr = (T*)QSE_NULL, void* darg = (void*)QSE_NULL): Mmged(QSE_NULL) { - this->_ref = new qse_size_t; - (*this->_ref) = 1; + this->item = new (this->getMmgr()) item_t; + this->item->ref = 1; + this->item->ptr = ptr; + this->item->darg = darg; } - SharedPtr (const SelfType& ptr): _ref(ptr._ref), _ptr (ptr._ptr), _darg (ptr._darg) + SharedPtr (Mmgr* mmgr, T* ptr = (T*)QSE_NULL, void* darg = (void*)QSE_NULL): Mmged(mmgr) { - (*this->_ref)++; + this->item = new (this->getMmgr()) item_t; + this->item->ref = 1; + this->item->ptr = ptr; + this->item->darg = darg; + } + + SharedPtr (const SelfType& sp): Mmged(sp), item (sp.item) + { + this->item->ref++; } ~SharedPtr () { - (*this->_ref)--; - if (*this->_ref <= 0) + this->item->ref--; + if (this->item->ref <= 0) { - if (this->_ptr) this->deleter (this->_ptr, this->_darg); - delete this->_ref; + if (this->item->ptr) this->item->deleter (this->item->ptr, this->item->darg); + // no destructor as *this->_ref is a plain type. + ::operator delete (this->item, this->getMmgr()); } } - SelfType& operator= (const SelfType& ptr) + SelfType& operator= (const SelfType& sp) { - if (this != &ptr) + if (this != &sp) { - (*this->_ref)--; - if (*this->_ref <= 0) + this->item->ref--; + if (this->item->ref <= 0) { - if (this->_ptr) this->deleter (this->_ptr, this->_darg); - delete this->_ref; + if (this->item->ptr) this->item->deleter (this->item->ptr, this->item->darg); + // no destructor as *this->_ref is a plain type. + ::operator delete (this->item, this->getMmgr()); } - this->_ptr = ptr._ptr; - this->_darg = ptr._darg; - this->_ref = ptr._ref; - (*this->_ref)++; + // must copy the memory manager pointer as the item + // to be copied is allocated using the memory manager of sp. + this->mmgr = sp.getMmgr(); + + this->item = sp.item; + this->item->ref++; } return *this; @@ -107,55 +130,59 @@ public: T& operator* () { - QSE_ASSERT (this->_ptr != (T*)QSE_NULL); - return *this->_ptr; + QSE_ASSERT (this->item->ptr != (T*)QSE_NULL); + return *this->item->ptr; } const T& operator* () const { - QSE_ASSERT (this->_ptr != (T*)QSE_NULL); - return *this->_ptr; + QSE_ASSERT (this->item->ptr != (T*)QSE_NULL); + return *this->item->ptr; } T* operator-> () { - QSE_ASSERT (this->_ptr != (T*)QSE_NULL); - return this->_ptr; + QSE_ASSERT (this->item->ptr != (T*)QSE_NULL); + return this->item->ptr; } const T* operator-> () const { - QSE_ASSERT (this->_ptr != (T*)QSE_NULL); - return this->_ptr; + QSE_ASSERT (this->item->ptr != (T*)QSE_NULL); + return this->item->ptr; } bool operator! () const { - return this->_ptr == (T*)QSE_NULL; + return this->item->ptr == (T*)QSE_NULL; } T& operator[] (qse_size_t idx) { - QSE_ASSERT (this->_ptr != (T*)QSE_NULL); - return this->_ptr[idx]; + QSE_ASSERT (this->item->ptr != (T*)QSE_NULL); + return this->item->ptr[idx]; } - T* get () + T* getPtr () { - return this->_ptr; + return this->item->ptr; } - const T* get () const + const T* getPtr () const { - return this->_ptr; + return this->item->ptr; } - protected: - qse_size_t* _ref; - T* _ptr; - void* _darg; - DELETER deleter; + struct item_t + { + qse_size_t ref; + T* ptr; + void* darg; + DELETER deleter; + }; + + item_t* item; }; /////////////////////////////////