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
next prev 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