CScriptArray* ContainerToScriptArray(const char* odecl, C& container) { ScriptEngine* engine = ScriptEngine::GetPtr(); size_t size = 0; //size of container. size_t i = 0; //for index. void* ptr = nullptr; //holds the individual element. asIObjectType* objtype = nullptr; //holds declaration. CScriptArray* ret = nullptr; size = container.size(); objtype = engine->GetBaseEngine()->GetObjectTypeByDecl(odecl); ret = CScriptArray::Create(objtype, size); //we do the actual copy. for (auto it: container) { ptr = ⁢ ret->SetValue(i, ptr); i++; } return ret; }
CScriptArray *MainScreenHelper::GetServerList(std::string sortKey, bool descending) { if (result == NULL) { return NULL; } using Item = const Handle<MainScreenServerItem> &; std::vector<Handle<MainScreenServerItem>> &lst = result->list; if (lst.empty()) return NULL; auto compareFavorite = [&](Item x, Item y) -> stmp::optional<bool> { if (x->IsFavorite() && !y->IsFavorite()) { return true; } else if (!x->IsFavorite() && y->IsFavorite()) { return false; } else { return {}; } }; auto compareInts = [&](int x, int y) -> bool { if (descending) { return y < x; } else { return x < y; } }; auto compareStrings = [&](const std::string &x0, const std::string &y0) -> bool { const auto &x = descending ? y0 : x0; const auto &y = descending ? x0 : y0; std::string::size_type t = 0; for (t = 0; t < x.length() && t < y.length(); ++t) { int xx = std::tolower(x[t]); int yy = std::tolower(y[t]); if (xx != yy) { return xx < yy; } } if (x.length() == y.length()) { return false; } return x.length() < y.length(); }; if (!sortKey.empty()) { if (sortKey == "Ping") { std::stable_sort(lst.begin(), lst.end(), [&](Item x, Item y) { return compareFavorite(x, y).value_or( compareInts(x->GetPing(), y->GetPing())); }); } else if (sortKey == "NumPlayers") { std::stable_sort(lst.begin(), lst.end(), [&](Item x, Item y) { return compareFavorite(x, y).value_or( compareInts(x->GetNumPlayers(), y->GetNumPlayers())); }); } else if (sortKey == "Name") { std::stable_sort(lst.begin(), lst.end(), [&](Item x, Item y) { return compareFavorite(x, y).value_or( compareStrings(x->GetName(), y->GetName())); }); } else if (sortKey == "MapName") { std::stable_sort(lst.begin(), lst.end(), [&](Item x, Item y) { return compareFavorite(x, y).value_or( compareStrings(x->GetMapName(), y->GetMapName())); }); } else if (sortKey == "GameMode") { std::stable_sort(lst.begin(), lst.end(), [&](Item x, Item y) { return compareFavorite(x, y).value_or( compareStrings(x->GetGameMode(), y->GetGameMode())); }); } else if (sortKey == "Protocol") { std::stable_sort(lst.begin(), lst.end(), [&](Item x, Item y) { return compareFavorite(x, y).value_or( compareStrings(x->GetProtocol(), y->GetProtocol())); }); } else if (sortKey == "Country") { std::stable_sort(lst.begin(), lst.end(), [&](Item x, Item y) { return compareFavorite(x, y).value_or( compareStrings(x->GetCountry(), y->GetCountry())); }); } else { SPRaise("Invalid sort key: %s", sortKey.c_str()); } } asIScriptEngine *eng = ScriptManager::GetInstance()->GetEngine(); asITypeInfo *t = eng->GetTypeInfoByDecl("array<spades::MainScreenServerItem@>"); SPAssert(t != NULL); CScriptArray *arr = CScriptArray::Create(t, static_cast<asUINT>(lst.size())); for (size_t i = 0; i < lst.size(); i++) { arr->SetValue((asUINT)i, &(lst[i])); } return arr; }