示例#1
0
	StringHashMap<int> hm;
	TEST_EQUAL(hm.getSize(), 0)
	hm.insert("a", 0);
	TEST_EQUAL(hm.getSize(), 1)
	hm.insert("a", 1);
	TEST_EQUAL(hm.getSize(), 1)
	hm.insert("b", 0);
	TEST_EQUAL(hm.getSize(), 2)
	hm.insert("b", 1);
	TEST_EQUAL(hm.getSize(), 2)
RESULT

// testing inherited method function
CHECK([EXTRA] find(const String& key))
	StringHashMap<int> hm;
	TEST_EQUAL((hm.find("a") == hm.end()), true)
	hm.insert("a", 0);
	TEST_EQUAL((hm.find("a") == hm.end()), false)
	TEST_EQUAL((hm.find("a") == hm.begin()), true)
	hm.insert("b", 1);
	TEST_EQUAL((hm.find("a") == hm.end()), false)
	TEST_EQUAL((hm.find("b") == hm.end()), false)
	TEST_EQUAL((hm.find("c") == hm.end()), true)
RESULT

CHECK([EXTRA]StringHashMap::erase(const KeyType& key))
	StringHashMap<int> hm;
	hm.insert("a", 0);
	hm.insert("b", 1);
	hm.insert("c", 2);
	hm.erase("a");
示例#2
0
void Load_spec(const char* pcBuffer, size_t stLen, StringHashMap<string>& kTypeMap, string& outHeader, string& outSource)
{
	const char* pcStart = pcBuffer;
	char acLineBuffer[2048];

	SpecType eState = SPEC_TYPE_MAX;
	SpecType eLastState = SPEC_TYPE_MAX;

	string func_name;
	string return_name;
	vector<string> params;
	StringHashMap<pair<string,bool>> paramsType;

	int i(0);

	while(GetLine(&pcStart, acLineBuffer))
	{
		++i;
		switch(eState)
		{
		case SPEC_ENUM:
			if(eState == SPEC_ENUM)
			{
				if(acLineBuffer[0] == '\t')
				{
					char acMacro[1024], acValue[1024];
					GetDefine(acLineBuffer, acMacro, acValue);
					if(strcmp(acMacro, "use") != 0)
					{
						outHeader += "#ifndef ";
						outHeader += bigPre;
						outHeader += acMacro;
						outHeader += "\n#define ";
						outHeader += bigPre;
						outHeader += acMacro;
						outHeader += " ";
						outHeader += acValue;
						outHeader += "\n#endif\n\n";
					}
					break;
				}
				else
				{
					eState = SPEC_TYPE_MAX;
					eLastState = SPEC_ENUM;
				}
			}
		case SPEC_DEFINE:
			if(eState == SPEC_DEFINE)
			{
				if(acLineBuffer[0] == '\t')
				{
					char acMacro[1024], acValue[1024];
					GetDefine(acLineBuffer, acMacro, acValue);
					if(strcmp(acMacro, "use") != 0)
					{
						outHeader += "#ifndef ";
						outHeader += bigPre;
						outHeader += acMacro;
						outHeader += "\n#define ";
						outHeader += bigPre;
						outHeader += acMacro;
						outHeader += " ";
						outHeader += acValue;
						outHeader += "\n#endif\n\n";
					}
					break;
				}
				else
				{
					eState = SPEC_TYPE_MAX;
					eLastState = SPEC_DEFINE;
				}
			}
		case SPEC_FUNC:
			if(eState == SPEC_FUNC)
			{
				if(acLineBuffer[0] == '\t')
				{
					char acWord0[128], acWord1[128], acWord2[128];
					char* pcSrc;
					char* pcDst;
					{
						pcSrc = acLineBuffer;
						pcDst = acWord0;
						while(*pcSrc == ' ' || *pcSrc == '\t')
						{
							++pcSrc;
						}
						while(*pcSrc != ' ' && *pcSrc != '\t' && *pcSrc != '\0')
						{
							*pcDst = *pcSrc;
							++pcDst;
							++pcSrc;
						}
						*pcDst = 0;
					}
					StringHashMap<FuncType>::iterator it = func_Type.find(acWord0);
					if(it != func_Type.end())
					{
						switch(it->second)
						{
						case FUNC_RETURN:
							{
								pcDst = acWord1;
								while(*pcSrc == ' ' || *pcSrc == '\t')
								{
									++pcSrc;
								}
								while(*pcSrc != ' ' && *pcSrc != '\t' && *pcSrc != '\0')
								{
									*pcDst = *pcSrc;
									++pcDst;
									++pcSrc;
								}
								*pcDst = 0;
								return_name = acWord1;
							}
							break;
						case FUNC_PARAM:
							{
								pcDst = acWord1;
								while(*pcSrc == ' ' || *pcSrc == '\t')
								{
									++pcSrc;
								}
								while(*pcSrc != ' ' && *pcSrc != '\t' && *pcSrc != '\0')
								{
									*pcDst = *pcSrc;
									++pcDst;
									++pcSrc;
								}
								*pcDst = 0;
								
								pcDst = acWord2;
								while(*pcSrc == ' ' || *pcSrc == '\t')
								{
									++pcSrc;
								}
								while(*pcSrc != ' ' && *pcSrc != '\t' && *pcSrc != '\0')
								{
									*pcDst = *pcSrc;
									++pcDst;
									++pcSrc;
								}
								*pcDst = 0;
								if(strstr(pcSrc, "value"))
								{
									paramsType[acWord1] = make_pair(string(acWord2), false);
								}
								else
								{
									paramsType[acWord1] = make_pair(string(acWord2), true);
								}
							}
							break;
						}
					}

					break;
				}
				else
				{
					if(funcName.find(func_name.c_str()) == funcName.end())
					{
						string strTemp;

						outHeader += "typedef ";
						strTemp = kTypeMap[return_name];
						if(strTemp == "") strTemp = "void";
						outHeader += strTemp;
						outHeader += " (APIENTRY *";
						outHeader += func_name;
						outHeader += "Func)(";
						for(size_t i(0); i < params.size(); ++i)
						{
							strTemp = paramsType[params[i]].first;
							strTemp = kTypeMap[strTemp];
							if(strTemp == "")
							{
								strTemp = "void";
							}
							if(paramsType[params[i]].second)
							{
								strTemp += "*";
							}
							outHeader += strTemp;
							outHeader += " ";

							StringHashMap<string>::iterator it = trans.find(params[i]);
							if(it != trans.end())
							{
								outHeader += it->second;
							}
							else
							{
								outHeader += params[i];
							}
							if(i < (params.size() - 1))
							{
								outHeader += ", ";
							}
						}
						outHeader += ");\n";
						outHeader += "extern ";
						outHeader += func_name;
						outHeader += "Func _";
						outHeader += func_name;
						outHeader += ";\n";

						outHeader += "#define ";
						outHeader += func_name;
						if(return_name == "void")
						{
							outHeader += " VE_ASSERT(_";
							outHeader += func_name;
							outHeader += ");_";
						}
						else
						{
							outHeader += " _";
						}
						outHeader += func_name;
						outHeader += "\n";

						outSource += "#ifdef ";
						outSource += func_name;
						outSource += "\n";
						outSource += func_name;
						outSource += "Func _";
						outSource += func_name;
						outSource += " = NULL;\n";
						outSource += "#endif\n";

						LoadContext += "#\tifdef ";
						LoadContext += func_name;
						LoadContext += "\n";
						LoadContext += "\t_";
						LoadContext += func_name;
						LoadContext += " = (";
						LoadContext += func_name;
						LoadContext += "Func)";
						LoadContext += smallPre;
						LoadContext += "GetFunction(\"";
						LoadContext += func_name;
						LoadContext += "\");\n";
						LoadContext += "#\tendif\n";

						UnloadContext += "#\tifdef ";
						UnloadContext += func_name;
						UnloadContext += "\n";
						UnloadContext += "\t_";
						UnloadContext += func_name;
						UnloadContext += " = NULL;\n";
						UnloadContext += "#\tendif\n";

						funcName[func_name] = 1;
					}

					eState = SPEC_TYPE_MAX;
					eLastState = SPEC_TYPE_MAX;
				}
				
			}
		case SPEC_TYPE_MAX:
			if(eState == SPEC_TYPE_MAX)
			{
				if(acLineBuffer[0] < 0x30 || acLineBuffer[0] > 0x7A)
				{
					continue;
				}
				char acTemp[1024];
				const char* pcNext = GetSpecType(acLineBuffer, acTemp);
				{
					bool bFunc = false;
					{
						const char* pcTempPointer = acTemp;
						while(*pcTempPointer)
						{
							if(*pcTempPointer == ')')
							{
								bFunc = true;
							}
							++pcTempPointer;
						}
					}
					if(bFunc)
					{
						char acTempBuffer[128];
						char* pcDst = acTempBuffer;
						char* pcSrc = acLineBuffer;
						while(*pcSrc)
						{
							*pcDst = *pcSrc;
							if(*pcDst == '(')
							{
								++pcSrc;
								break;
							}
							++pcDst;
							++pcSrc;
						}
						*pcDst = 0;
						func_name = smallPre + acTempBuffer;
						return_name = "";
						params.clear();
						paramsType.clear();
						while(*pcSrc)
						{
							pcDst = acTempBuffer;
							while(*pcSrc)
							{
								*pcDst = *pcSrc;
								if(*pcSrc == ')')
								{
									break;
								}
								else if(*pcSrc == ' ' || *pcSrc == '\t' || *pcSrc == ',')
								{
									++pcSrc;
									break;
								}
								++pcSrc;
								++pcDst;
							}
							*pcDst = 0;

							if(strlen(acTempBuffer))
							{
								params.push_back(acTempBuffer);
							}

							while(*pcSrc == ' ' || *pcSrc == '\t' || *pcSrc == ',')
							{
								++pcSrc;
							}

							if(*pcSrc == ')')
							{
								break;
							}
						}

						eState = SPEC_FUNC;
					}
					else
					{
						StringHashMap<SpecType>::iterator it = spec_Type.find(acTemp);
						if(it != spec_Type.end())
						{
							if(it->second == SPEC_PASSTHRU)
							{
								while(*pcNext == ' ' || *pcNext == '\t')
								{
									++pcNext;
								}
								outHeader += pcNext;
								outHeader += "\n";
								eState = eLastState;
							}
							else
							{
								eState = it->second;
							}
						}
						else
						{
							eState = SPEC_ENUM;
						}
					}
				}
			}
			break;
		}
		

	}
}