gnucash stable: [gnc-pricedb.cpp] more glib g_list uses

Christopher Lam clam at code.gnucash.org
Mon Aug 7 20:12:13 EDT 2023


Updated	 via  https://github.com/Gnucash/gnucash/commit/fc21c55a (commit)
	from  https://github.com/Gnucash/gnucash/commit/0a9e999c (commit)



commit fc21c55a0b116fc64ebfc318ebd7a8eb76e6feaf
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Thu Aug 3 22:09:03 2023 +0800

    [gnc-pricedb.cpp] more glib g_list uses
    
    * use g_list_find_custom where appropriate
    * also g_list_free_full and g_list_foreach

diff --git a/libgnucash/engine/gnc-pricedb.cpp b/libgnucash/engine/gnc-pricedb.cpp
index f67437140a..47ddac57e7 100644
--- a/libgnucash/engine/gnc-pricedb.cpp
+++ b/libgnucash/engine/gnc-pricedb.cpp
@@ -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_is_duplicate (const GNCPrice *p_price, const GNCPrice *c_price)
 {
     /* 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 time64CanonicalDayTime (gnc_price_get_time64 (p_price)) != time64CanonicalDayTime (gnc_price_get_time64 (c_price)) ||
+        gnc_numeric_compare (gnc_price_get_value (p_price), gnc_price_get_value (c_price)) ||
+        gnc_commodity_compare (gnc_price_get_commodity (p_price), gnc_price_get_commodity (c_price)) ||
+        gnc_commodity_compare (gnc_price_get_currency (p_price), gnc_price_get_currency (c_price));
 }
 
 gboolean
@@ -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_is_duplicate))
+        return true;
 
     auto result_list = g_list_insert_sorted(*prices, p, compare_prices_by_date);
     if (!result_list)
@@ -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
@@ -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;
 }
@@ -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_same_time (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_same_time);
+    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 *
@@ -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_time64_less_or_equal (GNCPrice *p, time64 time)
+{
+    return !(gnc_price_get_time64 (p) <= time);
+}
 
 GNCPrice *
 gnc_pricedb_lookup_nearest_before_t64 (GNCPriceDB *db,
@@ -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_time64_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;
 }
@@ -2649,11 +2631,8 @@ pricedb_foreach_pricelist(gpointer key, gpointer val, gpointer user_data)
     GNCPriceDBForeachData *foreach_data = (GNCPriceDBForeachData *) user_data;
 
     /* stop traversal when func returns FALSE */
-    for (auto node = price_list; foreach_data->ok && node; node = node->next)
-    {
-        GNCPrice *p = (GNCPrice *) node->data;
-        foreach_data->ok = foreach_data->func(p, foreach_data->user_data);
-    }
+    foreach_data->ok = g_list_find_custom (price_list, foreach_data->user_data, (GCompareFunc)foreach_data->func)
+        != nullptr;
 }
 
 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);
 
         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;
@@ -2981,11 +2954,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



Summary of changes:
 libgnucash/engine/gnc-pricedb.cpp | 105 ++++++++++++++------------------------
 1 file changed, 37 insertions(+), 68 deletions(-)



More information about the gnucash-changes mailing list