comp.lang.ada
 help / color / mirror / Atom feed
From: "Warren W. Gay VE3WWG" <ve3wwg@cogeco.ca>
Subject: Re: [OT] Best way to isolate a GUI?
Date: Mon, 17 Feb 2003 22:15:38 -0500
Date: 2003-02-17T22:15:38-05:00	[thread overview]
Message-ID: <3E51A55A.3000101@cogeco.ca> (raw)
In-Reply-To: v52cmesb6el614@corp.supernews.com

Randy Brukardt wrote:
> Warren W. Gay VE3WWG wrote in message <3E5121BD.4010200@cogeco.ca>...
> 
>>For input and output callback arguments, I use a discriminated record,
>>which then allows Ada95 checks on record members according to the event
>>type (ie. the record variation). This is something I wish GtkAda would
>>use.
> 
> That doesn't work well if you have callbacks which are evolving (as most
> real-world GUIs are). Adding a new variant to a record can break
> existing code (think aggregates, think name conflicts), and will require
> recompiling everything in sight.

I don't find this a particularly good argument. I want the code to break
if I change the callback requirements, even if just for one event.
Any structure changes are all localized to the variant
record, so it is very easy to locate conflicts (or simply let the compiler
do it for you). Of course not all variant record violations can be
detected at runtime (some can however).

As far as "recompiling everything in sight", I feel this is not a good
reason to avoid it. If a recompile is necessary (which GNAT _can_ determine),
then let it compile away. This is an automatic process.

Reluctance to recompile suggests that your goals are not in sync
with the end user's--  ;-)

The end goal, IMHO, is to produce a library that provides the best interface
to the user; not to be convenient to the library developer ;-)

The X11 software (a real world GUI, BTW) uses a finite number of members
in the XEvent union (albiet in C, and certainly inferior to any Ada95
variant record).  This model has been well proven and works well. The
bonus is, that if you insist on a very general structure, this too can
be accomodated in a variant record with a system.address or some such
kludge. But at least that kludge is optional, and perhaps temporary as
your GUI evolves to perfection.

So I am still unconvinced that variant records are not useful
in a callback context.  In fact, apart from one concession (below),
I think they work rather well in the "traditional callback" scheme
of things.

Whether or not the "traditional callback" is the best way to do it, is
yet another question, and open to debate.

> What we did with Claw is define a tagged type to hold the client data.
> Then an extension of it can hold any possible callback's data, including
> those that aren't defined yet. The data parameter is then a class-wide
> object of the tagged type.

User data is indeed a challenge. I took a slightly different approach
to this in a top secret ;) project that I am currently working on.
I stored the system.address of the user data in the application
context object, which is passed to every callback. Using the system.address
is bad for many reasons, but I felt this one compromise was better than
several others I would otherwise be forced to consider (the only real
exposure is if the application should free its copy of the user data
for some odd reason).

A generic function then takes as input a parameter (the application context)
provided by the callback. It then safely returns a pointer to the user
data for application callback use.

> The checking, like the variant record's, is at runtime (because you'll
> need an explicit conversion to the appropriate type in order to read the
> components). But the checking is (usually) cheaper, because it occurs in
> only one place, and it requires less code if the variant is at all
> complex.
>                Randy.

This point I might agree with you on (although a bit skeptical). If you
replace a complex variant record with a complex hierarchy of tagged
records, then I would think that there is still a significant amount
of chasing pointers etc. behind the scenes in the tagged record case.

If you have only a few instances of "case", then even with many "whens",
then I don't think the overhead needs to be extreme with the appropriate
optimizing compiler technology. I'll concede however that it might
be worse than the tagged approach.. but how much different it is, would
be an interesting study.  Maybe a good topic for a paper ;-)

It is my opinion however, that the difference is small enough to ignore
for general purpose computing purposes.

-- 
Warren W. Gay VE3WWG
http://home.cogeco.ca/~ve3wwg




  reply	other threads:[~2003-02-18  3:15 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-02-16 10:19 [OT] Best way to isolate a GUI? Jano
2003-02-16 14:47 ` Ed Falis
2003-02-16 14:49 ` Victor Porton
2003-02-17 20:52   ` Jano
2003-02-16 16:36 ` Robert C. Leif
2003-02-17  8:44   ` Preben Randhol
2003-02-17 16:22     ` Robert C. Leif
2003-02-17 17:30     ` Jeffrey Carter
2003-02-17 17:54       ` Warren W. Gay VE3WWG
2003-02-17 19:06         ` Randy Brukardt
2003-02-18  3:15           ` Warren W. Gay VE3WWG [this message]
2003-02-18 16:14             ` Robert C. Leif
2003-02-18 18:10             ` Randy Brukardt
2003-02-18 21:12               ` Warren W. Gay VE3WWG
2003-02-18 23:20                 ` Randy Brukardt
2003-02-19 18:28                   ` Warren W. Gay VE3WWG
2003-02-20 19:39                     ` Randy Brukardt
2003-02-20 21:34                       ` Warren W. Gay VE3WWG
2003-02-20  7:50                   ` Dale Stanbrough
2003-02-19 12:49                 ` Marin David Condic
2003-02-19 18:35                   ` [OT] Best way to isolate a GUI? (The final concensous?) Warren W. Gay VE3WWG
2003-02-20 12:40                     ` Marin David Condic
2003-02-20 13:13                       ` Dmitry A. Kazakov
2003-02-20 22:01                       ` Warren W. Gay VE3WWG
2003-02-21  1:25                         ` tmoran
2003-02-21  2:08                         ` Marin David Condic
2003-02-21 17:27                           ` Jeffrey Carter
2003-02-22 14:10                             ` Marin David Condic
2003-02-21 18:02                           ` Warren W. Gay VE3WWG
2003-02-22 14:49                             ` Marin David Condic
2003-02-22 22:50                               ` tmoran
2003-02-23  5:18                               ` Robert C. Leif
2003-02-24 18:06                               ` Warren W. Gay VE3WWG
2003-02-25  1:20                                 ` Robert C. Leif
2003-02-25 17:57                                   ` Warren W. Gay VE3WWG
2003-02-25 12:41                                 ` Marin David Condic
2003-02-25 13:32                                   ` Ole-Hjalmar Kristensen
2003-02-25 17:33                                     ` [OT] Best way to isolate a GUI? (The final fronteer?) Warren W. Gay VE3WWG
2003-02-20  8:26                   ` [OT] Best way to isolate a GUI? tmoran
2003-02-20 12:51                     ` Marin David Condic
2003-02-20 18:47                       ` tmoran
2003-02-17 19:31         ` tmoran
2003-02-18  1:37         ` Jeffrey Carter
2003-02-18  3:39           ` Warren W. Gay VE3WWG
2003-02-18 23:36           ` Randy Brukardt
2003-02-18 13:29         ` Marin David Condic
2003-02-18 18:01           ` Warren W. Gay VE3WWG
2003-02-19 13:06             ` Marin David Condic
2003-02-16 17:25 ` achrist
2003-02-16 21:24 ` Bobby D. Bryant
2003-02-16 21:52 ` David Marceau
2003-02-17  0:57 ` Re; " tmoran
2003-02-17  7:25   ` Jano
2003-02-17 14:09     ` Bobby D. Bryant
2003-02-17 21:12       ` Jano
2003-02-18  7:24         ` Jean-Pierre Rosen
2003-02-18 13:08 ` Marin David Condic
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox