[cairo] Re: cairo c++ bindings
murrayc at murrayc.com
Wed Nov 23 08:16:02 PST 2005
> Hi everyone,
>> > here's a preview
>> > http://downloads.paniq.org/cairo.hpp
>> Excellent. I encourage everyone to take a look and think about how the
>> bindings should look.
> I'm pretty new to cairo, but I've worked on a small, quite different
> C++ wrapper and I'm a little surprised of the points I read here.
> I hope my questions/remarks can interest some of you ;)
>> - It's desirable to hide the C headers from the C++ headers. Among other
>> things, that means:
>> - using numbers instead of enum values for the C++ enum values, as in
> Isn't there a risk to have the C++ enum values desynchronized with the
> C ones by doing that?
Yes, it would require automatic generation, as we use in glibmm. For now,
I've just typedefed the enums.
>> - not deriving from the C struct unless it's really necessary.
> It seems to me that deriving from the C struct is highly dangerous:
> what happen if, for a reason or another the compiler decides to add
> informations before the "relevant" data block?
> Like in:
> class Matrix : public cairo_matrix_t
> void init_identity()
> What happen if the data that cairo_matrix_init_identity is expecting
> are not at the same address as this? (let imagine a pointer to a
> potential virtual table...)
struct inheritance is a fairly reliable hack that GTK+ (and gtkmm) has
been using for a long time on a lot of platforms.
Anyway, as I said, I don't want to do this anyway.
>> - forward-declaring C struct types and using them as little as
>> in headers. #include the definition in the .cc file.
> But a wrapper should come with the smallest possible overhead, so most
> of the methods should be hinted as inline, making the #include
> <cairo.h> in the .hh necessary. (It is also needed to ensure the
> synchronization of the C and C++ enumerations).
inline is an optimisation. Optimisation should be targetted and based on
tests. I'm not going to make a library that's just a header.
>> - Non-copyable classes should have a private, undefined, copy
>> - The operator * and operator = overrides are a little odd. I'd prefer
>> explicit conversion, and that's the style used by gtkmm.
> In my opinion, a nice cairo C++ wrapper should help a developper by
> hidding him implementation details, such as the necessity of
> explicitely calling "cairo_*_reference" at each object copy.
Yes. Already done.
> What do you think?
I suggest that you wait a day or so until I've had a chance to check it
into cvs. It's not a difficult wrapper to write, so there shouldn't be
much room for disagreement.
murrayc at murrayc.com
More information about the cairo