Re: dbus glib bindings: deriving from G_TYPE_BOXED, parameterized types
- From: Matthias Clasen <mclasen redhat com>
- To: Colin Walters <walters verbum org>
- Cc: gtk-devel-list gnome org, dbus lists freedesktop org
- Subject: Re: dbus glib bindings: deriving from G_TYPE_BOXED, parameterized types
- Date: Fri, 13 May 2005 13:55:24 -0400
On Fri, 2005-05-13 at 13:01 -0400, Colin Walters wrote:
> Hi,
>
> It's rather timely that Owen mentioned the topic of deriving from
> G_TYPE_BOXED in the Cairo discussion.
>
> I've been working on the GLib bindings for the D-BUS messaging system
> (http://www.freedesktop.org/Software/dbus). The core problem I am
> running into is that D-BUS has a fully recursive type system which is
> difficult to map cleanly into GType (in its current form). You can read
> about the D-BUS type system here:
>
> http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-signatures
>
> Here is a copy of the DBus tutorial which I've patched to include a
> discussion of how my current patch to the D-BUS GLib bindings works:
>
> http://web.verbum.org/files/dbus-tutorial.html#glib-client
>
> The core approach that I've been taking now, as you can see from the
> above, is to map common D-BUS type signatures to some manually-defined
> GTypes, and punt the complex and weird ones into a special DBusGValue
> variant type. This ends up *massively* simplifying the code, both the
> API and the internal marshalling/demarshalling.
>
> However, hand-defining various types such as GArray<guint> is mildly
> painful; it's even worse for the GHashTable cartesian product. Although
> I imagine for GHashTable not all of those will be in use; e.g. everyone
> seems to be using string keys only, and not using e.g. the *int64 as
> values.
>
> Anyways though as you can see in the discussion of arrays in the
> tutorial, what I essentially want is twofold:
>
> 1) A GType for GArray and GHashTable
> 2) "parameterized" subtypes of these
>
> We need the parameterized types because the marshalling code needs to
> know what type an array contains in order to marshal, and the
> demarshalling code needs to verify that the demarshalled values match
> what a client was expecting.
>
> I talked with Matthias very briefly about this, and he mentioned that he
> thought this issue hadn't come up before because in most normal APIs,
> when you pass down e.g. a GHashTable, the library expects that it maps
> e.g. string -> uint; it's only with remoting that one needs to
> manipulate values generically.
>
> At first I was hand-defining a GType for each variant of
> GArray<subtype>, and I wrote a GType for
> GHashTable<gchararray,gchararray>. However, I decided to try to make
> this more generic by defining a GType for GArray, and then deriving a
> "parameterized" subtype from it, using a generic function that looks
> like this:
>
As I just pointed out to Colin, using derivation to model the relation
between generic types and their specializations is not really adaequate,
since you violate the substitution principle: a List<int> can not be
substituted for a List, since List promises you to store arbitrary
objectds, while List<int> can only store ints (which is why generic
types systems like the one in Java 5 don't do it like this).
We may need a different way to model the "is a specialization of this
generic type" relation.
Matthias
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]