gnucash maint: Simplify gnc_commodity equality and compare functions.

John Ralls jralls at code.gnucash.org
Tue Jan 24 13:47:15 EST 2023


Updated	 via  https://github.com/Gnucash/gnucash/commit/46f9fb01 (commit)
	from  https://github.com/Gnucash/gnucash/commit/a81b72f0 (commit)



commit 46f9fb01c972615ff77152f0c76489d761925e15
Author: John Ralls <jralls at ceridwen.us>
Date:   Tue Jan 24 09:46:48 2023 -0800

    Simplify gnc_commodity equality and compare functions.
    
    gnc_commodity_compare is used for sorting and so needs to have a less-than
    return value. The only place it's used presents nothing to the UI; a GncGUID
    ordering is fast and stable.
    
    GnuCash allows only one commodity per book for any namespace/mnemonic pair, so
    the exhaustive string comparisons are superflous. While the current engine
    design allows only one instance of any object, meaning that a pointer comparison
    is sufficient to determine equality, that may not be true in the future, but the
    GncGUID is guaranteed to sufficiently identify a single commodity. Note that
    gnc_commodity_equiv is used to enforce that single-commodity rule and so cannot
    use GncGUID comparison.

diff --git a/libgnucash/engine/gnc-commodity.c b/libgnucash/engine/gnc-commodity.c
index ac686c4b7..4d5ecea61 100644
--- a/libgnucash/engine/gnc-commodity.c
+++ b/libgnucash/engine/gnc-commodity.c
@@ -38,6 +38,8 @@
 #include "gnc-commodity.h"
 #include "gnc-locale-utils.h"
 #include "gnc-prefs.h"
+#include "guid.h"
+#include "qofinstance.h"
 
 static QofLogModule log_module = GNC_MOD_COMMODITY;
 
@@ -1647,77 +1649,28 @@ gnc_commodity_equiv(const gnc_commodity * a, const gnc_commodity * b)
     priv_b = GET_PRIVATE(b);
     if (priv_a->name_space != priv_b->name_space) return FALSE;
     if (g_strcmp0(priv_a->mnemonic, priv_b->mnemonic) != 0) return FALSE;
+
     return TRUE;
 }
 
 gboolean
 gnc_commodity_equal(const gnc_commodity * a, const gnc_commodity * b)
 {
-    gnc_commodityPrivate* priv_a;
-    gnc_commodityPrivate* priv_b;
-    gboolean same_book;
-
-    if (a == b) return TRUE;
-
-    if (!a || !b)
-    {
-        DEBUG ("one is NULL");
-        return FALSE;
-    }
-
-    priv_a = GET_PRIVATE(a);
-    priv_b = GET_PRIVATE(b);
-    same_book = qof_instance_get_book(QOF_INSTANCE(a)) == qof_instance_get_book(QOF_INSTANCE(b));
-
-    if ((same_book && priv_a->name_space != priv_b->name_space)
-            || (!same_book && g_strcmp0( gnc_commodity_namespace_get_name(priv_a->name_space),
-                                           gnc_commodity_namespace_get_name(priv_b->name_space)) != 0))
-    {
-        DEBUG ("namespaces differ: %p(%s) vs %p(%s)",
-               priv_a->name_space, gnc_commodity_namespace_get_name(priv_a->name_space),
-               priv_b->name_space, gnc_commodity_namespace_get_name(priv_b->name_space));
-        return FALSE;
-    }
-
-    if (g_strcmp0(priv_a->mnemonic, priv_b->mnemonic) != 0)
-    {
-        DEBUG ("mnemonics differ: %s vs %s", priv_a->mnemonic, priv_b->mnemonic);
-        return FALSE;
-    }
-
-    if (g_strcmp0(priv_a->fullname, priv_b->fullname) != 0)
-    {
-        DEBUG ("fullnames differ: %s vs %s", priv_a->fullname, priv_b->fullname);
-        return FALSE;
-    }
-
-    if (g_strcmp0(priv_a->cusip, priv_b->cusip) != 0)
-    {
-        DEBUG ("cusips differ: %s vs %s", priv_a->cusip, priv_b->cusip);
-        return FALSE;
-    }
-
-    if (priv_a->fraction != priv_b->fraction)
-    {
-        DEBUG ("fractions differ: %d vs %d", priv_a->fraction, priv_b->fraction);
-        return FALSE;
-    }
-
-    return TRUE;
+    return gnc_commodity_compare(a, b) == 0;
 }
 
+// Used as a sorting callback for deleting old prices, so it needs to be
+// stable but doesn't need to be in any particular order sensible to humans.
 int gnc_commodity_compare(const gnc_commodity * a, const gnc_commodity * b)
 {
-    if (gnc_commodity_equal(a, b))
-    {
-        return 0;
-    }
-    else
-    {
-        return 1;
-    }
+    if (a == b) return 0;
+    if (a && !b) return 1;
+    if (b && !a) return -1;
+    return qof_instance_guid_compare(a, b);
 }
 
+// Used as a callback to g_list_find_custom, it should return 0
+// when the commodities match.
 int gnc_commodity_compare_void(const void * a, const void * b)
 {
     return gnc_commodity_compare(a, b);



Summary of changes:
 libgnucash/engine/gnc-commodity.c | 71 +++++++--------------------------------
 1 file changed, 12 insertions(+), 59 deletions(-)



More information about the gnucash-changes mailing list