From e6c33a39bc7ead9ea0d687efd4439f1c2913ff22 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Tue, 3 Aug 2021 22:04:55 +0800 Subject: [PATCH] [account.cpp] refactor gnc_account_get_descendants{_sorted} --- libgnucash/engine/Account.cpp | 51 +++++++++-------------------------- 1 file changed, 13 insertions(+), 38 deletions(-) diff --git a/libgnucash/engine/Account.cpp b/libgnucash/engine/Account.cpp index 85a3ce909a..b74ca52421 100644 --- a/libgnucash/engine/Account.cpp +++ b/libgnucash/engine/Account.cpp @@ -2951,52 +2951,27 @@ gnc_account_get_tree_depth (const Account *account) return depth + 1; } +static void +collect_acct (Account *account, gpointer user_data) +{ + auto listptr{static_cast(user_data)}; + *listptr = g_list_prepend (*listptr, account); +} + GList * gnc_account_get_descendants (const Account *account) { - AccountPrivate *priv; - GList *child, *descendants; - - g_return_val_if_fail(GNC_IS_ACCOUNT(account), NULL); - - priv = GET_PRIVATE(account); - if (!priv->children) - return NULL; - - descendants = NULL; - for (child = priv->children; child; child = g_list_next(child)) - { - descendants = g_list_append(descendants, child->data); - descendants = g_list_concat(descendants, - gnc_account_get_descendants(static_cast(child->data))); - } - return descendants; + GList* list = nullptr; + account_foreach_descendant (account, collect_acct, &list, FALSE); + return g_list_reverse (list); } GList * gnc_account_get_descendants_sorted (const Account *account) { - AccountPrivate *priv; - GList *child, *children, *descendants; - - /* errors */ - g_return_val_if_fail(GNC_IS_ACCOUNT(account), NULL); - - /* optimizations */ - priv = GET_PRIVATE(account); - if (!priv->children) - return NULL; - - descendants = NULL; - children = g_list_sort(g_list_copy(priv->children), (GCompareFunc)xaccAccountOrder); - for (child = children; child; child = g_list_next(child)) - { - descendants = g_list_append(descendants, child->data); - descendants = g_list_concat(descendants, - gnc_account_get_descendants_sorted(static_cast(child->data))); - } - g_list_free(children); - return descendants; + GList* list = nullptr; + account_foreach_descendant (account, collect_acct, &list, TRUE); + return g_list_reverse (list); } Account *