@@ -311,7 +311,6 @@ gnc_account_init(Account* acc)
311
311
priv->mark = 0 ;
312
312
313
313
priv->policy = xaccGetFIFOPolicy ();
314
- priv->lots = nullptr ;
315
314
316
315
priv->commodity = nullptr ;
317
316
priv->commodity_scu = 0 ;
@@ -327,6 +326,7 @@ gnc_account_init(Account* acc)
327
326
priv->starting_reconciled_balance = gnc_numeric_zero ();
328
327
priv->balance_dirty = FALSE ;
329
328
329
+ new (&priv->lots ) LotVec ();
330
330
new (&priv->children ) AccountVec ();
331
331
new (&priv->splits ) SplitsVec ();
332
332
priv->splits_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
@@ -1372,7 +1372,6 @@ static void
1372
1372
xaccFreeAccount (Account *acc)
1373
1373
{
1374
1374
AccountPrivate *priv;
1375
- GList *lp;
1376
1375
1377
1376
g_return_if_fail (GNC_IS_ACCOUNT (acc));
1378
1377
@@ -1395,18 +1394,13 @@ xaccFreeAccount (Account *acc)
1395
1394
}
1396
1395
1397
1396
/* remove lots -- although these should be gone by now. */
1398
- if (priv->lots )
1397
+ if (! priv->lots . empty () )
1399
1398
{
1400
1399
PERR (" instead of calling xaccFreeAccount(), please call\n "
1401
1400
" xaccAccountBeginEdit(); xaccAccountDestroy();\n " );
1402
1401
1403
- for (lp = priv->lots ; lp; lp = lp->next )
1404
- {
1405
- GNCLot *lot = static_cast <GNCLot*>(lp->data );
1406
- gnc_lot_destroy (lot);
1407
- }
1408
- g_list_free (priv->lots );
1409
- priv->lots = nullptr ;
1402
+ std::for_each (priv->lots .rbegin (), priv->lots .rend (), gnc_lot_destroy);
1403
+ priv->lots .~LotVec ();
1410
1404
}
1411
1405
1412
1406
/* Next, clean up the splits */
@@ -1566,14 +1560,10 @@ xaccAccountCommitEdit (Account *acc)
1566
1560
qof_collection_foreach (col, destroy_pending_splits_for_account, acc);
1567
1561
1568
1562
/* the lots should be empty by now */
1569
- for (auto lp = priv->lots ; lp; lp = lp->next )
1570
- {
1571
- GNCLot *lot = static_cast <GNCLot*>(lp->data );
1572
- gnc_lot_destroy (lot);
1573
- }
1563
+ std::for_each (priv->lots .rbegin (), priv->lots .rend (), gnc_lot_destroy);
1574
1564
}
1575
- g_list_free ( priv->lots );
1576
- priv->lots = nullptr ;
1565
+ priv->lots . clear (); // this is crucial otherwise test-engine fails
1566
+ priv->lots . ~LotVec () ;
1577
1567
1578
1568
qof_instance_set_dirty (&acc->inst );
1579
1569
qof_instance_decrease_editlevel (acc);
@@ -2109,10 +2099,10 @@ xaccAccountRemoveLot (Account *acc, GNCLot *lot)
2109
2099
g_return_if_fail (GNC_IS_LOT (lot));
2110
2100
2111
2101
priv = GET_PRIVATE (acc);
2112
- g_return_if_fail (priv->lots );
2102
+ g_return_if_fail (! priv->lots . empty () );
2113
2103
2114
2104
ENTER (" (acc=%p, lot=%p)" , acc, lot);
2115
- priv->lots = g_list_remove (priv->lots , lot);
2105
+ priv->lots . erase ( std::remove (priv->lots . begin (), priv-> lots . end (), lot), priv-> lots . end () );
2116
2106
qof_event_gen (QOF_INSTANCE (lot), QOF_EVENT_REMOVE, nullptr );
2117
2107
qof_event_gen (&acc->inst , QOF_EVENT_MODIFY, nullptr );
2118
2108
LEAVE (" (acc=%p, lot=%p)" , acc, lot);
@@ -2121,16 +2111,12 @@ xaccAccountRemoveLot (Account *acc, GNCLot *lot)
2121
2111
void
2122
2112
xaccAccountInsertLot (Account *acc, GNCLot *lot)
2123
2113
{
2124
- AccountPrivate *priv, *opriv;
2125
- Account * old_acc = nullptr ;
2126
- Account* lot_account;
2127
-
2128
2114
/* errors */
2129
2115
g_return_if_fail (GNC_IS_ACCOUNT (acc));
2130
2116
g_return_if_fail (GNC_IS_LOT (lot));
2131
2117
2132
2118
/* optimizations */
2133
- lot_account = gnc_lot_get_account (lot);
2119
+ auto lot_account = gnc_lot_get_account (lot);
2134
2120
if (lot_account == acc)
2135
2121
return ;
2136
2122
@@ -2139,13 +2125,12 @@ xaccAccountInsertLot (Account *acc, GNCLot *lot)
2139
2125
/* pull it out of the old account */
2140
2126
if (lot_account)
2141
2127
{
2142
- old_acc = lot_account;
2143
- opriv = GET_PRIVATE (old_acc);
2144
- opriv-> lots = g_list_remove (opriv-> lots , lot );
2128
+ auto & lot_acc_lots = GET_PRIVATE ( lot_account)-> lots ;
2129
+ lot_acc_lots. erase ( std::remove (lot_acc_lots. begin (), lot_acc_lots. end (), lot),
2130
+ lot_acc_lots. end () );
2145
2131
}
2146
2132
2147
- priv = GET_PRIVATE (acc);
2148
- priv->lots = g_list_prepend (priv->lots , lot);
2133
+ GET_PRIVATE (acc)->lots .push_back (lot);
2149
2134
gnc_lot_set_account (lot, acc);
2150
2135
2151
2136
/* Don't move the splits to the new account. The caller will do this
@@ -2221,7 +2206,7 @@ xaccAccountMoveAllSplits (Account *accfrom, Account *accto)
2221
2206
2222
2207
/* Finally empty accfrom. */
2223
2208
g_assert (from_priv->splits .empty ());
2224
- g_assert (from_priv->lots == nullptr );
2209
+ g_assert (from_priv->lots . empty () );
2225
2210
xaccAccountCommitEdit (accfrom);
2226
2211
xaccAccountCommitEdit (accto);
2227
2212
@@ -3918,7 +3903,9 @@ LotList *
3918
3903
xaccAccountGetLotList (const Account *acc)
3919
3904
{
3920
3905
g_return_val_if_fail (GNC_IS_ACCOUNT (acc), nullptr );
3921
- return g_list_copy (GET_PRIVATE (acc)->lots );
3906
+ auto priv = GET_PRIVATE (acc);
3907
+ return std::accumulate (priv->lots .rbegin (), priv->lots .rend (),
3908
+ static_cast <GList*>(nullptr ), g_list_prepend);
3922
3909
}
3923
3910
3924
3911
LotList *
@@ -3928,16 +3915,13 @@ xaccAccountFindOpenLots (const Account *acc,
3928
3915
gpointer user_data, GCompareFunc sort_func)
3929
3916
{
3930
3917
AccountPrivate *priv;
3931
- GList *lot_list;
3932
3918
GList *retval = nullptr ;
3933
3919
3934
3920
g_return_val_if_fail (GNC_IS_ACCOUNT (acc), nullptr );
3935
3921
3936
3922
priv = GET_PRIVATE (acc);
3937
- for (lot_list = priv->lots ; lot_list; lot_list = lot_list-> next )
3923
+ for (auto lot : priv->lots )
3938
3924
{
3939
- GNCLot *lot = static_cast <GNCLot*>(lot_list->data );
3940
-
3941
3925
/* If this lot is closed, then ignore it */
3942
3926
if (gnc_lot_is_closed (lot))
3943
3927
continue ;
@@ -3962,8 +3946,8 @@ xaccAccountForEachLot(const Account *acc,
3962
3946
g_return_val_if_fail (GNC_IS_ACCOUNT (acc), nullptr );
3963
3947
g_return_val_if_fail (proc, nullptr );
3964
3948
3965
- for (auto node = GET_PRIVATE (acc)->lots ; node; node = node-> next )
3966
- if (auto result = proc (GNC_LOT (node-> data ) , data))
3949
+ for (auto lot : GET_PRIVATE (acc)->lots )
3950
+ if (auto result = proc (lot , data))
3967
3951
return result;
3968
3952
3969
3953
return nullptr ;
0 commit comments