comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Runtime type selection
Date: Sun, 11 Oct 2009 22:06:22 +0200
Date: 2009-10-11T22:06:22+02:00	[thread overview]
Message-ID: <1fv6ippku9z2n$.rbm60r20961$.dlg@40tude.net> (raw)
In-Reply-To: 2c15c8a6-b555-4d08-8fe6-f77cb207e7a6@k33g2000yqa.googlegroups.com

On Sun, 11 Oct 2009 09:41:54 -0700 (PDT), xorque wrote:

> I'd like to develop a program that processes a graph. The contents of
> the graph are a random selection of objects of different types (all
> elements may be of the same type or may all be different - assuming
> there are enough types defined). By 'type' in this case, I am
> referring to Ada types.
> 
> The basic problem is that I want to create an object of a type picked
> at random, at runtime. I'm not entirely sure what my options are here.

The problem is that graph nodes have nothing in common. Thus there is 
nothing except for the graph traversal operations you could implement on 
the graph as a whole.

> I could create a base tagged type and derive a set of types from that
> base, selecting at random. I could use variant records. It seems that
> in either case, I'd need to create an enumeration type with a 1:1 mapping
> between enumeration values and derived types.
> 
> Both of these solutions seem a little unwieldly. They also seem like
> they'd end up making the program difficult to extend (I'd ideally just
> like to derive a new type and have it automatically available to be
> selected at random for the graph).
> 
> Any ideas would be appreciated. I appreciate the problem is a little
> abstract...

In Ada there is a way to create linked structures (in particular graphs) of 
absolutely any elements of any type.

The idea goes as follows. You create a custom storage pool which holds the 
structure of links transparently to the objects allocated in it. For 
example, when you allocate something in the pool that is considered the 
contents of a node. The pointers to its neighbours in the graph are 
allocated in the same pool in front of the object itself. The operation new 
returns the pointer to the contents. So it is really anything that can 
become a node, even a task. (There are some difficulties when nodes are 
unconstrained arrays, but that works as well.)

Simple components uses this approach to implement doubly-linked lists:

http://www.dmitry-kazakov.de/ada/components.htm#Generic_Doubly_Linked_Web

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  parent reply	other threads:[~2009-10-11 20:06 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-11 16:41 Runtime type selection xorque
2009-10-11 17:02 ` Niklas Holsti
2009-10-11 17:15   ` xorque
2009-10-11 19:54     ` Niklas Holsti
2009-10-12  9:26       ` Georg Bauhaus
2009-10-12 12:02         ` xorque
2009-10-12 23:42       ` Randy Brukardt
2009-10-13  6:50         ` Niklas Holsti
2009-10-13  0:59       ` Adam Beneschan
2009-10-13  7:01         ` Niklas Holsti
2009-10-11 17:15 ` mockturtle
2009-10-11 20:06 ` Dmitry A. Kazakov [this message]
2009-10-13 10:45   ` Colin Paul Gloster
2009-10-13 10:17     ` Dmitry A. Kazakov
2009-10-13 15:11 ` xorque
2009-10-13 15:50   ` Dmitry A. Kazakov
2009-10-13 16:02     ` xorque
replies disabled

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