Hi guys!
One thing I noticed while browsing around Inkscape source, was the pattern
"allocate temp gtk string, call some api, deallocate temp string".
I think it makes sense to make a small "TempGString" class that captures
this (RAII) pattern, and deallocates the string on going out of scope. This
would have some advantages compared to current approach:
1) string would be freed regardless of how the code exits the block
(exceptions e.g.)
2) 2 lines instead of 3
3) easier on the eyes
Sample before-after code snippet:
Before:
if (!qname_prefix(code).id()) {
gchar *svg_name = g_strconcat(prefix, ":", g_quark_to_string(code),
NULL);
repr->setCodeUnsafe(g_quark_from_string(svg_name));
g_free(svg_name);
}
After:
if (!qname_prefix(code).id()) {
TempGString svg_name(g_strconcat(prefix, ":", g_quark_to_string(code),
NULL));
repr->setCodeUnsafe(g_quark_from_string(svg_name));
}
Syntax highlighted version available here:
http://pastebin.com/t7p0TVfj
The constructor takes the freshly allocated string, and the destructor
calls g_free on it. There is an operator overload so that contexts that
expect ordinary pointers to gchar* gets what it want. This automagic
casting is a point I'm a bit ambivalent about myself; I wouldn't mind
having an accessor function "get_gchar_ptr()" or similar just to be super
explicit, thoughts on that?
I don't think this would break anything, however it might be that I'm
ignorant to some weird behaviour of ghar* or glib/gtk?
On a convention/code style notion, I looked through the code for RAII
(worst abbreviation for something so clear/simple semantically) and noticed
it's used in a couple other places, however I've still been wary of
introducing this refactoring to the code base as I don't know if you guys
would like it.
The pattern occurs on at least 140 places in the code base.
Cheers,
/Olof