-
Notifications
You must be signed in to change notification settings - Fork 800
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Better c++ #1965
base: stable
Are you sure you want to change the base?
Better c++ #1965
Conversation
447f6b1
to
1e37258
Compare
27f6336
to
95cfcf9
Compare
That would be better as multiple PRs. It's ok to make a chain of them, just say in the comments who depends on who. |
4420619
to
d622929
Compare
c26698e
to
abb7efb
Compare
abb7efb
to
29b6034
Compare
29b6034
to
8d8f53a
Compare
8bf8cb9
to
2f2cf6a
Compare
That last commit about centralizing GValue got me to realize that since you're writing C++ here and accessing the KvpFrames directly, there's no need for GValues at all, use Edit: Better yet move them to qofinstance. The whole point of the GValue dodge was to provide a generic interface similar to g_object_[sg]et for C code. It doesn't make sense to have a bunch of template <typename T> T
qof_instance_get_path_value(QofInstance* inst, Path path)
{
auto kvp_value{inst->get_slot(path)};
return kvp_value->get<T>();
}
template <typename T> void
qof_instance_set_path_value(QofInstance* inst, Path path, T value)
{
KvpValue kvp_value(value);
inst->kvp_data->set_path(path, kvp_value);
} Then to handle the edit level and marking-dirty in Account.cpp you'd have template <typename T>
set_slot_from_path(Account* acc, Path path, T value)
{
xaccAccountBeginEdit(acc);
qof_instance_set_path_value(QOF_INSTANCE(acc), path, value);
mark_account(acc);
xaccAccountCommitEdit(acc);
} When calling |
0d4725d
to
3e3b714
Compare
Not quite because Edit: alternatively we could return |
The last issue is the |
d8230e3
to
563c974
Compare
If you're going to bury the template declaration in a cpp file, which speeds up compilation especially when rebuilding and avoids ODR problems if the template gets used with the same args in more than one compilation unit, then you have to force instantiation in the cpp file for all of the types you want to use it with. That's just some simple declarations, see gnc-options.cpp for examples. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
note these are overloaded functions returning type T instead of
getting/setting GValues
That's unclear. They're template overrides with std::optional replacing the GValue containing T.
This is pretty close, just a few tweaks left.
7a2b391
to
066d271
Compare
if last-num is empty-string, remove the slot. this makes the behaviour consistent with other slots.
e52a405
to
0a6fcb8
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I still want the QofInstance* NULL check in qof_instance_get_path_kvp and get_kvp_gnc_foo_path removed.
You made a typo in your last commit that causes tests to fail.
e146210
to
793c14d
Compare
if the last two are ok I'll tidy up and merge in. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not quite, you went in the opposite direction I had in mind. The null/wrong type check needs to be at the lowest level to protect against some future use that doesn't do it. There's no harm in doing it also nearer the source to make a more usefult tracefile.
f3b8a17
to
2e285c7
Compare
these overloaded functions to kvp slots do not require GValue
which do not require GValue dance small modification of xaccAccountSetLastNum behaviour with empty-string last_num
2e285c7
to
fbaf27e
Compare
to be selectively merged after 5.7.
gnc_account_foreach_descendant
for c++ use.