gnc_commodity_table->ns_table is an unordered_map

This commit is contained in:
Christopher Lam 2024-05-01 08:31:53 +08:00
parent 2ddb191953
commit c514003d2c

View File

@ -108,6 +108,7 @@ static void commodity_free(gnc_commodity * cm);
static void gnc_commodity_set_default_symbol(gnc_commodity *, const char *); static void gnc_commodity_set_default_symbol(gnc_commodity *, const char *);
using StrCommodityMap = std::unordered_map<std::string,gnc_commodity*>; using StrCommodityMap = std::unordered_map<std::string,gnc_commodity*>;
using StrCommodityNSMap = std::unordered_map<std::string,gnc_commodity_namespace*>;
struct gnc_commodity_namespace_s struct gnc_commodity_namespace_s
{ {
@ -126,7 +127,7 @@ struct _GncCommodityNamespaceClass
struct gnc_commodity_table_s struct gnc_commodity_table_s
{ {
GHashTable * ns_table; StrCommodityNSMap ns_table;
GList * ns_list; GList * ns_list;
}; };
@ -1616,7 +1617,7 @@ gnc_commodity_table *
gnc_commodity_table_new(void) gnc_commodity_table_new(void)
{ {
gnc_commodity_table * retval = g_new0(gnc_commodity_table, 1); gnc_commodity_table * retval = g_new0(gnc_commodity_table, 1);
retval->ns_table = g_hash_table_new(&g_str_hash, &g_str_equal); new (&retval->ns_table) StrCommodityNSMap ();
retval->ns_list = nullptr; retval->ns_list = nullptr;
return retval; return retval;
} }
@ -1659,12 +1660,12 @@ gnc_commodity_obtain_twin (const gnc_commodity *from, QofBook *book)
********************************************************************/ ********************************************************************/
static void static void
count_coms(gpointer key, gpointer value, gpointer user_data) count_coms(const std::string key, gpointer value, gpointer user_data)
{ {
auto tbl = ((gnc_commodity_namespace*)value)->cm_table; auto tbl = ((gnc_commodity_namespace*)value)->cm_table;
guint *count = (guint*)user_data; guint *count = (guint*)user_data;
if (g_strcmp0((char*)key, GNC_COMMODITY_NS_CURRENCY) == 0) if (key == GNC_COMMODITY_NS_CURRENCY)
{ {
/* don't count default commodities */ /* don't count default commodities */
return; return;
@ -1680,9 +1681,9 @@ gnc_commodity_table_get_size(const gnc_commodity_table* tbl)
{ {
guint count = 0; guint count = 0;
g_return_val_if_fail(tbl, 0); g_return_val_if_fail(tbl, 0);
g_return_val_if_fail(tbl->ns_table, 0);
g_hash_table_foreach(tbl->ns_table, count_coms, (gpointer)&count); std::for_each (tbl->ns_table.begin(), tbl->ns_table.end(),
[&count](auto it){ count_coms (it.first, it.second, &count); });
return count; return count;
} }
@ -1908,12 +1909,6 @@ gnc_commodity_table_has_namespace(const gnc_commodity_table * table,
} }
} }
static void
hash_keys_helper (const char* key, gnc_commodity* value, std::vector<std::string> *l)
{
l->push_back (key);
}
/******************************************************************** /********************************************************************
* gnc_commodity_table_get_namespaces * gnc_commodity_table_get_namespaces
* see if any commodities in the namespace exist * see if any commodities in the namespace exist
@ -1926,7 +1921,8 @@ gnc_commodity_table_get_namespaces(const gnc_commodity_table * table)
if (!table) if (!table)
return rv; return rv;
g_hash_table_foreach(table->ns_table, (GHFunc)hash_keys_helper, &rv); std::for_each (table->ns_table.begin(), table->ns_table.end(),
[&rv](auto it){ rv.push_back (it.first); });
return rv; return rv;
} }
@ -2127,9 +2123,7 @@ gnc_commodity_table_add_namespace(gnc_commodity_table * table,
qof_instance_init_data (&ns->inst, GNC_ID_COMMODITY_NAMESPACE, book); qof_instance_init_data (&ns->inst, GNC_ID_COMMODITY_NAMESPACE, book);
qof_event_gen (&ns->inst, QOF_EVENT_CREATE, nullptr); qof_event_gen (&ns->inst, QOF_EVENT_CREATE, nullptr);
g_hash_table_insert(table->ns_table, table->ns_table[ns->name] = ns;
(gpointer) ns->name,
(gpointer) ns);
table->ns_list = g_list_append(table->ns_list, ns); table->ns_list = g_list_append(table->ns_list, ns);
qof_event_gen (&ns->inst, QOF_EVENT_ADD, nullptr); qof_event_gen (&ns->inst, QOF_EVENT_ADD, nullptr);
} }
@ -2145,7 +2139,12 @@ gnc_commodity_table_find_namespace(const gnc_commodity_table * table,
return nullptr; return nullptr;
name_space = gnc_commodity_table_map_namespace(name_space); name_space = gnc_commodity_table_map_namespace(name_space);
return static_cast<gnc_commodity_namespace*>(g_hash_table_lookup(table->ns_table, (gpointer)name_space));
auto it = table->ns_table.find(name_space);
if (it == table->ns_table.end())
return nullptr;
else
return it->second;
} }
@ -2176,7 +2175,7 @@ gnc_commodity_table_delete_namespace(gnc_commodity_table * table,
return; return;
qof_event_gen (&ns->inst, QOF_EVENT_REMOVE, nullptr); qof_event_gen (&ns->inst, QOF_EVENT_REMOVE, nullptr);
g_hash_table_remove(table->ns_table, name_space); table->ns_table.erase (name_space);
table->ns_list = g_list_remove(table->ns_list, ns); table->ns_list = g_list_remove(table->ns_list, ns);
g_list_free(ns->cm_list); g_list_free(ns->cm_list);
@ -2238,7 +2237,8 @@ gnc_commodity_table_foreach_commodity (const gnc_commodity_table * tbl,
iter_data.func = f; iter_data.func = f;
iter_data.user_data = user_data; iter_data.user_data = user_data;
g_hash_table_foreach(tbl->ns_table, iter_namespace, (gpointer)&iter_data); std::for_each (tbl->ns_table.begin(), tbl->ns_table.end(),
[&iter_data](auto it){ iter_namespace (nullptr, it.second, &iter_data); });
return iter_data.ok; return iter_data.ok;
} }
@ -2266,8 +2266,7 @@ gnc_commodity_table_destroy(gnc_commodity_table * t)
g_list_free(t->ns_list); g_list_free(t->ns_list);
t->ns_list = nullptr; t->ns_list = nullptr;
g_hash_table_destroy(t->ns_table); t->ns_table.~StrCommodityNSMap();
t->ns_table = nullptr;
LEAVE ("table=%p", t); LEAVE ("table=%p", t);
g_free(t); g_free(t);
} }