changed code for old compilers
This commit is contained in:
		@ -34,23 +34,26 @@
 | 
			
		||||
#include <qse/types.h>
 | 
			
		||||
#include <qse/macros.h>
 | 
			
		||||
 | 
			
		||||
// The QSE_CPP_CALL_DESTRUCTOR() macro calls a destructor explicitly.
 | 
			
		||||
// The QSE_CPP_CALL_PLACEMENT_DELETE1() macro calls the global operator delete
 | 
			
		||||
// with 1 extra argument given.
 | 
			
		||||
 | 
			
		||||
#if (__cplusplus >= 201103L) // C++11
 | 
			
		||||
 | 
			
		||||
	/// The QSE_ENABLE_CPP11_MOVE macro enables C++11 move semantics
 | 
			
		||||
	/// The QSE_CPP_ENABLE_CPP1_MOVE macro enables C++11 move semantics
 | 
			
		||||
	/// in various classes.
 | 
			
		||||
	#define QSE_ENABLE_CPP11_MOVE 1
 | 
			
		||||
	#define QSE_CPP_ENABLE_CPP1_MOVE 1
 | 
			
		||||
 | 
			
		||||
	// The QSE_CPP_CALL_DESTRUCTOR() macro calls a destructor explicitly.
 | 
			
		||||
	#define QSE_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->~class_name())
 | 
			
		||||
	#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete ((ptr), (arg1)))
 | 
			
		||||
 | 
			
		||||
	// The QSE_CPP_CALL_PLACEMENT_DELETE1() macro calls the global operator delete
 | 
			
		||||
	// with 1 extra argument given.
 | 
			
		||||
	#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete((ptr), (arg1)))
 | 
			
		||||
 | 
			
		||||
	#define QSE_CPP_TEMPLATE_QUALIFIER template
 | 
			
		||||
 | 
			
		||||
#elif (__cplusplus >= 199711L) // C++98
 | 
			
		||||
 | 
			
		||||
	#define QSE_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->~class_name())
 | 
			
		||||
	#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete ((ptr), (arg1)))
 | 
			
		||||
	#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete((ptr), (arg1)))
 | 
			
		||||
	#define QSE_CPP_TEMPLATE_QUALIFIER template
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
@ -68,7 +71,8 @@
 | 
			
		||||
		//   x->Node::~Node ();
 | 
			
		||||
 | 
			
		||||
		#define QSE_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->class_name::~class_name())
 | 
			
		||||
		#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete ((ptr), (arg1)))
 | 
			
		||||
		#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete((ptr), (arg1)))
 | 
			
		||||
		#define QSE_CPP_TEMPLATE_QUALIFIER template
 | 
			
		||||
 | 
			
		||||
	#elif defined(__WATCOMC__)
 | 
			
		||||
		// WATCOM has a problem with this syntax.
 | 
			
		||||
@ -76,18 +80,41 @@
 | 
			
		||||
		// But it doesn't support operator delete overloading.
 | 
			
		||||
 | 
			
		||||
		#define QSE_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->~class_name())
 | 
			
		||||
		#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator_delete ((ptr), (arg1)))
 | 
			
		||||
		#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::qse_operator_delete((ptr), (arg1)))
 | 
			
		||||
 | 
			
		||||
		// When  the name of a member template specialization appears after .  or
 | 
			
		||||
		// -> in a postfix-expression, or after :: in a qualified-id that explic-
 | 
			
		||||
		// itly  depends on a template-argument (_temp.dep_), the member template
 | 
			
		||||
		// name must be prefixed by the keyword template.  Otherwise the name  is
 | 
			
		||||
		// assumed to name a non-template.  [Example:
 | 
			
		||||
		// 		class X {
 | 
			
		||||
		// 		public:
 | 
			
		||||
		// 			   template<size_t> X* alloc();
 | 
			
		||||
		// 		};
 | 
			
		||||
		// 		void f(X* p)
 | 
			
		||||
		// 		{
 | 
			
		||||
		// 			   X* p1 = p->alloc<200>();
 | 
			
		||||
		// 					 // ill-formed: < means less than
 | 
			
		||||
		// 			   X* p2 = p->template alloc<200>();
 | 
			
		||||
		// 					 // fine: < starts explicit qualification
 | 
			
		||||
		// 		}
 | 
			
		||||
		// --end example]
 | 
			
		||||
		//
 | 
			
		||||
		// WATCOM doesn't support this qualifier.
 | 
			
		||||
 | 
			
		||||
		#define QSE_CPP_TEMPLATE_QUALIFIER
 | 
			
		||||
		#define QSE_CPP_NO_OPERATOR_DELETE_OVERLOADING 1
 | 
			
		||||
	#else
 | 
			
		||||
 | 
			
		||||
		#define QSE_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->~class_name())
 | 
			
		||||
		#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete ((ptr), (arg1)))
 | 
			
		||||
		#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete((ptr), (arg1)))
 | 
			
		||||
		#define QSE_CPP_TEMPLATE_QUALIFIER template
 | 
			
		||||
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
 | 
			
		||||
	template<typename T> struct QSE_CPP_RMREF      { typedef T Type; };
 | 
			
		||||
	template<typename T> struct QSE_CPP_RMREF<T&>  { typedef T Type; };
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,9 @@
 | 
			
		||||
#ifndef _QSE_CMN_ARRAY_HPP_
 | 
			
		||||
#define _QSE_CMN_ARRAY_HPP_
 | 
			
		||||
 | 
			
		||||
/// \file
 | 
			
		||||
/// Provide the Array class.
 | 
			
		||||
 | 
			
		||||
#include <qse/Growable.hpp>
 | 
			
		||||
#include <qse/cmn/Mmged.hpp>
 | 
			
		||||
 | 
			
		||||
@ -66,6 +69,9 @@ struct ArrayResizer
 | 
			
		||||
 | 
			
		||||
///
 | 
			
		||||
/// The Array class provides a dynamically resized array.
 | 
			
		||||
///
 | 
			
		||||
/// With C++11, the Array class move-contructs values in various context.
 | 
			
		||||
/// The move constructor of the value must not raise an exception.
 | 
			
		||||
/// 
 | 
			
		||||
template <typename T, typename POSITIONER = ArrayPositioner<T>, typename RESIZER = ArrayResizer >
 | 
			
		||||
class Array: public Mmged, public Growable
 | 
			
		||||
@ -122,7 +128,7 @@ public:
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
 | 
			
		||||
	Array (SelfType&& array):
 | 
			
		||||
		Mmged(array.getMmgr()),
 | 
			
		||||
@ -162,7 +168,7 @@ public:
 | 
			
		||||
		return *this;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
	SelfType& operator= (SelfType&& array)
 | 
			
		||||
	{
 | 
			
		||||
		if (this != &array)
 | 
			
		||||
@ -230,7 +236,7 @@ protected:
 | 
			
		||||
		return tmp;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
	T* clone_buffer_by_moving (T* srcbuf, qse_size_t capa, qse_size_t cnt)
 | 
			
		||||
	{
 | 
			
		||||
		QSE_ASSERT (capa > 0);
 | 
			
		||||
@ -262,7 +268,8 @@ protected:
 | 
			
		||||
				// if move-contruction ended up with an exception,
 | 
			
		||||
				// the original array can get into an unknown state eventually.
 | 
			
		||||
				// i don't attempt to restore the moved object as an exception
 | 
			
		||||
				// may be raised during restoration.
 | 
			
		||||
				// may be raised during restoration. i don't implement noexcept
 | 
			
		||||
				// check yet.
 | 
			
		||||
				//
 | 
			
		||||
				// TODO: reconsider if this unwinding is needed
 | 
			
		||||
				//try { new((QSE::Mmgr*)QSE_NULL, &srcbuf[index]) T((T&&)tmp[index]); }
 | 
			
		||||
@ -299,7 +306,7 @@ protected:
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
	void put_item_by_moving (qse_size_t index, T&& value)
 | 
			
		||||
	{
 | 
			
		||||
		if (index >= this->count)
 | 
			
		||||
@ -425,7 +432,7 @@ public:
 | 
			
		||||
		this->update (index, value);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
	void setValueAt (qse_size_t index, T&& value)
 | 
			
		||||
	{
 | 
			
		||||
		this->update (index, QSE_CPP_RVREF(value));
 | 
			
		||||
@ -459,7 +466,7 @@ protected:
 | 
			
		||||
			// shift the existing elements to the back by one slot.
 | 
			
		||||
			for (qse_size_t i = this->count; i > index; i--) 
 | 
			
		||||
			{
 | 
			
		||||
			#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
			#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
				this->put_item_by_moving (i, QSE_CPP_RVREF(this->buffer[i - 1])); 
 | 
			
		||||
			#else
 | 
			
		||||
				this->put_item (i, this->buffer[i - 1]); 
 | 
			
		||||
@ -496,7 +503,7 @@ public:
 | 
			
		||||
		return index;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
	qse_size_t insert (qse_size_t index, T&& value)
 | 
			
		||||
	{
 | 
			
		||||
		// Unlike insert() in RedBlackTree and HashList,
 | 
			
		||||
@ -523,7 +530,7 @@ public:
 | 
			
		||||
		return index;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
	qse_size_t update (qse_size_t index, T&& value)
 | 
			
		||||
	{
 | 
			
		||||
		QSE_ASSERT (index < this->count);
 | 
			
		||||
@ -541,7 +548,7 @@ public:
 | 
			
		||||
			return this->insert (index, value);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
	qse_size_t upsert (qse_size_t index, T&& value)
 | 
			
		||||
	{
 | 
			
		||||
		if (index < this->count)
 | 
			
		||||
@ -559,7 +566,7 @@ public:
 | 
			
		||||
			return this->insert (index, value);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
	qse_size_t ensert (qse_size_t index, T&& value)
 | 
			
		||||
	{
 | 
			
		||||
		if (index < this->count)
 | 
			
		||||
@ -693,7 +700,7 @@ public:
 | 
			
		||||
			qse_size_t cnt = this->count;
 | 
			
		||||
			if (cnt > capa) cnt = capa;
 | 
			
		||||
 | 
			
		||||
		#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
		#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
			T* tmp = this->clone_buffer_by_moving (this->buffer, capa, cnt);
 | 
			
		||||
		#else
 | 
			
		||||
			T* tmp = this->clone_buffer (this->buffer, capa, cnt);
 | 
			
		||||
 | 
			
		||||
@ -135,7 +135,7 @@ public:
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
	BinaryHeap (SelfType& heap): ParentType (heap)
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
@ -154,7 +154,7 @@ public:
 | 
			
		||||
		return *this;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
	SelfType& operator= (SelfType&& heap)
 | 
			
		||||
	{
 | 
			
		||||
		if (this != &heap)
 | 
			
		||||
@ -212,7 +212,7 @@ public:
 | 
			
		||||
		return this->sift_up(index);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
	qse_size_t insert (T&& value)
 | 
			
		||||
	{
 | 
			
		||||
		qse_size_t index = this->count;
 | 
			
		||||
@ -234,7 +234,7 @@ public:
 | 
			
		||||
		return (this->greater_than(value, old))? this->sift_up(index): this->sift_down(index);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE)
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE)
 | 
			
		||||
	qse_size_t update (qse_size_t index, T&& value)
 | 
			
		||||
	{
 | 
			
		||||
		T old = QSE_CPP_RVREF(this->buffer[index]);
 | 
			
		||||
 | 
			
		||||
@ -239,7 +239,7 @@ public:
 | 
			
		||||
		//if (!node) return QSE_NULL;
 | 
			
		||||
		//return &node->value;
 | 
			
		||||
 | 
			
		||||
		PairNode* node = this->pair_list.template heterofindNode<K,HASHER,PairHeteroEqualer> (key);
 | 
			
		||||
		PairNode* node = this->pair_list.QSE_CPP_TEMPLATE_QUALIFIER heterofindNode<K,HASHER,PairHeteroEqualer> (key);
 | 
			
		||||
		if (!node) return QSE_NULL;
 | 
			
		||||
		Pair& pair = node->value;
 | 
			
		||||
		pair.value = value;
 | 
			
		||||
@ -249,11 +249,7 @@ public:
 | 
			
		||||
	Pair* search (const K& key)
 | 
			
		||||
	{
 | 
			
		||||
		//PairNode* node = this->pair_list.search (Pair(key));
 | 
			
		||||
	#if defined(__WATCOMC__)
 | 
			
		||||
		PairNode* node = this->pair_list.heterofindNode<K,HASHER,PairHeteroEqualer> (key);
 | 
			
		||||
	#else
 | 
			
		||||
		PairNode* node = this->pair_list.template heterofindNode<K,HASHER,PairHeteroEqualer> (key);
 | 
			
		||||
	#endif
 | 
			
		||||
		PairNode* node = this->pair_list.QSE_CPP_TEMPLATE_QUALIFIER heterofindNode<K,HASHER,PairHeteroEqualer> (key);
 | 
			
		||||
		if (!node) return QSE_NULL;
 | 
			
		||||
		return &node->value;
 | 
			
		||||
	}
 | 
			
		||||
@ -261,22 +257,14 @@ public:
 | 
			
		||||
	int remove (const K& key)
 | 
			
		||||
	{
 | 
			
		||||
		//return this->pair_list.remove (Pair(key));
 | 
			
		||||
	#if defined(__WATCOMC__)
 | 
			
		||||
		return this->pair_list.heteroremove<K,HASHER,PairHeteroEqualer> (key);
 | 
			
		||||
	#else
 | 
			
		||||
		return this->pair_list.template heteroremove<K,HASHER,PairHeteroEqualer> (key);
 | 
			
		||||
	#endif
 | 
			
		||||
		return this->pair_list.QSE_CPP_TEMPLATE_QUALIFIER heteroremove<K,HASHER,PairHeteroEqualer> (key);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	template <typename MK, typename MHASHER, typename MEQUALER>
 | 
			
		||||
	Pair* heterosearch (const MK& key)
 | 
			
		||||
	{
 | 
			
		||||
		typedef MHeteroEqualer<MK,MEQUALER> MEqualer;
 | 
			
		||||
	#if defined(__WATCOMC__)
 | 
			
		||||
		PairNode* node = this->pair_list.heterosearch<MK,MHASHER,MEqualer> (key);
 | 
			
		||||
	#else
 | 
			
		||||
		PairNode* node = this->pair_list.template heterosearch<MK,MHASHER,MEqualer> (key);
 | 
			
		||||
	#endif
 | 
			
		||||
		PairNode* node = this->pair_list.QSE_CPP_TEMPLATE_QUALIFIER heterosearch<MK,MHASHER,MEqualer> (key);
 | 
			
		||||
		if (!node) return QSE_NULL;
 | 
			
		||||
		return &node->value;
 | 
			
		||||
	}
 | 
			
		||||
@ -285,7 +273,7 @@ public:
 | 
			
		||||
	const Pair* heterosearch (const MK& key) const
 | 
			
		||||
	{
 | 
			
		||||
		typedef MHeteroEqualer<MK,MEQUALER> MEqualer;
 | 
			
		||||
		PairNode* node = this->pair_list.template heterosearch<MK,MHASHER,MEqualer> (key);
 | 
			
		||||
		PairNode* node = this->pair_list.QSE_CPP_TEMPLATE_QUALIFIER heterosearch<MK,MHASHER,MEqualer> (key);
 | 
			
		||||
		if (!node) return QSE_NULL;
 | 
			
		||||
		return &node->value;
 | 
			
		||||
	}
 | 
			
		||||
@ -294,7 +282,7 @@ public:
 | 
			
		||||
	int heteroremove (const MK& key)
 | 
			
		||||
	{
 | 
			
		||||
		typedef MHeteroEqualer<MK,MEQUALER> MEqualer;
 | 
			
		||||
		return this->pair_list.template heteroremove<MK,MHASHER,MEqualer> (key);
 | 
			
		||||
		return this->pair_list.QSE_CPP_TEMPLATE_QUALIFIER heteroremove<MK,MHASHER,MEqualer> (key);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void clear (bool clear_mpool = false)
 | 
			
		||||
 | 
			
		||||
@ -176,7 +176,11 @@ QSE_END_NAMESPACE(QSE)
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT void* operator new (qse_size_t size, QSE::Mmgr* mmgr);
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_CPP_NO_OPERATOR_DELETE_OVERLOADING)
 | 
			
		||||
QSE_EXPORT void qse_operator_delete (void* ptr, QSE::Mmgr* mmgr);
 | 
			
		||||
#else
 | 
			
		||||
QSE_EXPORT void operator delete (void* ptr, QSE::Mmgr* mmgr);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT void* operator new (qse_size_t size, QSE::Mmgr* mmgr, void* existing_ptr);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -126,7 +126,11 @@ QSE_END_NAMESPACE(QSE)
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT void* operator new (qse_size_t size, QSE::Mpool* mp);
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_CPP_NO_OPERATOR_DELETE_OVERLOADING)
 | 
			
		||||
QSE_EXPORT void qse_operator_delete (void* ptr, QSE::Mpool* mp);
 | 
			
		||||
#else
 | 
			
		||||
QSE_EXPORT void operator delete (void* ptr, QSE::Mpool* mp);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT void* operator new (qse_size_t size, QSE::Mpool* mp, void* existing_ptr);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -206,7 +206,7 @@ public:
 | 
			
		||||
		//if (!node) return QSE_NULL;
 | 
			
		||||
		//return &node->value;
 | 
			
		||||
 | 
			
		||||
		PairNode* node = this->pair_tree.template heterofindNode<K,PairHeteroComparator> (key);
 | 
			
		||||
		PairNode* node = this->pair_tree.QSE_CPP_TEMPLATE_QUALIFIER heterofindNode<K,PairHeteroComparator> (key);
 | 
			
		||||
		if (!node) return QSE_NULL;
 | 
			
		||||
		Pair& pair = node->value;
 | 
			
		||||
		pair.value = value;
 | 
			
		||||
@ -216,7 +216,7 @@ public:
 | 
			
		||||
	Pair* search (const K& key)
 | 
			
		||||
	{
 | 
			
		||||
		//PairNode* node = this->pair_tree.update (Pair(key));
 | 
			
		||||
		PairNode* node = this->pair_tree.template heterofindNode<K,PairHeteroComparator> (key);
 | 
			
		||||
		PairNode* node = this->pair_tree.QSE_CPP_TEMPLATE_QUALIFIER heterofindNode<K,PairHeteroComparator> (key);
 | 
			
		||||
		if (!node) return QSE_NULL;
 | 
			
		||||
		return &node->value;
 | 
			
		||||
	}
 | 
			
		||||
@ -224,14 +224,14 @@ public:
 | 
			
		||||
	int remove (const K& key)
 | 
			
		||||
	{
 | 
			
		||||
		//return this->pair_tree.remove (Pair(key));
 | 
			
		||||
		return this->pair_tree.template heteroremove<K,PairHeteroComparator> (key);
 | 
			
		||||
		return this->pair_tree.QSE_CPP_TEMPLATE_QUALIFIER heteroremove<K,PairHeteroComparator> (key);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	template <typename MK, typename MCOMPARATOR>
 | 
			
		||||
	Pair* heterosearch (const MK& key)
 | 
			
		||||
	{
 | 
			
		||||
		typedef MHeteroComparator<MK,MCOMPARATOR> MComparator;
 | 
			
		||||
		PairNode* node = this->pair_tree.template heterosearch<MK,MComparator> (key);
 | 
			
		||||
		PairNode* node = this->pair_tree.QSE_CPP_TEMPLATE_QUALIFIER heterosearch<MK,MComparator> (key);
 | 
			
		||||
		if (!node) return QSE_NULL;
 | 
			
		||||
		return &node->value;
 | 
			
		||||
	}
 | 
			
		||||
@ -240,7 +240,7 @@ public:
 | 
			
		||||
	const Pair* heterosearch (const MK& key) const
 | 
			
		||||
	{
 | 
			
		||||
		typedef MHeteroComparator<MK,MCOMPARATOR> MComparator;
 | 
			
		||||
		PairNode* node = this->pair_tree.template heterosearch<MK,MComparator> (key);
 | 
			
		||||
		PairNode* node = this->pair_tree.QSE_CPP_TEMPLATE_QUALIFIER heterosearch<MK,MComparator> (key);
 | 
			
		||||
		if (!node) return QSE_NULL;
 | 
			
		||||
		return &node->value;
 | 
			
		||||
	}
 | 
			
		||||
@ -249,7 +249,7 @@ public:
 | 
			
		||||
	int heteroremove (const MK& key)
 | 
			
		||||
	{
 | 
			
		||||
		typedef MHeteroComparator<MK,MCOMPARATOR> MComparator;
 | 
			
		||||
		return this->pair_tree.template heteroremove<MK,MComparator> (key);
 | 
			
		||||
		return this->pair_tree.QSE_CPP_TEMPLATE_QUALIFIER heteroremove<MK,MComparator> (key);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void clear (bool clear_mpool = false)
 | 
			
		||||
 | 
			
		||||
@ -971,7 +971,7 @@ public:
 | 
			
		||||
	template <typename MT, typename MCOMPARATOR>
 | 
			
		||||
	int heteroremove (const MT& datum)
 | 
			
		||||
	{
 | 
			
		||||
		Node* node = this->template heterofind_node<MT,MCOMPARATOR> (datum);
 | 
			
		||||
		Node* node = this->QSE_CPP_TEMPLATE_QUALIFIER heterofind_node<MT,MCOMPARATOR> (datum);
 | 
			
		||||
		if (node == QSE_NULL) return -1;
 | 
			
		||||
 | 
			
		||||
		this->remove_node (node);
 | 
			
		||||
 | 
			
		||||
@ -75,7 +75,11 @@ void* operator new (qse_size_t size, QSE::Mmgr* mmgr)
 | 
			
		||||
	return mmgr->allocate (size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_CPP_NO_OPERATOR_DELETE_OVERLOADING)
 | 
			
		||||
void qse_operator_delete (void* ptr, QSE::Mmgr* mmgr)
 | 
			
		||||
#else
 | 
			
		||||
void operator delete (void* ptr, QSE::Mmgr* mmgr)
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	mmgr->dispose (ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -196,21 +196,26 @@ void* operator new (qse_size_t size, QSE::Mpool* mp)
 | 
			
		||||
			// is never reached.
 | 
			
		||||
			goto use_mmgr;
 | 
			
		||||
		}
 | 
			
		||||
		return mp->allocate ();
 | 
			
		||||
		return mp->allocate();
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
	use_mmgr:
 | 
			
		||||
		// when the memory pool is not enabled, it goes through 
 | 
			
		||||
		// the memory manager directly and it honors the size argument.
 | 
			
		||||
		return ::operator new(size, mp->getMmgr());
 | 
			
		||||
		//return ::operator new(size, mp->getMmgr());
 | 
			
		||||
		return mp->getMmgr()->allocate(size);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_CPP_NO_OPERATOR_DELETE_OVERLOADING)
 | 
			
		||||
void qse_operator_delete (void* ptr, QSE::Mpool* mp)
 | 
			
		||||
#else
 | 
			
		||||
void operator delete (void* ptr, QSE::Mpool* mp)
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	if (mp->isEnabled()) mp->dispose (ptr);
 | 
			
		||||
	else ::operator delete (ptr, mp->getMmgr());
 | 
			
		||||
	if (mp->isEnabled()) mp->dispose(ptr);
 | 
			
		||||
	else mp->getMmgr()->dispose(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void* operator new (qse_size_t size, QSE::Mpool* mp, void* existing_ptr)
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,8 @@ printf ("constructor %d\n", q);
 | 
			
		||||
printf ("copy constructor %d\n", *q.x);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE) 
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE) 
 | 
			
		||||
	Julia (Julia&& q)
 | 
			
		||||
	{
 | 
			
		||||
printf ("move constructor %d\n", *q.x);
 | 
			
		||||
@ -50,7 +51,7 @@ printf ("operator= %d\n", *q.x);
 | 
			
		||||
		return *this;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE) 
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE) 
 | 
			
		||||
	Julia& operator= (Julia&& q)
 | 
			
		||||
	{
 | 
			
		||||
		if (this != &q)
 | 
			
		||||
@ -68,9 +69,11 @@ printf ("move operator= %d\n", *q.x);
 | 
			
		||||
	int* x;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef QSE::Array<Julia> JuliaArray;
 | 
			
		||||
 | 
			
		||||
int main ()
 | 
			
		||||
{
 | 
			
		||||
	QSE::Array<Julia> a0;
 | 
			
		||||
	JuliaArray a0;
 | 
			
		||||
 | 
			
		||||
	for (int i = 0; i < 256; i++)
 | 
			
		||||
	{
 | 
			
		||||
@ -83,10 +86,10 @@ int main ()
 | 
			
		||||
	a0.remove (2, 5);
 | 
			
		||||
 | 
			
		||||
	a0.update (5, Julia(9999));
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE) 
 | 
			
		||||
	QSE::Array<Julia> a1 ((QSE::Array<Julia>&&)a0);
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE) 
 | 
			
		||||
	JuliaArray a1 ((JuliaArray&&)a0);
 | 
			
		||||
#else
 | 
			
		||||
	QSE::Array<Julia> a1 (a0);
 | 
			
		||||
	JuliaArray a1 (a0);
 | 
			
		||||
#endif
 | 
			
		||||
	printf ("OK: %d %d\n", (int)a0.getSize(), (int)a1.getSize());
 | 
			
		||||
 | 
			
		||||
@ -96,7 +99,7 @@ int main ()
 | 
			
		||||
		printf ("ITEM: %d => %d\n", (int)i, *a1[i].x);
 | 
			
		||||
	}
 | 
			
		||||
	printf ("----------------\n");
 | 
			
		||||
	a1.rotate (QSE::Array<Julia>::ROTATE_LEFT, 2);
 | 
			
		||||
	a1.rotate (JuliaArray::ROTATE_LEFT, 2);
 | 
			
		||||
	for (qse_size_t i = 0; i < a1.getSize(); i++)
 | 
			
		||||
	{
 | 
			
		||||
		printf ("ITEM: %d => %d\n", (int)i, *a1[i].x);
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ public:
 | 
			
		||||
		this->x = new int (*q.x);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE) 
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE) 
 | 
			
		||||
	Julia (Julia&& q)
 | 
			
		||||
	{
 | 
			
		||||
		this->x = q.x;
 | 
			
		||||
@ -46,7 +46,7 @@ public:
 | 
			
		||||
		return *this;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_ENABLE_CPP11_MOVE) 
 | 
			
		||||
#if defined(QSE_CPP_ENABLE_CPP1_MOVE) 
 | 
			
		||||
	Julia& operator= (Julia&& q)
 | 
			
		||||
	{
 | 
			
		||||
		if (this != &q)
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user