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");
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; } } }