[gnc-pricedb.cpp] more glib g_list uses

* use g_list_find_custom where appropriate
* also g_list_free_full and g_list_foreach
This commit is contained in:
Christopher Lam 2023-08-03 22:09:03 +08:00
parent 0a9e999cfd
commit fc21c55a0b

View File

@ -690,14 +690,14 @@ compare_prices_by_date(gconstpointer a, gconstpointer b)
gnc_price_get_guid((GNCPrice *) b)); gnc_price_get_guid((GNCPrice *) b));
} }
static bool static int
price_is_duplicate (const GNCPrice *pPrice, const GNCPrice *cPrice) price_is_duplicate (const GNCPrice *p_price, const GNCPrice *c_price)
{ {
/* If the date, currency, commodity and price match, it's a duplicate */ /* If the date, currency, commodity and price match, it's a duplicate */
return (gnc_numeric_equal (gnc_price_get_value (pPrice), gnc_price_get_value (cPrice)) && return time64CanonicalDayTime (gnc_price_get_time64 (p_price)) != time64CanonicalDayTime (gnc_price_get_time64 (c_price)) ||
gnc_price_get_commodity (pPrice) == gnc_price_get_commodity (cPrice) && gnc_numeric_compare (gnc_price_get_value (p_price), gnc_price_get_value (c_price)) ||
gnc_price_get_currency (pPrice) == gnc_price_get_currency (cPrice) && gnc_commodity_compare (gnc_price_get_commodity (p_price), gnc_price_get_commodity (c_price)) ||
time64CanonicalDayTime (gnc_price_get_time64 (pPrice)) == time64CanonicalDayTime (gnc_price_get_time64 (cPrice))); gnc_commodity_compare (gnc_price_get_currency (p_price), gnc_price_get_currency (c_price));
} }
gboolean gboolean
@ -706,10 +706,8 @@ gnc_price_list_insert(PriceList **prices, GNCPrice *p, gboolean check_dupl)
if (!prices || !p) return FALSE; if (!prices || !p) return FALSE;
gnc_price_ref(p); gnc_price_ref(p);
if (check_dupl) if (check_dupl && g_list_find_custom (*prices, p, (GCompareFunc)price_is_duplicate))
for (auto n = *prices; n; n = g_list_next (n)) return true;
if (price_is_duplicate (static_cast<GNCPrice*>(n->data), p))
return true;
auto result_list = g_list_insert_sorted(*prices, p, compare_prices_by_date); auto result_list = g_list_insert_sorted(*prices, p, compare_prices_by_date);
if (!result_list) if (!result_list)
@ -738,17 +736,10 @@ gnc_price_list_remove(PriceList **prices, GNCPrice *p)
return TRUE; return TRUE;
} }
static void
price_list_destroy_helper(gpointer data, gpointer user_data)
{
gnc_price_unref((GNCPrice *) data);
}
void void
gnc_price_list_destroy(PriceList *prices) gnc_price_list_destroy(PriceList *prices)
{ {
g_list_foreach(prices, price_list_destroy_helper, NULL); g_list_free_full (prices, (GDestroyNotify)gnc_price_unref);
g_list_free(prices);
} }
gboolean gboolean
@ -2059,17 +2050,11 @@ gnc_pricedb_get_prices(GNCPriceDB *db,
const gnc_commodity *commodity, const gnc_commodity *commodity,
const gnc_commodity *currency) const gnc_commodity *currency)
{ {
GList *result;
GList *node;
if (!db || !commodity) return NULL; if (!db || !commodity) return NULL;
ENTER ("db=%p commodity=%p currency=%p", db, commodity, currency); ENTER ("db=%p commodity=%p currency=%p", db, commodity, currency);
result = pricedb_get_prices_internal (db, commodity, currency, FALSE); auto result = pricedb_get_prices_internal (db, commodity, currency, FALSE);
if (!result) return NULL; if (!result) return NULL;
for (node = result; node; node = node->next) g_list_foreach (result, (GFunc)gnc_price_ref, nullptr);
gnc_price_ref (static_cast<GNCPrice*>(node->data));
LEAVE (" "); LEAVE (" ");
return result; return result;
} }
@ -2193,30 +2178,31 @@ gnc_pricedb_lookup_day_t64(GNCPriceDB *db,
return lookup_nearest_in_time(db, c, currency, t, TRUE); return lookup_nearest_in_time(db, c, currency, t, TRUE);
} }
// return 0 if price's time matches exactly
static int price_same_time (GNCPrice *p, time64 time)
{
return !(gnc_price_get_time64 (p) == time);
}
GNCPrice * GNCPrice *
gnc_pricedb_lookup_at_time64(GNCPriceDB *db, gnc_pricedb_lookup_at_time64(GNCPriceDB *db,
const gnc_commodity *c, const gnc_commodity *c,
const gnc_commodity *currency, const gnc_commodity *currency,
time64 t) time64 t)
{ {
GNCPrice *rv = nullptr;
if (!db || !c || !currency) return NULL; if (!db || !c || !currency) return NULL;
ENTER ("db=%p commodity=%p currency=%p", db, c, currency); ENTER ("db=%p commodity=%p currency=%p", db, c, currency);
auto price_list = pricedb_get_prices_internal (db, c, currency, TRUE); auto price_list = pricedb_get_prices_internal (db, c, currency, TRUE);
for (auto item = price_list; item; item = item->next) auto p = g_list_find_custom (price_list, GUINT_TO_POINTER(t), (GCompareFunc) price_same_time);
if (p)
{ {
auto p = static_cast<GNCPrice*>(item->data); rv = GNC_PRICE (p->data);
time64 price_time = gnc_price_get_time64(p); gnc_price_ref (rv);
if (price_time == t)
{
gnc_price_ref(p);
g_list_free (price_list);
LEAVE("price is %p", p);
return p;
}
} }
g_list_free (price_list); g_list_free (price_list);
LEAVE (" "); LEAVE (" ");
return NULL; return rv;
} }
static GNCPrice * static GNCPrice *
@ -2338,6 +2324,11 @@ gnc_pricedb_lookup_nearest_in_time64(GNCPriceDB *db,
return lookup_nearest_in_time(db, c, currency, t, FALSE); return lookup_nearest_in_time(db, c, currency, t, FALSE);
} }
// return 0 if price's time is less or equal to time
static int price_time64_less_or_equal (GNCPrice *p, time64 time)
{
return !(gnc_price_get_time64 (p) <= time);
}
GNCPrice * GNCPrice *
gnc_pricedb_lookup_nearest_before_t64 (GNCPriceDB *db, gnc_pricedb_lookup_nearest_before_t64 (GNCPriceDB *db,
@ -2346,26 +2337,17 @@ gnc_pricedb_lookup_nearest_before_t64 (GNCPriceDB *db,
time64 t) time64 t)
{ {
GNCPrice *current_price = NULL; GNCPrice *current_price = NULL;
if (!db || !c || !currency) return NULL; if (!db || !c || !currency) return NULL;
ENTER ("db=%p commodity=%p currency=%p", db, c, currency); ENTER ("db=%p commodity=%p currency=%p", db, c, currency);
auto price_list = pricedb_get_prices_internal (db, c, currency, TRUE); auto price_list = pricedb_get_prices_internal (db, c, currency, TRUE);
if (!price_list) return NULL; if (!price_list) return NULL;
auto p = g_list_find_custom (price_list, GUINT_TO_POINTER(t), (GCompareFunc)price_time64_less_or_equal);
for (auto item = price_list; item; item = item->next) if (p)
{ {
auto p = static_cast<GNCPrice*>(item->data); current_price = GNC_PRICE (p->data);
if (gnc_price_get_time64 (p) <= t) gnc_price_ref (current_price);
{
current_price = p;
break;
}
} }
gnc_price_ref(current_price);
g_list_free (price_list); g_list_free (price_list);
LEAVE (" "); LEAVE (" ");
return current_price; return current_price;
} }
@ -2649,11 +2631,8 @@ pricedb_foreach_pricelist(gpointer key, gpointer val, gpointer user_data)
GNCPriceDBForeachData *foreach_data = (GNCPriceDBForeachData *) user_data; GNCPriceDBForeachData *foreach_data = (GNCPriceDBForeachData *) user_data;
/* stop traversal when func returns FALSE */ /* stop traversal when func returns FALSE */
for (auto node = price_list; foreach_data->ok && node; node = node->next) foreach_data->ok = g_list_find_custom (price_list, foreach_data->user_data, (GCompareFunc)foreach_data->func)
{ != nullptr;
GNCPrice *p = (GNCPrice *) node->data;
foreach_data->ok = foreach_data->func(p, foreach_data->user_data);
}
} }
static void static void
@ -2769,14 +2748,8 @@ stable_price_traversal(GNCPriceDB *db,
std::sort (price_lists.begin(), price_lists.end(), compare_hash_entries_by_commodity_key); std::sort (price_lists.begin(), price_lists.end(), compare_hash_entries_by_commodity_key);
for (const auto& pricelist_entry : price_lists) for (const auto& pricelist_entry : price_lists)
{ if (g_list_find_custom (static_cast<GList*>(pricelist_entry.second), user_data, (GCompareFunc)f))
for (auto node = static_cast<GList*>(pricelist_entry.second); node; node = node->next) return false;
{
/* stop traversal when f returns FALSE */
if (!f(static_cast<GNCPrice *>(node->data), user_data))
return false;
}
}
} }
return true; return true;
@ -2981,11 +2954,7 @@ void_pricedb_foreach_pricelist(gpointer key, gpointer val, gpointer user_data)
GList *price_list = (GList *) val; GList *price_list = (GList *) val;
VoidGNCPriceDBForeachData *foreach_data = (VoidGNCPriceDBForeachData *) user_data; VoidGNCPriceDBForeachData *foreach_data = (VoidGNCPriceDBForeachData *) user_data;
for (auto node = price_list; node; node = node->next) g_list_foreach (price_list, (GFunc)foreach_data->func, foreach_data->user_data);
{
GNCPrice *p = (GNCPrice *) node->data;
foreach_data->func(p, foreach_data->user_data);
}
} }
static void static void