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 *);
using StrCommodityMap = std::unordered_map<std::string,gnc_commodity*>;
using StrCommodityNSMap = std::unordered_map<std::string,gnc_commodity_namespace*>;
struct gnc_commodity_namespace_s
{
@ -126,7 +127,7 @@ struct _GncCommodityNamespaceClass
struct gnc_commodity_table_s
{
GHashTable * ns_table;
StrCommodityNSMap ns_table;
GList * ns_list;
};
@ -1616,7 +1617,7 @@ gnc_commodity_table *
gnc_commodity_table_new(void)
{
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;
return retval;
}
@ -1659,12 +1660,12 @@ gnc_commodity_obtain_twin (const gnc_commodity *from, QofBook *book)
********************************************************************/
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;
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 */
return;
@ -1680,9 +1681,9 @@ gnc_commodity_table_get_size(const gnc_commodity_table* tbl)
{
guint count = 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;
}
@ -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
* see if any commodities in the namespace exist
@ -1926,7 +1921,8 @@ gnc_commodity_table_get_namespaces(const gnc_commodity_table * table)
if (!table)
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;
}
@ -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_event_gen (&ns->inst, QOF_EVENT_CREATE, nullptr);
g_hash_table_insert(table->ns_table,
(gpointer) ns->name,
(gpointer) ns);
table->ns_table[ns->name] = ns;
table->ns_list = g_list_append(table->ns_list, ns);
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;
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;
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);
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.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;
}
@ -2266,8 +2266,7 @@ gnc_commodity_table_destroy(gnc_commodity_table * t)
g_list_free(t->ns_list);
t->ns_list = nullptr;
g_hash_table_destroy(t->ns_table);
t->ns_table = nullptr;
t->ns_table.~StrCommodityNSMap();
LEAVE ("table=%p", t);
g_free(t);
}