diff --git a/library/include/DataIdentity.h b/library/include/DataIdentity.h index ed4ca06ecd..4bd4976250 100644 --- a/library/include/DataIdentity.h +++ b/library/include/DataIdentity.h @@ -840,7 +840,7 @@ namespace df template inline const container_identity* identity_traits >::get() { - using container = std::set; + using container = std::unordered_set; static const ro_stl_container_identity identity("unordered_set", identity_traits::get()); return &identity; } diff --git a/plugins/sort.cpp b/plugins/sort.cpp index add54688c4..9b91f1118c 100644 --- a/plugins/sort.cpp +++ b/plugins/sort.cpp @@ -1,3 +1,5 @@ +#include + #include "Debug.h" #include "LuaTools.h" #include "PluginManager.h" @@ -25,7 +27,7 @@ namespace DFHack { DBG_DECLARE(sort, log, DebugCategory::LINFO); } -using item_or_unit = std::pair; +using item_or_unit = std::variant; using filter_vec_type = std::vector>; // recreated here since our autogenerated df::sort_entry lacks template params @@ -44,8 +46,8 @@ static bool probing = false; static bool probe_result = false; static bool do_filter(const char *module_name, const char *fn_name, const item_or_unit &elem) { - if (elem.second) return true; - auto unit = (df::unit *)elem.first; + if (std::holds_alternative(elem)) return true; + auto unit = std::get(elem); if (probing) { TRACE(log).print("probe successful\n"); @@ -78,11 +80,11 @@ static bool do_work_animal_assignment_filter(item_or_unit elem) { static int32_t our_filter_idx(df::widget_unit_list *unitlist) { if (world->units.active.empty()) - return true; + return -1; df::unit *u = world->units.active[0]; // any unit will do; we just need a sentinel if (!u) - return true; + return -1; probing = true; probe_result = false; @@ -91,8 +93,8 @@ static int32_t our_filter_idx(df::widget_unit_list *unitlist) { filter_vec_type *filter_vec = reinterpret_cast(&unitlist->filter_func); TRACE(log).print("probing for our filter function\n"); - for (auto fn : *filter_vec) { - fn(std::make_pair(u, false)); + for (auto& fn : *filter_vec) { + fn(item_or_unit(u)); if (probe_result) { TRACE(log).print("found our filter function at idx %d\n", idx); break; @@ -144,13 +146,13 @@ static df::widget_unit_list * get_work_animal_assignment_unit_list() { // static bool sort_proxy(const item_or_unit &a, const item_or_unit &b) { - if (a.second || b.second) + if (std::holds_alternative(a) || std::holds_alternative(b)) return true; bool ret = true; color_ostream &out = Core::getInstance().getConsole(); Lua::CallLuaModuleFunction(out, "plugins.sort", "do_sort", - std::make_tuple((df::unit *)a.first, (df::unit *)b.first), + std::make_tuple(std::get(a), std::get(b)), 1, [&](lua_State *L){ ret = lua_toboolean(L, 1); }