Skip to content

Commit

Permalink
[gnc-pricedb.cpp] more glib g_list uses
Browse files Browse the repository at this point in the history
* use g_list_find_custom where appropriate
* also g_list_free_full and g_list_foreach
  • Loading branch information
christopherlam committed Aug 4, 2023
1 parent 2d730e3 commit 599abfd
Showing 1 changed file with 35 additions and 63 deletions.
98 changes: 35 additions & 63 deletions libgnucash/engine/gnc-pricedb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -690,14 +690,14 @@ compare_prices_by_date(gconstpointer a, gconstpointer b)
gnc_price_get_guid((GNCPrice *) b));
}

static bool
price_is_duplicate (const GNCPrice *pPrice, const GNCPrice *cPrice)
static int
price_compare (const GNCPrice *pPrice, const GNCPrice *cPrice)
{
/* 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)) &&
gnc_price_get_commodity (pPrice) == gnc_price_get_commodity (cPrice) &&
gnc_price_get_currency (pPrice) == gnc_price_get_currency (cPrice) &&
time64CanonicalDayTime (gnc_price_get_time64 (pPrice)) == time64CanonicalDayTime (gnc_price_get_time64 (cPrice)));
return gnc_numeric_compare (gnc_price_get_value (pPrice), gnc_price_get_value (cPrice)) ||
gnc_commodity_compare (gnc_price_get_commodity (pPrice), gnc_price_get_commodity (cPrice)) ||
gnc_commodity_compare (gnc_price_get_currency (pPrice), gnc_price_get_currency (cPrice)) ||
time64CanonicalDayTime (gnc_price_get_time64 (pPrice)) != time64CanonicalDayTime (gnc_price_get_time64 (cPrice));
}

gboolean
Expand All @@ -706,10 +706,8 @@ gnc_price_list_insert(PriceList **prices, GNCPrice *p, gboolean check_dupl)
if (!prices || !p) return FALSE;
gnc_price_ref(p);

if (check_dupl)
for (auto n = *prices; n; n = g_list_next (n))
if (price_is_duplicate (static_cast<GNCPrice*>(n->data), p))
return true;
if (check_dupl && g_list_find_custom (*prices, p, (GCompareFunc)price_compare))
return true;

auto result_list = g_list_insert_sorted(*prices, p, compare_prices_by_date);
if (!result_list)
Expand Down Expand Up @@ -738,17 +736,10 @@ gnc_price_list_remove(PriceList **prices, GNCPrice *p)
return TRUE;
}

static void
price_list_destroy_helper(gpointer data, gpointer user_data)
{
gnc_price_unref((GNCPrice *) data);
}

void
gnc_price_list_destroy(PriceList *prices)
{
g_list_foreach(prices, price_list_destroy_helper, NULL);
g_list_free(prices);
g_list_free_full (prices, (GDestroyNotify)gnc_price_unref);
}

gboolean
Expand Down Expand Up @@ -2059,17 +2050,11 @@ gnc_pricedb_get_prices(GNCPriceDB *db,
const gnc_commodity *commodity,
const gnc_commodity *currency)
{
GList *result;
GList *node;


if (!db || !commodity) return NULL;
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;
for (node = result; node; node = node->next)
gnc_price_ref (static_cast<GNCPrice*>(node->data));

g_list_foreach (result, (GFunc)gnc_price_ref, nullptr);
LEAVE (" ");
return result;
}
Expand Down Expand Up @@ -2193,30 +2178,31 @@ gnc_pricedb_lookup_day_t64(GNCPriceDB *db,
return lookup_nearest_in_time(db, c, currency, t, TRUE);
}

// return 0 if price's time matches exactly
static int price_equal (GNCPrice *p, time64 time)
{
return !(gnc_price_get_time64 (p) == time);
}

GNCPrice *
gnc_pricedb_lookup_at_time64(GNCPriceDB *db,
const gnc_commodity *c,
const gnc_commodity *currency,
time64 t)
{
GNCPrice *rv = nullptr;
if (!db || !c || !currency) return NULL;
ENTER ("db=%p commodity=%p currency=%p", db, c, currency);
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_equal);
if (p)
{
auto p = static_cast<GNCPrice*>(item->data);
time64 price_time = gnc_price_get_time64(p);
if (price_time == t)
{
gnc_price_ref(p);
g_list_free (price_list);
LEAVE("price is %p", p);
return p;
}
rv = GNC_PRICE (p->data);
gnc_price_ref (rv);
}
g_list_free (price_list);
LEAVE (" ");
return NULL;
return rv;
}

static GNCPrice *
Expand Down Expand Up @@ -2338,6 +2324,11 @@ gnc_pricedb_lookup_nearest_in_time64(GNCPriceDB *db,
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_less_or_equal (GNCPrice *p, time64 time)
{
return !(gnc_price_get_time64 (p) <= time);
}

GNCPrice *
gnc_pricedb_lookup_nearest_before_t64 (GNCPriceDB *db,
Expand All @@ -2346,26 +2337,17 @@ gnc_pricedb_lookup_nearest_before_t64 (GNCPriceDB *db,
time64 t)
{
GNCPrice *current_price = NULL;

if (!db || !c || !currency) return NULL;
ENTER ("db=%p commodity=%p currency=%p", db, c, currency);

auto price_list = pricedb_get_prices_internal (db, c, currency, TRUE);
if (!price_list) return NULL;

for (auto item = price_list; item; item = item->next)
auto p = g_list_find_custom (price_list, GUINT_TO_POINTER(t), (GCompareFunc)price_less_or_equal);
if (p)
{
auto p = static_cast<GNCPrice*>(item->data);
if (gnc_price_get_time64 (p) <= t)
{
current_price = p;
break;
}
current_price = GNC_PRICE (p->data);
gnc_price_ref (current_price);
}

gnc_price_ref(current_price);
g_list_free (price_list);

LEAVE (" ");
return current_price;
}
Expand Down Expand Up @@ -2760,14 +2742,8 @@ stable_price_traversal(GNCPriceDB *db,
std::sort (price_lists.begin(), price_lists.end(), compare_hash_entries_by_commodity_key);

for (const auto& pricelist_entry : price_lists)
{
for (auto node = static_cast<GList*>(pricelist_entry.second); node; node = node->next)
{
/* stop traversal when f returns FALSE */
if (!f(static_cast<GNCPrice *>(node->data), user_data))
return false;
}
}
if (g_list_find_custom (static_cast<GList*>(pricelist_entry.second), user_data, (GCompareFunc)f))
return false;
}

return true;
Expand Down Expand Up @@ -2972,11 +2948,7 @@ void_pricedb_foreach_pricelist(gpointer key, gpointer val, gpointer user_data)
GList *price_list = (GList *) val;
VoidGNCPriceDBForeachData *foreach_data = (VoidGNCPriceDBForeachData *) user_data;

for (auto node = price_list; node; node = node->next)
{
GNCPrice *p = (GNCPrice *) node->data;
foreach_data->func(p, foreach_data->user_data);
}
g_list_foreach (price_list, (GFunc)foreach_data->func, foreach_data->user_data);
}

static void
Expand Down

0 comments on commit 599abfd

Please sign in to comment.