Commit f718ea52 authored by mercury233's avatar mercury233 Committed by GitHub

update DataManager::GetSetCodes (#2990)

parent 192cb6b7
......@@ -242,16 +242,30 @@ const wchar_t* DataManager::GetSetName(uint32_t code) const {
std::vector<uint32_t> DataManager::GetSetCodes(std::wstring setname) const {
std::vector<uint32_t> matchingCodes;
for(auto csit = _setnameStrings.begin(); csit != _setnameStrings.end(); ++csit) {
auto xpos = csit->second.find_first_of(L'|');//setname|another setname or extra info
if(setname.size() < 2) {
if(csit->second.compare(0, xpos, setname) == 0
|| csit->second.compare(xpos + 1, csit->second.length(), setname) == 0)
matchingCodes.push_back(csit->first);
} else {
if(csit->second.substr(0, xpos).find(setname) != std::wstring::npos
|| csit->second.substr(xpos + 1).find(setname) != std::wstring::npos) {
matchingCodes.push_back(csit->first);
const std::wstring& setnameString = csit->second;
size_t start = 0;
while(start < setnameString.size()) { // handle "setname|another setname"
auto pos = setnameString.find(L'|', start);
std::wstring token;
if(pos == std::wstring::npos)
token = setnameString.substr(start);
else
token = setnameString.substr(start, pos - start);
if(setname.size() < 2) {
// exact match for short set names to avoid too many results
if(token == setname) {
matchingCodes.push_back(csit->first);
break;
}
} else {
if(token.find(setname) != std::wstring::npos) {
matchingCodes.push_back(csit->first);
break;
}
}
if(pos == std::wstring::npos)
break;
start = pos + 1;
}
}
return matchingCodes;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment