mirror of
				https://github.com/Telecominfraproject/wlan-cloud-lib-poco.git
				synced 2025-10-30 18:17:50 +00:00 
			
		
		
		
	synchronized trunk
This commit is contained in:
		| @@ -1,7 +1,7 @@ | ||||
| // | ||||
| // LinearHashTable.h | ||||
| // | ||||
| // $Id: //poco/Main/Foundation/include/Poco/LinearHashTable.h#11 $ | ||||
| // $Id: //poco/Main/Foundation/include/Poco/LinearHashTable.h#13 $ | ||||
| // | ||||
| // Library: Foundation | ||||
| // Package: Hashing | ||||
| @@ -86,40 +86,38 @@ public: | ||||
| 	typedef HashFunc            Hash; | ||||
| 	typedef std::vector<Value>  Bucket; | ||||
| 	typedef std::vector<Bucket> BucketVec; | ||||
| 	 | ||||
| 	template <class VecIt, class BuckIt> | ||||
| 	class BasicConstIterator; | ||||
| 	 | ||||
| 	template <class VecIt, class BuckIt> | ||||
| 	class BasicIterator | ||||
| 	typedef typename Bucket::iterator    BucketIterator; | ||||
| 	typedef typename BucketVec::iterator BucketVecIterator; | ||||
|  | ||||
| 	class ConstIterator | ||||
| 	{ | ||||
| 	public: | ||||
| 		BasicIterator() | ||||
| 		ConstIterator() | ||||
| 		{ | ||||
| 		} | ||||
| 		 | ||||
| 		BasicIterator(const VecIt& vecIt, const VecIt& endIt, const BuckIt& buckIt): | ||||
| 		ConstIterator(const BucketVecIterator& vecIt, const BucketVecIterator& endIt, const BucketIterator& buckIt): | ||||
| 			_vecIt(vecIt), | ||||
| 			_endIt(endIt), | ||||
| 			_buckIt(buckIt) | ||||
| 		{ | ||||
| 		} | ||||
|  | ||||
| 		BasicIterator(const BasicIterator& it): | ||||
| 		ConstIterator(const ConstIterator& it): | ||||
| 			_vecIt(it._vecIt), | ||||
| 			_endIt(it._endIt), | ||||
| 			_buckIt(it._buckIt) | ||||
| 		{ | ||||
| 		} | ||||
| 		 | ||||
| 		BasicIterator& operator = (const BasicIterator& it) | ||||
| 		ConstIterator& operator = (const ConstIterator& it) | ||||
| 		{ | ||||
| 			BasicIterator tmp(it); | ||||
| 			ConstIterator tmp(it); | ||||
| 			swap(tmp); | ||||
| 			return *this; | ||||
| 		} | ||||
| 		 | ||||
| 		void swap(BasicIterator& it) | ||||
| 		void swap(ConstIterator& it) | ||||
| 		{ | ||||
| 			using std::swap; | ||||
| 			swap(_vecIt, it._vecIt); | ||||
| @@ -127,169 +125,119 @@ public: | ||||
| 			swap(_buckIt, it._buckIt); | ||||
| 		} | ||||
| 		 | ||||
| 		bool operator == (const BasicIterator& it) const | ||||
| 		bool operator == (const ConstIterator& it) const | ||||
| 		{ | ||||
| 			return _vecIt == it._vecIt && (_vecIt == _endIt || _buckIt == it._buckIt); | ||||
| 		} | ||||
|  | ||||
| 		bool operator != (const BasicIterator& it) const | ||||
| 		bool operator != (const ConstIterator& it) const | ||||
| 		{ | ||||
| 			return _vecIt != it._vecIt || (_vecIt != _endIt && _buckIt != it._buckIt); | ||||
| 		} | ||||
| 		 | ||||
| 		typename Bucket::value_type& operator * () | ||||
| 		const typename Bucket::value_type& operator * () const | ||||
| 		{ | ||||
| 			return *_buckIt; | ||||
| 		} | ||||
|  | ||||
| 		const typename Bucket::value_type* operator -> () const | ||||
| 		{ | ||||
| 			return &*_buckIt; | ||||
| 		} | ||||
| 		 | ||||
| 		ConstIterator& operator ++ () // prefix | ||||
| 		{ | ||||
| 			if (_vecIt != _endIt) | ||||
| 			{ | ||||
| 				++_buckIt; | ||||
| 				while (_vecIt != _endIt && _buckIt == _vecIt->end()) | ||||
| 				{ | ||||
| 					++_vecIt; | ||||
| 					if (_vecIt != _endIt) _buckIt = _vecIt->begin(); | ||||
| 				} | ||||
| 			} | ||||
| 			return *this; | ||||
| 		} | ||||
| 		 | ||||
| 		ConstIterator operator ++ (int) // postfix | ||||
| 		{ | ||||
| 			ConstIterator tmp(*this); | ||||
| 			++*this; | ||||
| 			return tmp; | ||||
| 		} | ||||
| 		 | ||||
| 	protected: | ||||
| 		BucketVecIterator _vecIt; | ||||
| 		BucketVecIterator _endIt; | ||||
| 		BucketIterator    _buckIt; | ||||
| 		 | ||||
| 		friend class LinearHashTable; | ||||
| 	}; | ||||
| 	 | ||||
| 	class Iterator: public ConstIterator | ||||
| 	{ | ||||
| 	public: | ||||
| 		Iterator() | ||||
| 		{ | ||||
| 		} | ||||
| 		 | ||||
| 		Iterator(const BucketVecIterator& vecIt, const BucketVecIterator& endIt, const BucketIterator& buckIt): | ||||
| 			ConstIterator(vecIt, endIt, buckIt) | ||||
| 		{ | ||||
| 		} | ||||
|  | ||||
| 		Iterator(const Iterator& it): | ||||
| 			ConstIterator(it) | ||||
| 		{ | ||||
| 		} | ||||
| 		 | ||||
| 		Iterator& operator = (const Iterator& it) | ||||
| 		{ | ||||
| 			Iterator tmp(it); | ||||
| 			swap(tmp); | ||||
| 			return *this; | ||||
| 		} | ||||
| 		 | ||||
| 		void swap(Iterator& it) | ||||
| 		{ | ||||
| 			ConstIterator::swap(it); | ||||
| 		} | ||||
| 				 | ||||
| 		typename Bucket::value_type& operator * () | ||||
| 		{ | ||||
| 			return *this->_buckIt; | ||||
| 		} | ||||
|  | ||||
| 		const typename Bucket::value_type& operator * () const | ||||
| 		{ | ||||
| 			return *_buckIt; | ||||
| 			return *this->_buckIt; | ||||
| 		} | ||||
|  | ||||
| 		typename Bucket::value_type* operator -> () | ||||
| 		{ | ||||
| 			return &*_buckIt; | ||||
| 			return &*this->_buckIt; | ||||
| 		} | ||||
|  | ||||
| 		const typename Bucket::value_type* operator -> () const | ||||
| 		{ | ||||
| 			return &*_buckIt; | ||||
| 			return &*this->_buckIt; | ||||
| 		} | ||||
| 		 | ||||
| 		BasicIterator& operator ++ () // prefix | ||||
| 		Iterator& operator ++ () // prefix | ||||
| 		{ | ||||
| 			if (_vecIt != _endIt) | ||||
| 			{ | ||||
| 				++_buckIt; | ||||
| 				while (_vecIt != _endIt && _buckIt == _vecIt->end()) | ||||
| 				{ | ||||
| 					++_vecIt; | ||||
| 					if (_vecIt != _endIt) _buckIt = _vecIt->begin(); | ||||
| 				} | ||||
| 			} | ||||
| 			ConstIterator::operator ++ (); | ||||
| 			return *this; | ||||
| 		} | ||||
| 		 | ||||
| 		BasicIterator operator ++ (int) // postfix | ||||
| 		Iterator operator ++ (int) // postfix | ||||
| 		{ | ||||
| 			BasicIterator tmp(*this); | ||||
| 			Iterator tmp(*this); | ||||
| 			++*this; | ||||
| 			return tmp; | ||||
| 		} | ||||
| 		 | ||||
| 	private: | ||||
| 		VecIt  _vecIt; | ||||
| 		VecIt  _endIt; | ||||
| 		BuckIt _buckIt; | ||||
| 		 | ||||
| 		friend class LinearHashTable; | ||||
| 		template <class, class> friend class BasicConstIterator; | ||||
| 	}; | ||||
|  | ||||
| 	typedef BasicIterator<typename BucketVec::iterator, typename Bucket::iterator> Iterator; | ||||
|  | ||||
| 	template <class VecIt, class BuckIt> | ||||
| 	class BasicConstIterator | ||||
| 	{ | ||||
| 	public: | ||||
| 		BasicConstIterator() | ||||
| 		{ | ||||
| 		} | ||||
| 		 | ||||
| 		BasicConstIterator(const VecIt& vecIt, const VecIt& endIt, const BuckIt& buckIt): | ||||
| 			_vecIt(vecIt), | ||||
| 			_endIt(endIt), | ||||
| 			_buckIt(buckIt) | ||||
| 		{ | ||||
| 		} | ||||
|  | ||||
| 		BasicConstIterator(const BasicConstIterator& it): | ||||
| 			_vecIt(it._vecIt), | ||||
| 			_endIt(it._endIt), | ||||
| 			_buckIt(it._buckIt) | ||||
| 		{ | ||||
| 		} | ||||
|  | ||||
| 		BasicConstIterator(const Iterator& it): | ||||
| 			_vecIt(it._vecIt), | ||||
| 			_endIt(it._endIt), | ||||
| 			_buckIt(it._buckIt) | ||||
| 		{ | ||||
| 		} | ||||
| 		 | ||||
| 		BasicConstIterator& operator = (const BasicConstIterator& it) | ||||
| 		{ | ||||
| 			BasicConstIterator tmp(it); | ||||
| 			swap(tmp); | ||||
| 			return *this; | ||||
| 		} | ||||
|  | ||||
| 		BasicConstIterator& operator = (const Iterator& it) | ||||
| 		{ | ||||
| 			BasicConstIterator tmp(it); | ||||
| 			swap(tmp); | ||||
| 			return *this; | ||||
| 		} | ||||
| 		 | ||||
| 		void swap(BasicConstIterator& it) | ||||
| 		{ | ||||
| 			using std::swap; | ||||
| 			swap(_vecIt, it._vecIt); | ||||
| 			swap(_endIt, it._endIt); | ||||
| 			swap(_buckIt, it._buckIt); | ||||
| 		} | ||||
| 		 | ||||
| 		bool operator == (const BasicConstIterator& it) const | ||||
| 		{ | ||||
| 			return _vecIt == it._vecIt && (_vecIt == _endIt || _buckIt == it._buckIt); | ||||
| 		} | ||||
|  | ||||
| 		bool operator != (const BasicConstIterator& it) const | ||||
| 		{ | ||||
| 			return _vecIt != it._vecIt || (_vecIt != _endIt && _buckIt != it._buckIt); | ||||
| 		} | ||||
| 		 | ||||
| 		const typename Bucket::value_type& operator * () const | ||||
| 		{ | ||||
| 			return *_buckIt; | ||||
| 		} | ||||
|  | ||||
| 		const typename Bucket::value_type* operator -> () const | ||||
| 		{ | ||||
| 			return &*_buckIt; | ||||
| 		} | ||||
| 		 | ||||
| 		BasicConstIterator& operator ++ () // prefix | ||||
| 		{ | ||||
| 			if (_vecIt != _endIt) | ||||
| 			{ | ||||
| 				++_buckIt; | ||||
| 				while (_vecIt != _endIt && _buckIt == _vecIt->end()) | ||||
| 				{ | ||||
| 					++_vecIt; | ||||
| 					if (_vecIt != _endIt) _buckIt = _vecIt->begin(); | ||||
| 				} | ||||
| 			} | ||||
| 			return *this; | ||||
| 		} | ||||
| 		 | ||||
| 		BasicConstIterator operator ++ (int) // postfix | ||||
| 		{ | ||||
| 			BasicConstIterator tmp(*this); | ||||
| 			++*this; | ||||
| 			return tmp; | ||||
| 		} | ||||
| 		 | ||||
| 	private: | ||||
| 		VecIt  _vecIt; | ||||
| 		VecIt  _endIt; | ||||
| 		BuckIt _buckIt; | ||||
| 		 | ||||
| 		friend class LinearHashTable; | ||||
| 	}; | ||||
|  | ||||
| 	typedef BasicConstIterator<typename BucketVec::const_iterator, typename Bucket::const_iterator> ConstIterator; | ||||
| 	 | ||||
| 	LinearHashTable(std::size_t initialReserve = 64):  | ||||
| 		_split(0), | ||||
| @@ -336,8 +284,8 @@ public: | ||||
| 	ConstIterator begin() const | ||||
| 		/// Returns an iterator pointing to the first entry, if one exists. | ||||
| 	{ | ||||
| 		typename BucketVec::const_iterator it  = _buckets.begin(); | ||||
| 		typename BucketVec::const_iterator end = _buckets.end(); | ||||
| 		BucketVecIterator it(_buckets.begin()); | ||||
| 		BucketVecIterator end(_buckets.end()); | ||||
| 		while (it != end && it->empty()) | ||||
| 		{ | ||||
| 			++it; | ||||
| @@ -357,8 +305,8 @@ public: | ||||
| 	Iterator begin() | ||||
| 		/// Returns an iterator pointing to the first entry, if one exists. | ||||
| 	{ | ||||
| 		typename BucketVec::iterator it  = _buckets.begin(); | ||||
| 		typename BucketVec::iterator end = _buckets.end(); | ||||
| 		BucketVecIterator it(_buckets.begin()); | ||||
| 		BucketVecIterator end(_buckets.end()); | ||||
| 		while (it != end && it->empty()) | ||||
| 		{ | ||||
| 			++it; | ||||
| @@ -379,8 +327,8 @@ public: | ||||
| 		/// Finds an entry in the table. | ||||
| 	{ | ||||
| 		std::size_t addr = bucketAddress(value); | ||||
| 		typename BucketVec::const_iterator it  = _buckets.begin() + addr; | ||||
| 		typename Bucket::const_iterator buckIt = std::find(it->begin(), it->end(), value); | ||||
| 		BucketVecIterator it(_buckets.begin() + addr); | ||||
| 		BucketIterator buckIt(std::find(it->begin(), it->end(), value)); | ||||
| 		if (buckIt != it->end()) | ||||
| 			return ConstIterator(it, _buckets.end(), buckIt); | ||||
| 		else | ||||
| @@ -391,8 +339,8 @@ public: | ||||
| 		/// Finds an entry in the table. | ||||
| 	{ | ||||
| 		std::size_t addr = bucketAddress(value); | ||||
| 		typename BucketVec::iterator it  = _buckets.begin() + addr; | ||||
| 		typename Bucket::iterator buckIt = std::find(it->begin(), it->end(), value); | ||||
| 		BucketVecIterator it(_buckets.begin() + addr); | ||||
| 		BucketIterator buckIt(std::find(it->begin(), it->end(), value)); | ||||
| 		if (buckIt != it->end()) | ||||
| 			return Iterator(it, _buckets.end(), buckIt); | ||||
| 		else | ||||
| @@ -418,8 +366,8 @@ public: | ||||
| 	{ | ||||
| 		split(); | ||||
| 		std::size_t addr = bucketAddress(value); | ||||
| 		typename BucketVec::iterator it = _buckets.begin() + addr; | ||||
| 		typename Bucket::iterator buckIt = std::find(it->begin(), it->end(), value); | ||||
| 		BucketVecIterator it(_buckets.begin() + addr); | ||||
| 		BucketIterator buckIt(std::find(it->begin(), it->end(), value)); | ||||
| 		if (buckIt == it->end()) | ||||
| 		{ | ||||
| 			buckIt = it->insert(buckIt, value); | ||||
| @@ -491,7 +439,7 @@ protected: | ||||
| 		_buckets.push_back(tmp); | ||||
| 		_buckets[_split].swap(tmp); | ||||
| 		++_split; | ||||
| 		for (typename Bucket::iterator it = tmp.begin(); it != tmp.end(); ++it) | ||||
| 		for (BucketIterator it = tmp.begin(); it != tmp.end(); ++it) | ||||
| 		{ | ||||
| 			using std::swap; | ||||
| 			std::size_t addr = bucketAddress(*it); | ||||
| @@ -511,7 +459,7 @@ protected: | ||||
| 		Bucket tmp; | ||||
| 		tmp.swap(_buckets.back()); | ||||
| 		_buckets.pop_back(); | ||||
| 		for (typename Bucket::iterator it = tmp.begin(); it != tmp.end(); ++it) | ||||
| 		for (BucketIterator it = tmp.begin(); it != tmp.end(); ++it) | ||||
| 		{ | ||||
| 			using std::swap; | ||||
| 			std::size_t addr = bucketAddress(*it); | ||||
| @@ -528,7 +476,9 @@ protected: | ||||
| 	} | ||||
| 	 | ||||
| private: | ||||
| 	BucketVec   _buckets; | ||||
| 	// Evil hack: _buckets must be mutable because both ConstIterator and Iterator hold  | ||||
| 	// ordinary iterator's (not const_iterator's). | ||||
| 	mutable BucketVec _buckets; | ||||
| 	std::size_t _split; | ||||
| 	std::size_t _front; | ||||
| 	std::size_t _size; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Guenter Obiltschnig
					Guenter Obiltschnig