Perfect! Now I understand the methodology to implement setter for a structure. Do you think it would make sense to have a macro for this? Say, _MEMBER_SET_CHAR.
-Pavlo Solntsev --------------------------------------------------------------------------------------------- *Please avoid sending me Word or PowerPoint attachments.See http://www.gnu.org/philosophy/no-word-attachments.html <http://www.gnu.org/philosophy/no-word-attachments.html>* On Fri, Feb 23, 2018 at 9:43 AM, Kjell Ahlstedt <[email protected]> wrote: > Den 2018-02-23 kl. 15:36, skrev Pavlo Solntsev: > > >>> Your concern is justified. The Glib::ustring must be returned by > value. The _MEMBER_GET should be > It is interesting. getter must return by value.... > > >>> Your _MEMBER_SET macro doesn't seem to fit the generated code that you > show. I would think that > >>> _MEMBER_SET(name, name, const Glib::ustring&, gchar*) > > from https://github.com/GNOME/glibmm/blob/master/tools/m4/member.m4 > My understanding that the generated type will be const T& if T is provided > to the macros. > > dnl Creates accessors for simple types: > > define(`_MEMBER_SET',`dnl > > ifelse(`$5',`deprecated',`_DEPRECATE_IFDEF_START ')dnl > > void set_$1(const $3`'& value); > > ifelse(`$5',`deprecated',`_DEPRECATE_IFDEF_END ')dnl > > _PUSH(SECTION_CC) > > ifelse(`$5',`deprecated',`_DEPRECATE_IFDEF_START ')dnl > > void __CPPNAME__::set_$1(const $3`'& value) > > { > > gobj()->$2 = _CONVERT($3,$4,`value'); > > } > > ifelse(`$5',`deprecated',`_DEPRECATE_IFDEF_END ')dnl > > > _POP()') > > > > > Sorry, I was wrong. _MEMBER_SET(name, name, Glib::ustring, gchar*) > does generate the code you showed. > > >> would generate that code. In this case a reference is OK, but it looks > like the generated code can cause a memory leak. Who owns the duplicated > string? Who deallocates it? What if gobj()->name contains a pointer to a > string when set_name() is called? > > > Basically once again, return by value. What would be the correct wrap for > the simple struct? Wrap struct and manually wrap set/get method? > > I will investigate how private members are stored and how they related to > the original C struct. Thanks > > In Glib::OptionEntry, _MEMBER_SET is not used for strings. Those methods > are hand-coded to avoid a memory leak. Example: > > void OptionEntry::set_long_name(const Glib::ustring& value) > { > if (gobject_->long_name) > { > g_free((gchar*)(gobject_->long_name)); > gobject_->long_name = nullptr; > } > > gobj()->long_name = (value).c_str() ? g_strdup((value).c_str()) : > nullptr; > } > > > Don't ask me why value.c_str() is tested for nullptr. I don't understand. > I don't think it can ever be a nullptr. And even if it is, g_strdup() can > handle that. > > > > -Pavlo Solntsev > > >
_______________________________________________ gtkmm-list mailing list [email protected] https://mail.gnome.org/mailman/listinfo/gtkmm-list
