deleted SharedPtr and renamed MmgedSharedPtr to SharedPtr
This commit is contained in:
		| @ -9,7 +9,7 @@ pkginclude_HEADERS = \ | |||||||
| if ENABLE_CXX | if ENABLE_CXX | ||||||
| pkginclude_HEADERS += \ | pkginclude_HEADERS += \ | ||||||
| 	Types.hpp Hashable.hpp Uncopyable.hpp RefCounted.hpp \ | 	Types.hpp Hashable.hpp Uncopyable.hpp RefCounted.hpp \ | ||||||
| 	ScopedPtr.hpp SharedPtr.hpp Exception.hpp | 	ScopedPtr.hpp Exception.hpp | ||||||
| endif | endif | ||||||
|  |  | ||||||
| install-data-hook: | install-data-hook: | ||||||
|  | |||||||
| @ -52,7 +52,7 @@ build_triplet = @build@ | |||||||
| host_triplet = @host@ | host_triplet = @host@ | ||||||
| @ENABLE_CXX_TRUE@am__append_1 = \ | @ENABLE_CXX_TRUE@am__append_1 = \ | ||||||
| @ENABLE_CXX_TRUE@	Types.hpp Hashable.hpp Uncopyable.hpp RefCounted.hpp \ | @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 | subdir = include/qse | ||||||
| DIST_COMMON = $(am__pkginclude_HEADERS_DIST) $(srcdir)/Makefile.am \ | 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 \ | 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 \ | 	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 \ | 	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_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; | ||||||
| am__vpath_adj = case $$p in \ | am__vpath_adj = case $$p in \ | ||||||
|     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ |     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ pkginclude_HEADERS = \ | |||||||
|  |  | ||||||
| if ENABLE_CXX | if ENABLE_CXX | ||||||
| pkginclude_HEADERS += \ | 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 \ | 	Mpool.hpp Association.hpp LinkedList.hpp HashList.hpp HashTable.hpp \ | ||||||
| 	RedBlackTree.hpp RedBlackTable.hpp \ | 	RedBlackTree.hpp RedBlackTable.hpp \ | ||||||
| 	Array.hpp BinaryHeap.hpp | 	Array.hpp BinaryHeap.hpp | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ POST_UNINSTALL = : | |||||||
| build_triplet = @build@ | build_triplet = @build@ | ||||||
| host_triplet = @host@ | host_triplet = @host@ | ||||||
| @ENABLE_CXX_TRUE@am__append_1 = \ | @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@	Mpool.hpp Association.hpp LinkedList.hpp HashList.hpp HashTable.hpp \ | ||||||
| @ENABLE_CXX_TRUE@	RedBlackTree.hpp RedBlackTable.hpp \ | @ENABLE_CXX_TRUE@	RedBlackTree.hpp RedBlackTable.hpp \ | ||||||
| @ENABLE_CXX_TRUE@	Array.hpp BinaryHeap.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 \ | 	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 \ | 	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 \ | 	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 \ | 	HashList.hpp HashTable.hpp RedBlackTree.hpp RedBlackTable.hpp \ | ||||||
| 	Array.hpp BinaryHeap.hpp | 	Array.hpp BinaryHeap.hpp | ||||||
| am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; | am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; | ||||||
|  | |||||||
| @ -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/cmn/Mmged.hpp> |  | ||||||
|  |  | ||||||
| ///////////////////////////////// |  | ||||||
| QSE_BEGIN_NAMESPACE(QSE) |  | ||||||
| ///////////////////////////////// |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| struct MmgedSharedPtrDeleter |  | ||||||
| { |  | ||||||
| 	void operator() (T* ptr, void* arg) |  | ||||||
| 	{ |  | ||||||
| 		delete ptr; |  | ||||||
| 	} |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| 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<typename T, typename DELETER = MmgedSharedPtrDeleter<T> > |  | ||||||
| class QSE_EXPORT MmgedSharedPtr: public Mmged |  | ||||||
| { |  | ||||||
| public: |  | ||||||
| 	typedef MmgedSharedPtr<T,DELETER> SelfType; |  | ||||||
|  |  | ||||||
| 	typedef MmgedSharedPtrDeleter<T> 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 |  | ||||||
| @ -209,27 +209,6 @@ struct ScopedPtrMmgrDeleter | |||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Customized deleter for SharedPtr |  | ||||||
| template <typename T> |  | ||||||
| struct SharedPtrMmgrDeleter |  | ||||||
| { |  | ||||||
| 	void operator() (T* ptr, void* arg) |  | ||||||
| 	{ |  | ||||||
| 		ptr->~T (); |  | ||||||
| 		::operator delete (ptr, (QSE::Mmgr*)arg); |  | ||||||
| 	} |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| struct MmgedSharedPtrMmgrDeleter |  | ||||||
| { |  | ||||||
| 	void operator() (T* ptr, void* arg) |  | ||||||
| 	{ |  | ||||||
| 		ptr->~T (); |  | ||||||
| 		::operator delete (ptr, (QSE::Mmgr*)arg); |  | ||||||
| 	} |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| ///////////////////////////////// | ///////////////////////////////// | ||||||
| QSE_END_NAMESPACE(QSE) | QSE_END_NAMESPACE(QSE) | ||||||
| ///////////////////////////////// | ///////////////////////////////// | ||||||
|  | |||||||
| @ -24,11 +24,10 @@ | |||||||
|     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #ifndef _QSE_SHAREDPTR_HPP_ | #ifndef _QSE_CMN_SHAREDPTR_HPP_ | ||||||
| #define _QSE_SHAREDPTR_HPP_ | #define _QSE_CMN_SHAREDPTR_HPP_ | ||||||
| 
 | 
 | ||||||
| #include <qse/types.h> | #include <qse/cmn/Mmged.hpp> | ||||||
| #include <qse/macros.h> |  | ||||||
| 
 | 
 | ||||||
| /////////////////////////////////
 | /////////////////////////////////
 | ||||||
| QSE_BEGIN_NAMESPACE(QSE) | QSE_BEGIN_NAMESPACE(QSE) | ||||||
| @ -52,54 +51,78 @@ struct SharedPtrArrayDeleter | |||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | template <typename T> | ||||||
|  | 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
 | /// The SharedPtr class provides a smart pointer that can be shared
 | ||||||
| /// to be memory managed.
 | /// using reference counting.
 | ||||||
| ///
 | ///
 | ||||||
| template<typename T, typename DELETER = SharedPtrDeleter<T> > | template<typename T, typename DELETER = SharedPtrDeleter<T> > | ||||||
| class QSE_EXPORT SharedPtr | class QSE_EXPORT SharedPtr: public Mmged | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	typedef SharedPtr<T,DELETER> SelfType; | 	typedef SharedPtr<T,DELETER> SelfType; | ||||||
| 
 | 
 | ||||||
| 	typedef SharedPtrDeleter<T> DefaultDeleter; | 	typedef SharedPtrDeleter<T> 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->item = new (this->getMmgr()) item_t; | ||||||
| 		(*this->_ref) = 1; | 		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 ()  | 	~SharedPtr ()  | ||||||
| 	{ | 	{ | ||||||
| 		(*this->_ref)--; | 		this->item->ref--; | ||||||
| 		if (*this->_ref <= 0) | 		if (this->item->ref <= 0) | ||||||
| 		{ | 		{ | ||||||
| 			if (this->_ptr) this->deleter (this->_ptr, this->_darg); | 			if (this->item->ptr) this->item->deleter (this->item->ptr, this->item->darg); | ||||||
| 			delete this->_ref; | 			// 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)--; | 			this->item->ref--; | ||||||
| 			if (*this->_ref <= 0) | 			if (this->item->ref <= 0) | ||||||
| 			{ | 			{ | ||||||
| 				if (this->_ptr) this->deleter (this->_ptr, this->_darg); | 				if (this->item->ptr) this->item->deleter (this->item->ptr, this->item->darg); | ||||||
| 				delete this->_ref; | 				// no destructor as *this->_ref is a plain type.
 | ||||||
|  | 				::operator delete (this->item, this->getMmgr()); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			this->_ptr = ptr._ptr; | 			// must copy the memory manager pointer as the item
 | ||||||
| 			this->_darg = ptr._darg; | 			// to be copied is allocated using the memory manager of sp.
 | ||||||
| 			this->_ref = ptr._ref; | 			this->mmgr = sp.getMmgr(); | ||||||
| 			(*this->_ref)++; | 
 | ||||||
|  | 			this->item = sp.item; | ||||||
|  | 			this->item->ref++; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		return *this; | 		return *this; | ||||||
| @ -107,57 +130,61 @@ public: | |||||||
| 
 | 
 | ||||||
| 	T& operator* () | 	T& operator* () | ||||||
| 	{ | 	{ | ||||||
| 		QSE_ASSERT (this->_ptr != (T*)QSE_NULL); | 		QSE_ASSERT (this->item->ptr != (T*)QSE_NULL); | ||||||
| 		return *this->_ptr; | 		return *this->item->ptr; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	const T& operator* () const  | 	const T& operator* () const  | ||||||
| 	{ | 	{ | ||||||
| 		QSE_ASSERT (this->_ptr != (T*)QSE_NULL); | 		QSE_ASSERT (this->item->ptr != (T*)QSE_NULL); | ||||||
| 		return *this->_ptr; | 		return *this->item->ptr; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	T* operator-> ()  | 	T* operator-> ()  | ||||||
| 	{ | 	{ | ||||||
| 		QSE_ASSERT (this->_ptr != (T*)QSE_NULL); | 		QSE_ASSERT (this->item->ptr != (T*)QSE_NULL); | ||||||
| 		return this->_ptr; | 		return this->item->ptr; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	const T* operator-> () const  | 	const T* operator-> () const  | ||||||
| 	{ | 	{ | ||||||
| 		QSE_ASSERT (this->_ptr != (T*)QSE_NULL); | 		QSE_ASSERT (this->item->ptr != (T*)QSE_NULL); | ||||||
| 		return this->_ptr; | 		return this->item->ptr; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool operator! () const  | 	bool operator! () const  | ||||||
| 	{ | 	{ | ||||||
| 		return this->_ptr == (T*)QSE_NULL; | 		return this->item->ptr == (T*)QSE_NULL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	T& operator[] (qse_size_t idx)  | 	T& operator[] (qse_size_t idx)  | ||||||
| 	{ | 	{ | ||||||
| 		QSE_ASSERT (this->_ptr != (T*)QSE_NULL); | 		QSE_ASSERT (this->item->ptr != (T*)QSE_NULL); | ||||||
| 		return this->_ptr[idx]; | 		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: | protected: | ||||||
| 	qse_size_t* _ref; | 	struct item_t | ||||||
| 	T*          _ptr; | 	{ | ||||||
| 	void*       _darg; | 		qse_size_t ref; | ||||||
|  | 		T*         ptr; | ||||||
|  | 		void*      darg; | ||||||
| 		DELETER    deleter; | 		DELETER    deleter; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
|  | 	item_t* item; | ||||||
|  | };  | ||||||
|  | 
 | ||||||
| /////////////////////////////////
 | /////////////////////////////////
 | ||||||
| QSE_END_NAMESPACE(QSE) | QSE_END_NAMESPACE(QSE) | ||||||
| /////////////////////////////////
 | /////////////////////////////////
 | ||||||
		Reference in New Issue
	
	Block a user