亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gacatalogue.h

?? 遺傳算法做的排課系統
?? H
字號:

#ifndef __GA_CATALOGUE_H__
#define __GA_CATALOGUE_H__

#include <utility>
#include <hash_map>

#include "..\ExportImport.h"
#include "..\CallConvention.h"
#include "..\Threading\GaThreading.h"

using namespace stdext;
using namespace std;

namespace Common
{
	template <typename T>
	class GaCatalogue;

	// Entry of catalogue
	template <typename T>
	class GaCatalogueEntry
	{
	friend class GaCatalogue<T>;

	private:

		// Name of entry
		char* _name;

		// Length of name
		int _nameLength;

		// Pointer to the data
		T* _data;

	public:

		// Initialization of the entry
		GaCatalogueEntry(const char* name,
						T& data)
		{
			if( name )
			{
				_nameLength = (int)strlen( name );

				// copy name
				_name = new char[ _nameLength + 1 ];
				strcpy( _name, name );

				_data = &data;

				return;
			}

			_name = NULL;
			_nameLength = 0;
			_data = NULL;
		};

		// Frees aquired resources
		~GaCatalogueEntry()
		{
			if( _name )
				delete[] _name;

			if( _data )
				delete _data;
		};

		// Returns name of entry
		const char* GACALL GetName() const
		{
			return _name;
		};

		// Sets name of entry
		void GACALL SetName(const char* name)
		{
			if( name )
			{
				if( _name )
					delete[] _name;

				_nameLength = strlen( name );

				// copy name
				_name = new char[ _nameLength + 1 ];
				strcpy( _name, name );
			}
		};

		// Returns length of entry's name
		int GACALL GetNameLength() const
		{
			return _nameLength;
		};

		// Returns pointer to data
		T& GACALL GetData() const
		{
			return *_data;
		};

		// Sets pointer to data
		void GACALL SetData(T& data)
		{
			_data = &data;
		};

	};// END CLASS DEFINITION GaCatalogueEntry


	// Manages catalogues and their entries
	template <typename T>
	class GaCatalogue
	{
		DEFINE_SYNC_CLASS

	private:

		// String comparator
		struct GaStringComparator
		{

		public:
			// comapration
			bool GACALL operator()(const char* left, const char* right) const
			{
				return strcmp( left, right ) == -1;
			}

		};

		// comarator for catalogue's hash map
		class GaCataolgueHashMapComparator
		{
		public:

			// parameters for hash table
			enum
			{
				bucket_size = 4,
				min_buckets = 8
			};	

			// construct with default comparator
			GaCataolgueHashMapComparator() : _comparator() { }

			// construct with _Pred comparator
			GaCataolgueHashMapComparator(GaStringComparator pred) : _comparator( pred ) { }

			// Hash function
			size_t GACALL operator()(const char* key) const
			{
				if( key == NULL )
					return 0;

				size_t t = 0;
				while( *key )
					t += *( key++ );

				ldiv_t rem = ldiv((long)t, 127773);
				rem.rem = 16807 * rem.rem - 2836 * rem.quot;
				if (rem.rem < 0)
					rem.rem += 2147483647;

				return ((size_t)rem.rem);
			}

			// Comparation
			bool GACALL operator()(const char* value1, const char* value2) const
			{
				return _comparator( value1, value2 );
			}

		private:

			// String comparator
			GaStringComparator _comparator;
		};

		typedef hash_map<const char*, GaCatalogueEntry<T>*, GaCataolgueHashMapComparator> GaCataolgueHashMap;

		// Global instance of the catalogue
		DLL_EXPORT
		static GaCatalogue<T>* _instance;

		// Catalogue's entries
		GaCataolgueHashMap _entries;

	public:

		// Returns global instance of the catalogue
		static GaCatalogue<T>& GACALL Instance()
		{
			return *_instance;
		}

		// Makes global instance of catalogue
		static void GACALL MakeInstance()
		{
			if( !_instance )
				_instance = new GaCatalogue();
		}

		// Frees memory used by global instance of catalogue
		static void GACALL FreeInstance()
		{
			if( _instance )
				delete _instance;
		}

		// Initialization of the catalgoue
		GaCatalogue() { }

		// Frees aquired resources
		~GaCatalogue()
		{
			for( GaCataolgueHashMap::const_iterator it = _entries.begin(); it != _entries.end(); it++ )
				delete it->second;

			_entries.clear();
		}

		// Adds entry to catalogue
		bool GACALL Register(const char* name,
				T& data,
				bool replace = false)
		{
			// no name - error?
			if( !name )
				return false;

			LOCK_THIS_OBJECT( lock );

			// does it exist?
			GaCataolgueHashMap::const_iterator it = _entries.find( name );
			bool exists = it != _entries.end();
			if( exists && !replace )
				// exists and no replacing - error
				return false;

			// erease if entry exists and replace is enabled
			if( exists && replace )
			{
				delete it->second;			
				_entries.erase( name );
			}

			// make entry for data and insert to catalogue
			GaCatalogueEntry<T>* new_entry = new GaCatalogueEntry<T>( name, data );
			return _entries.insert( pair<const char*, GaCatalogueEntry<T>*>( name, new_entry ) ).second;
		}

		// Remove entry from the catalgoue
		bool GACALL Unregister(const char* name)
		{
			LOCK_THIS_OBJECT( lock );

			bool removed = false;

			// exists?
			GaCataolgueHashMap::const_iterator it = _entries.find( name );
			if( it != _entries.end() )
			{
				// remove
				delete it->second;
				removed = _entries.erase( name ) > 0;
			}

			return removed;
		}

		// Returns pointer to entry (lookup by name)
		GaCatalogueEntry<T>* GACALL GetEntry(const char* name) const
		{
			LOCK_THIS_OBJECT( lock );

			// find entry and return pointer to entry
			GaCataolgueHashMap::const_iterator it = _entries.find( name );
			return it == _entries.end() ? NULL : it->second;
		}

		// Returns pointer to entry's data (lookup by name)
		T* GACALL GetEntryData(const char* name) const
		{
			LOCK_THIS_OBJECT( lock );
			
			// find entry and return pointer to data
			GaCataolgueHashMap::const_iterator it = _entries.find( name );
			return it == _entries.end() ? NULL : &it->second->GetData();
		}

		// Returns pointer to entry's data (lookup by name)
		T* GACALL operator [](const char* name) const
		{
			return GetEntryData( name );
		}

		// Returns first N names in catalogue
		// Caller must allocate memory for array of pointers to strings.
		// This method allocates memory for names but caller is responsible for it.
		// It also returns a number of names for which is memory allocated.
		bool GACALL GetKeys(char** names,
			   int& number) const
		{
			LOCK_THIS_OBJECT( lock );

			// no buffer or too small?
			if( !names || number < (int)_entries.size() )
			{
				// returns error and number of entries 
				number = _entries.size();
				return false;
			}

			// fill buffer with names
			int i = 0;
			for( GaCataolgueHashMap::const_iterator it = _entries.begin(); it != _entries.end(); it++, i++ )
			{
				names[ i ] = new char[ it->second->GetNameLength() + 1 ];
				strcpy( names[ i ], it->second->GetName() );
			}

			number = i;

			return true;
		}

		// Returns number of entries in catalogue
		int GACALL GetCount() const
		{
			LOCK_THIS_OBJECT( lock );

			return _entries.size();
		}

		// Returns TRUE if entry with given name exists in catalogue
		bool GACALL IsExist(const char* name) const
		{
			LOCK_THIS_OBJECT( lock );

			return _entries.count( name ) > 0;
		}

	};// END CLASS DEFINITION GaCatalogue

	#ifdef DLL_EXPORTING

	// Global instance of the catalogue
	template <typename T>
	GaCatalogue<T>* GaCatalogue<T>::_instance = NULL;

	#endif

} // Common

#endif //__GA_CATALOGUE_H__

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 成人午夜精品在线| 欧美日韩激情在线| 精品理论电影在线| 亚洲精品日韩一| 国产传媒一区在线| 91精品国产入口| 亚洲线精品一区二区三区八戒| 国产一区二区成人久久免费影院 | 日韩欧美一级精品久久| 国产精品美女视频| 久久国产精品免费| 欧美日韩国产高清一区| 亚洲视频资源在线| 成人午夜伦理影院| 久久久亚洲国产美女国产盗摄 | 亚洲综合色自拍一区| 国产成人8x视频一区二区| 日韩一级片网站| 视频精品一区二区| 欧美日韩一区二区欧美激情| 日韩毛片精品高清免费| va亚洲va日韩不卡在线观看| 精品av久久707| 麻豆一区二区在线| 欧美一级免费大片| 日韩成人av影视| 欧美另类高清zo欧美| 亚洲成人精品影院| 欧美视频完全免费看| 亚洲午夜免费电影| 欧美性感一区二区三区| 亚洲香蕉伊在人在线观| 欧美在线综合视频| 亚洲一区二区三区视频在线播放 | 久久久久久久久久久电影| 琪琪一区二区三区| 精品福利一区二区三区| 国产尤物一区二区| 国产欧美视频在线观看| 国产成a人亚洲精| 中文字幕精品一区二区三区精品 | 欧美日韩视频一区二区| 洋洋av久久久久久久一区| 欧美图区在线视频| 日韩av一二三| 久久丝袜美腿综合| 不卡一区二区三区四区| 最新成人av在线| 欧美日韩不卡一区二区| 日本美女一区二区三区| 久久影院视频免费| 成人av片在线观看| 亚洲一区二区五区| 日韩欧美卡一卡二| 国产69精品久久99不卡| 亚洲蜜臀av乱码久久精品蜜桃| 欧美在线视频不卡| 另类中文字幕网| 中文字幕在线免费不卡| 91成人免费在线| 蜜乳av一区二区| 国产精品国模大尺度视频| 欧美日韩黄色一区二区| 国产精品一区一区三区| 一区二区三区精密机械公司| 69av一区二区三区| 99在线精品观看| 亚洲电影一级黄| 久久久午夜精品| 欧美色图12p| 国产xxx精品视频大全| 伊人婷婷欧美激情| 久久久久亚洲蜜桃| 欧美三级视频在线| 国产99久久久国产精品潘金| 亚洲午夜精品网| 国产免费成人在线视频| 欧美人伦禁忌dvd放荡欲情| 国产精品一区二区久久精品爱涩| 亚洲综合久久久久| 中文字幕av免费专区久久| 91精品国产全国免费观看| 97久久超碰国产精品| 国产一区二区精品在线观看| 亚洲成人精品影院| 亚洲婷婷国产精品电影人久久| 久久综合久色欧美综合狠狠| 欧美日韩综合在线免费观看| 国产成人啪午夜精品网站男同| 午夜电影久久久| 亚洲九九爱视频| 国产精品久久综合| 精品福利一区二区三区免费视频| 欧美日韩国产首页| 欧美在线影院一区二区| 99热精品国产| 成人av电影观看| 国产东北露脸精品视频| 久久国产精品无码网站| 日韩av电影免费观看高清完整版| 亚洲人成人一区二区在线观看| 久久看人人爽人人| www久久精品| 日韩欧美电影一区| 日韩欧美www| 日韩欧美123| 日韩欧美国产综合在线一区二区三区| 欧美一a一片一级一片| 色综合天天综合网国产成人综合天| 国产精品资源在线| 国产成人在线视频网址| 国产综合久久久久久鬼色| 精品一区二区久久久| 激情文学综合插| 国产麻豆精品一区二区| 国产精选一区二区三区| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲天堂精品在线观看| 国产精品狼人久久影院观看方式| 久久精品亚洲精品国产欧美kt∨| 精品国产乱码久久久久久1区2区| 日韩欧美国产麻豆| 精品福利一区二区三区免费视频| ww久久中文字幕| 中文字幕不卡在线观看| 中文字幕亚洲区| 一区二区三区四区在线播放 | 国产精品亚洲专一区二区三区| 国产综合色在线| 成人黄色大片在线观看| 色婷婷激情综合| 欧美日本韩国一区二区三区视频| 制服丝袜成人动漫| 久久综合精品国产一区二区三区| 国产免费观看久久| 一区二区三区高清在线| 日韩国产在线观看一区| 国产一区二区不卡在线| 91蜜桃网址入口| 欧美高清一级片在线| 久久久综合精品| 一区2区3区在线看| 美女久久久精品| 91在线观看成人| 日韩欧美在线网站| 中文字幕一区二区视频| 午夜视频在线观看一区| 国产精品一区二区久激情瑜伽 | 亚洲一区二区三区四区中文字幕| 青青国产91久久久久久| 成人午夜大片免费观看| 欧美日韩小视频| 欧美国产精品v| 日韩精品成人一区二区在线| 国产精品系列在线播放| 在线精品视频小说1| 久久久国产综合精品女国产盗摄| 一区二区三区色| 国产剧情在线观看一区二区| 欧美体内she精高潮| 久久免费精品国产久精品久久久久| 亚洲免费av观看| 国产成人日日夜夜| 91精品午夜视频| 亚洲蜜臀av乱码久久精品蜜桃| 国内精品伊人久久久久av影院| 欧美在线一区二区三区| 国产欧美精品一区aⅴ影院| 亚洲va韩国va欧美va精品| 成人激情综合网站| 欧美成人精精品一区二区频| 亚洲欧洲日韩在线| 国产一区二区三区香蕉| 欧美男生操女生| 亚洲激情图片小说视频| 成人免费高清视频| 久久一日本道色综合| 欧美aⅴ一区二区三区视频| 欧洲一区在线观看| 亚洲色图另类专区| 成人免费视频一区| 久久综合九色综合欧美亚洲| 偷拍与自拍一区| 国产午夜亚洲精品理论片色戒| 日韩av在线播放中文字幕| 欧美在线免费观看视频| 亚洲欧美在线观看| 成人午夜短视频| 中文字幕精品在线不卡| 国产精品香蕉一区二区三区| 欧美va亚洲va在线观看蝴蝶网| 性做久久久久久免费观看欧美| 色综合久久久久久久| 中文字幕中文字幕一区二区| 国产不卡视频在线播放| 中文字幕国产精品一区二区| 成人中文字幕在线| 欧美国产精品一区二区三区| 岛国av在线一区|