gnucash stable: [gnc-pricedb.cpp] rewrite price_list_insert more efficiently

Christopher Lam clam at code.gnucash.org
Wed Aug 2 11:24:22 EDT 2023


Updated	 via  https://github.com/Gnucash/gnucash/commit/040ccb79 (commit)
	from  https://github.com/Gnucash/gnucash/commit/d6b49bbc (commit)



commit 040ccb79b6c8fd8a02bda2e713b8792df4f61f72
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Jul 31 23:04:52 2023 +0800

    [gnc-pricedb.cpp] rewrite price_list_insert more efficiently
    
    no need for PriceListIsDuplStruct
    and shortcut "return true" if price is a duplicate

diff --git a/libgnucash/engine/gnc-pricedb.cpp b/libgnucash/engine/gnc-pricedb.cpp
index ffaf034a62..a216eb27e2 100644
--- a/libgnucash/engine/gnc-pricedb.cpp
+++ b/libgnucash/engine/gnc-pricedb.cpp
@@ -704,61 +704,33 @@ compare_prices_by_date(gconstpointer a, gconstpointer b)
                          gnc_price_get_guid((GNCPrice *) b));
 }
 
-typedef struct
+static bool
+price_is_duplicate (const GNCPrice *pPrice, const GNCPrice *cPrice)
 {
-    GNCPrice* pPrice;
-    gboolean isDupl;
-} PriceListIsDuplStruct;
-
-static void
-price_list_is_duplicate( gpointer data, gpointer user_data )
-{
-    GNCPrice* pPrice = (GNCPrice*)data;
-    PriceListIsDuplStruct* pStruct = (PriceListIsDuplStruct*)user_data;
-    time64 time_a, time_b;
-
-    time_a = time64CanonicalDayTime( gnc_price_get_time64( pPrice ) );
-    time_b = time64CanonicalDayTime( gnc_price_get_time64( pStruct->pPrice ) );
-
     /* If the date, currency, commodity and price match, it's a duplicate */
-    if ( !gnc_numeric_equal( gnc_price_get_value( pPrice ),  gnc_price_get_value( pStruct->pPrice ) ) ) return;
-    if ( gnc_price_get_commodity( pPrice ) != gnc_price_get_commodity( pStruct->pPrice ) ) return;
-    if ( gnc_price_get_currency( pPrice ) != gnc_price_get_currency( pStruct->pPrice ) ) return;
-
-    if (time_a != time_b) return;
-
-    pStruct->isDupl = TRUE;
+    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)));
 }
 
 gboolean
 gnc_price_list_insert(PriceList **prices, GNCPrice *p, gboolean check_dupl)
 {
-    GList *result_list;
-    PriceListIsDuplStruct* pStruct;
-    gboolean isDupl;
-
     if (!prices || !p) return FALSE;
     gnc_price_ref(p);
 
     if (check_dupl)
-    {
-        pStruct = g_new0( PriceListIsDuplStruct, 1 );
-        pStruct->pPrice = p;
-        pStruct->isDupl = FALSE;
-        g_list_foreach( *prices, price_list_is_duplicate, pStruct );
-        isDupl = pStruct->isDupl;
-        g_free( pStruct );
+        for (auto n = *prices; n; n = g_list_next (n))
+            if (price_is_duplicate (static_cast<GNCPrice*>(n->data), p))
+                return true;
 
-        if ( isDupl )
-        {
-            return TRUE;
-        }
-    }
+    auto result_list = g_list_insert_sorted(*prices, p, compare_prices_by_date);
+    if (!result_list)
+        return false;
 
-    result_list = g_list_insert_sorted(*prices, p, compare_prices_by_date);
-    if (!result_list) return FALSE;
     *prices = result_list;
-    return TRUE;
+    return true;
 }
 
 gboolean



Summary of changes:
 libgnucash/engine/gnc-pricedb.cpp | 54 ++++++++++-----------------------------
 1 file changed, 13 insertions(+), 41 deletions(-)



More information about the gnucash-changes mailing list