From b2b87921107132c98ee2d69221d944195aa29008 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Mon, 22 Feb 2021 18:13:21 +0800 Subject: [PATCH] prepend-and-reverse instead of O(N^2) append --- gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c | 7 +++---- gnucash/gnome-utils/gnc-tree-view-account.c | 3 ++- gnucash/gnome/assistant-loan.cpp | 4 +++- gnucash/gnome/dialog-imap-editor.c | 5 +---- gnucash/gnome/dialog-lot-viewer.c | 4 ++-- gnucash/gnome/gnc-budget-view.c | 4 ++-- gnucash/gnome/gnc-plugin-page-register.c | 9 +++++---- gnucash/gnome/gnc-plugin-page-register2.c | 9 +++++---- libgnucash/app-utils/gnc-sx-instance-model.c | 3 ++- libgnucash/core-utils/gnc-glib-utils.c | 4 ++-- libgnucash/engine/SX-book.c | 4 ++-- libgnucash/engine/ScrubBusiness.c | 3 ++- libgnucash/engine/Transaction.c | 6 +++--- libgnucash/engine/gncCustomer.c | 4 ++-- 14 files changed, 36 insertions(+), 33 deletions(-) diff --git a/gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c b/gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c index ea9fbcd240..c71c2a0a21 100644 --- a/gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c +++ b/gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c @@ -192,11 +192,10 @@ gsidca_get_contained(GncDenseCalModel *model) { GncSxInstances *sx_instances = (GncSxInstances*)sxes->data; if (xaccSchedXactionGetEnabled(sx_instances->sx)) - { - list = g_list_append(list, GUINT_TO_POINTER(GPOINTER_TO_UINT(sx_instances->sx))); - } + list = g_list_prepend (list, GUINT_TO_POINTER + (GPOINTER_TO_UINT (sx_instances->sx))); } - return list; + return g_list_reverse (list); } static gchar* diff --git a/gnucash/gnome-utils/gnc-tree-view-account.c b/gnucash/gnome-utils/gnc-tree-view-account.c index 0da39e1171..0c7a79f150 100644 --- a/gnucash/gnome-utils/gnc-tree-view-account.c +++ b/gnucash/gnome-utils/gnc-tree-view-account.c @@ -1557,7 +1557,7 @@ get_selected_accounts_helper (GtkTreeModel *s_model, /* Only selected if it passes the filter */ if (gtvsi->priv->filter_fn == NULL || gtvsi->priv->filter_fn(account, gtvsi->priv->filter_data)) { - gtvsi->return_list = g_list_append(gtvsi->return_list, account); + gtvsi->return_list = g_list_prepend (gtvsi->return_list, account); } } @@ -1580,6 +1580,7 @@ gnc_tree_view_account_get_selected_accounts (GncTreeViewAccount *view) info.priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view)); gtk_tree_selection_selected_foreach(selection, get_selected_accounts_helper, &info); + info.return_list = g_list_reverse (info.return_list); return info.return_list; } diff --git a/gnucash/gnome/assistant-loan.cpp b/gnucash/gnome/assistant-loan.cpp index aed5ba46e6..04d0e604d2 100644 --- a/gnucash/gnome/assistant-loan.cpp +++ b/gnucash/gnome/assistant-loan.cpp @@ -3014,13 +3014,15 @@ loan_create_sxes( LoanAssistantData *ldd ) g_string_free( gstr, TRUE ); gstr = NULL; - repaySXes = g_list_append( repaySXes, tcSX ); + repaySXes = g_list_prepend (repaySXes, tcSX); } /* repayment */ ld_setup_repayment_sx( ldd, rod, paymentSX, tcSX ); } + + repaySXes = g_list_reverse (repaySXes); /* Create the SXes */ { GList *l; diff --git a/gnucash/gnome/dialog-imap-editor.c b/gnucash/gnome/dialog-imap-editor.c index d97b6d69e5..cd4a70bef4 100644 --- a/gnucash/gnome/dialog-imap-editor.c +++ b/gnucash/gnome/dialog-imap-editor.c @@ -308,7 +308,7 @@ find_invalid_mappings (GtkTreeModel *model, GtkTreePath *path, if (((g_strcmp0 (head, "online_id") == 0) && (depth == 1)) || (depth == 2)) { GtkTreeRowReference *rowref = gtk_tree_row_reference_new (model, path); - *rowref_list = g_list_append (*rowref_list, rowref); + *rowref_list = g_list_prepend (*rowref_list, rowref); } } g_free (head); @@ -325,9 +325,6 @@ gnc_imap_remove_invalid_maps (ImapDialog *imap_dialog) (GtkTreeModelForeachFunc)find_invalid_mappings, &rr_list); - // reverse the reference list - rr_list = g_list_reverse (rr_list); - // Suspend GUI refreshing gnc_suspend_gui_refresh(); diff --git a/gnucash/gnome/dialog-lot-viewer.c b/gnucash/gnome/dialog-lot-viewer.c index 68fc900f2f..f9e004fbc9 100644 --- a/gnucash/gnome/dialog-lot-viewer.c +++ b/gnucash/gnome/dialog-lot-viewer.c @@ -228,12 +228,12 @@ lv_show_splits_free (GNCLotViewer *lv) Split *split = node->data; if (NULL == xaccSplitGetLot(split)) { - filtered_list = g_list_append(filtered_list, split); + filtered_list = g_list_prepend (filtered_list, split); } } /* display list */ - gnc_split_viewer_fill(lv, lv->split_free_store, filtered_list); + gnc_split_viewer_fill(lv, lv->split_free_store, g_list_reverse (filtered_list)); } /* ======================================================================== */ diff --git a/gnucash/gnome/gnc-budget-view.c b/gnucash/gnome/gnc-budget-view.c index ad4d5aae3a..43faf78f80 100644 --- a/gnucash/gnome/gnc-budget-view.c +++ b/gnucash/gnome/gnc-budget-view.c @@ -1629,7 +1629,7 @@ gnc_budget_view_refresh (GncBudgetView *budget_view) if (col != NULL) { gtk_tree_view_append_column (priv->totals_tree_view, col); - totals_col_list = g_list_append (totals_col_list, col); + totals_col_list = g_list_prepend (totals_col_list, col); } num_periods_visible = g_list_length (col_list); @@ -1639,7 +1639,7 @@ gnc_budget_view_refresh (GncBudgetView *budget_view) gdk_rgba_free (note_color_selected); priv->period_col_list = col_list; - priv->totals_col_list = totals_col_list; + priv->totals_col_list = g_list_reverse (totals_col_list); if (priv->total_col == NULL) { diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c index 100953f8d7..6a7390848e 100644 --- a/gnucash/gnome/gnc-plugin-page-register.c +++ b/gnucash/gnome/gnc-plugin-page-register.c @@ -3722,7 +3722,7 @@ gnc_plugin_page_register_cmd_print_check (GtkAction* action, { if (xaccSplitGetAccount (split) == account) { - splits = g_list_append (splits, split); + splits = g_list_prepend (splits, split); gnc_ui_print_check_dialog_create (window, splits); g_list_free (splits); } @@ -3733,7 +3733,7 @@ gnc_plugin_page_register_cmd_print_check (GtkAction* action, split = gnc_split_register_get_current_trans_split (reg, NULL); if (split) { - splits = g_list_append (splits, split); + splits = g_list_prepend (splits, split); gnc_ui_print_check_dialog_create (window, splits); g_list_free (splits); } @@ -5349,18 +5349,19 @@ gppr_account_destroy_cb (Account* account) ledger_type = gnc_ledger_display_type (priv->ledger); if (ledger_type == LD_GL) { - kill = g_list_append (kill, page); + kill = g_list_prepend (kill, page); /* kill it */ } else if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT)) { if (guid_compare (acct_guid, &priv->key) == 0) { - kill = g_list_append (kill, page); + kill = g_list_prepend (kill, page); } } } + kill = g_list_reverse (kill); /* Now kill them. */ for (item = kill; item; item = g_list_next (item)) { diff --git a/gnucash/gnome/gnc-plugin-page-register2.c b/gnucash/gnome/gnc-plugin-page-register2.c index da9cb4c29a..034a8a8d0e 100644 --- a/gnucash/gnome/gnc-plugin-page-register2.c +++ b/gnucash/gnome/gnc-plugin-page-register2.c @@ -2614,7 +2614,7 @@ gnc_plugin_page_register2_cmd_print_check (GtkAction *action, { if (xaccSplitGetAccount(split) == account) { - splits = g_list_append(splits, split); + splits = g_list_prepend (splits, split); gnc_ui_print_check_dialog_create (window, splits); g_list_free(splits); } @@ -2625,7 +2625,7 @@ gnc_plugin_page_register2_cmd_print_check (GtkAction *action, split = gnc_tree_model_split_reg_trans_get_split_equal_to_ancestor(trans, account); if (split) { - splits = g_list_append(splits, split); + splits = g_list_prepend (splits, split); gnc_ui_print_check_dialog_create (window, splits); g_list_free(splits); } @@ -4008,18 +4008,19 @@ gppr_account_destroy_cb (Account *account) ledger_type = gnc_ledger_display2_type (priv->ledger); if (ledger_type == LD2_GL) { - kill = g_list_append(kill, page); + kill = g_list_prepend (kill, page); /* kill it */ } else if ((ledger_type == LD2_SINGLE) || (ledger_type == LD2_SUBACCOUNT)) { if (guid_compare(acct_guid, &priv->key) == 0) { - kill = g_list_append(kill, page); + kill = g_list_prepend (kill, page); } } } + kill = g_list_reverse (kill); /* Now kill them. */ for (item = kill; item; item = g_list_next(item)) { diff --git a/libgnucash/app-utils/gnc-sx-instance-model.c b/libgnucash/app-utils/gnc-sx-instance-model.c index 465cf68df7..f281f40b8a 100644 --- a/libgnucash/app-utils/gnc-sx-instance-model.c +++ b/libgnucash/app-utils/gnc-sx-instance-model.c @@ -522,9 +522,10 @@ gnc_sx_get_instances(const GDate *range_end, gboolean include_disabled) SchedXaction *sx = (SchedXaction*)sx_iter->data; if (xaccSchedXactionGetEnabled(sx)) { - enabled_sxes = g_list_append(enabled_sxes, sx); + enabled_sxes = g_list_prepend (enabled_sxes, sx); } } + enabled_sxes = g_list_reverse (enabled_sxes); instances->sx_instance_list = gnc_g_list_map(enabled_sxes, (GncGMapFunc)_gnc_sx_gen_instances, (gpointer)range_end); g_list_free(enabled_sxes); } diff --git a/libgnucash/core-utils/gnc-glib-utils.c b/libgnucash/core-utils/gnc-glib-utils.c index 836678ca16..b452921511 100644 --- a/libgnucash/core-utils/gnc-glib-utils.c +++ b/libgnucash/core-utils/gnc-glib-utils.c @@ -265,9 +265,9 @@ gnc_g_list_map(GList* list, GncGMapFunc fn, gpointer user_data) GList *rtn = NULL; for (; list != NULL; list = list->next) { - rtn = g_list_append(rtn, (*fn)(list->data, user_data)); + rtn = g_list_prepend (rtn, (*fn)(list->data, user_data)); } - return rtn; + return g_list_reverse (rtn); } void diff --git a/libgnucash/engine/SX-book.c b/libgnucash/engine/SX-book.c index b5465992d8..e15cb57f0b 100644 --- a/libgnucash/engine/SX-book.c +++ b/libgnucash/engine/SX-book.c @@ -380,12 +380,12 @@ gnc_sx_get_sxes_referencing_account(QofBook *book, Account *acct) GncGUID *guid = NULL; qof_instance_get (QOF_INSTANCE (s), "sx-account", &guid, NULL); if (guid_equal(acct_guid, guid)) - rtn = g_list_append(rtn, sx); + rtn = g_list_prepend (rtn, sx); guid_free (guid); } } - return rtn; + return g_list_reverse (rtn); } /* ========================== END OF FILE =============================== */ diff --git a/libgnucash/engine/ScrubBusiness.c b/libgnucash/engine/ScrubBusiness.c index 6adb52a197..d775157ef9 100644 --- a/libgnucash/engine/ScrubBusiness.c +++ b/libgnucash/engine/ScrubBusiness.c @@ -400,9 +400,10 @@ gncScrubLotDanglingPayments (GNCLot *lot) if (gnc_numeric_compare (gnc_numeric_abs (free_val), gnc_numeric_abs (ll_val)) > 0) continue; - filtered_list = g_list_append(filtered_list, free_split); + filtered_list = g_list_prepend (filtered_list, free_split); } + filtered_list = g_list_reverse (filtered_list); match_list = gncSLFindOffsSplits (filtered_list, ll_val); g_list_free (filtered_list); diff --git a/libgnucash/engine/Transaction.c b/libgnucash/engine/Transaction.c index 6cd2e855aa..1635ba277f 100644 --- a/libgnucash/engine/Transaction.c +++ b/libgnucash/engine/Transaction.c @@ -569,7 +569,7 @@ xaccTransSortSplits (Transaction *trans) split = node->data; if (gnc_numeric_negative_p (xaccSplitGetValue(split))) continue; - new_list = g_list_append(new_list, split); + new_list = g_list_prepend (new_list, split); } /* then credits */ @@ -578,12 +578,12 @@ xaccTransSortSplits (Transaction *trans) split = node->data; if (!gnc_numeric_negative_p (xaccSplitGetValue(split))) continue; - new_list = g_list_append(new_list, split); + new_list = g_list_prepend (new_list, split); } /* install newly sorted list */ g_list_free(trans->splits); - trans->splits = new_list; + trans->splits = g_list_reverse (new_list); } diff --git a/libgnucash/engine/gncCustomer.c b/libgnucash/engine/gncCustomer.c index b7c547d940..7d0c47939f 100644 --- a/libgnucash/engine/gncCustomer.c +++ b/libgnucash/engine/gncCustomer.c @@ -705,9 +705,9 @@ GList * gncCustomerGetJoblist (const GncCustomer *cust, gboolean show_all) { GncJob *j = iterator->data; if (gncJobGetActive (j)) - list = g_list_append (list, j); + list = g_list_prepend (list, j); } - return list; + return g_list_reverse (list); } }