gnucash stable: [gnc-budget] use std::optional<gnc_numeric> instead of bool+gnc_numeric
Christopher Lam
clam at code.gnucash.org
Fri Nov 17 19:59:55 EST 2023
Updated via https://github.com/Gnucash/gnucash/commit/1d26d99d (commit)
from https://github.com/Gnucash/gnucash/commit/2db3a6ba (commit)
commit 1d26d99ddb9baa2f59dd9fa347d8f65ab15e0ed6
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Fri Nov 17 21:08:14 2023 +0800
[gnc-budget] use std::optional<gnc_numeric> instead of bool+gnc_numeric
more expressive
diff --git a/libgnucash/engine/gnc-budget.cpp b/libgnucash/engine/gnc-budget.cpp
index c62552722c..e64233d63f 100644
--- a/libgnucash/engine/gnc-budget.cpp
+++ b/libgnucash/engine/gnc-budget.cpp
@@ -26,6 +26,7 @@
#include <qof.h>
#include <qofbookslots.h>
#include <qofinstance-p.h>
+#include <optional>
#include <unordered_map>
#include <vector>
#include <memory>
@@ -61,13 +62,11 @@ typedef struct
struct PeriodData
{
std::string note;
- bool value_is_set;
- gnc_numeric value;
+ std::optional<gnc_numeric> opt_value;
PeriodData () = default;
- PeriodData (const char* note, bool value_is_set, gnc_numeric value)
+ PeriodData (const char* note, std::optional<gnc_numeric> opt_value)
: note (note)
- , value_is_set (value_is_set)
- , value (value) {};
+ , opt_value (opt_value) {};
};
using PeriodDataVec = std::vector<PeriodData>;
@@ -528,7 +527,7 @@ gnc_budget_unset_account_period_value(GncBudget *budget, const Account *account,
g_return_if_fail (period_num < GET_PRIVATE(budget)->num_periods);
auto& data = get_perioddata (budget, account, period_num);
- data.value_is_set = false;
+ data.opt_value.reset();
gnc_budget_begin_edit(budget);
auto path = make_period_data_path (account, period_num);
@@ -566,14 +565,13 @@ gnc_budget_set_account_period_value(GncBudget *budget, const Account *account,
if (gnc_numeric_check(val))
{
delete budget_kvp->set_path (path, nullptr);
- perioddata.value_is_set = false;
+ perioddata.opt_value.reset();
}
else
{
KvpValue* v = new KvpValue (val);
delete budget_kvp->set_path (path, v);
- perioddata.value_is_set = true;
- perioddata.value = val;
+ perioddata.opt_value = val;
}
qof_instance_set_dirty(&budget->inst);
gnc_budget_commit_edit(budget);
@@ -588,7 +586,7 @@ gnc_budget_is_account_period_value_set (const GncBudget *budget,
guint period_num)
{
g_return_val_if_fail (period_num < GET_PRIVATE(budget)->num_periods, false);
- return get_perioddata (budget, account, period_num).value_is_set;
+ return get_perioddata (budget, account, period_num).opt_value.has_value();
}
gnc_numeric
@@ -599,10 +597,8 @@ gnc_budget_get_account_period_value (const GncBudget *budget,
g_return_val_if_fail (period_num < GET_PRIVATE(budget)->num_periods,
gnc_numeric_zero());
auto& data = get_perioddata (budget, account, period_num);
- if (!data.value_is_set)
- return gnc_numeric_zero();
- return data.value;
+ return data.opt_value.has_value() ? data.opt_value.value() : gnc_numeric_zero();
}
void
@@ -698,11 +694,11 @@ get_perioddata (const GncBudget *budget, const Account *account, guint period_nu
auto kval2 { budget_kvp->get_slot (make_period_note_path (account, i)) };
auto is_set = kval1 && kval1->get_type() == KvpValue::Type::NUMERIC;
- auto num = is_set ? kval1->get<gnc_numeric>() : gnc_numeric_zero ();
+ auto num = is_set ? std::make_optional (kval1->get<gnc_numeric>()) : std::nullopt;
auto note = (kval2 && kval2->get_type() == KvpValue::Type::STRING) ?
kval2->get<const char*>() : "";
- vec.emplace_back (note, is_set, num);
+ vec.emplace_back (note, num);
}
}
Summary of changes:
libgnucash/engine/gnc-budget.cpp | 26 +++++++++++---------------
1 file changed, 11 insertions(+), 15 deletions(-)
More information about the gnucash-changes
mailing list