comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Getting the index for an element in mutually referencing containers
Date: Sat, 11 Mar 2017 19:36:47 -0600
Date: 2017-03-11T19:36:47-06:00	[thread overview]
Message-ID: <oa28ng$6vj$1@franka.jacob-sparre.dk> (raw)
In-Reply-To: ly37ekcikw.fsf@pushface.org

"Simon Wright" <simon@pushface.org> wrote in message 
news:ly37ekcikw.fsf@pushface.org...
> "Randy Brukardt" <randy@rrsoftware.com> writes:
>
>> "Mart van de Wege" <mvdwege@gmail.com> wrote in message
>> news:86wpbxneuz.fsf@gaheris.avalon.lan...
>>> Simon Wright <simon@pushface.org> writes:
>> ...
>>>> But, I really think you're going to need to use access types here. A
>>>> Person is a unique object, and should only exist once in your data
>>>> structures. A Child should hold references to its Parent(s) and vice
>>>> versa; if a Child holds *copies* of its Parents, what happens when
>>>> you change the Parent's data in one place? how are you going to find
>>>> all the copies and change all of them?
>>>>
>>> That was what I was afraid of. I like the way Ada usually takes care
>>> of this for you, but I've been trying to work it out during downtime
>>> today at work, and I'm afraid it's indeed time to grab the access
>>> types out of the toolbox.
>>
>> The trick in such cases is to have a global "person" vector, which
>> contains all of the actual Person objects. Then use the cursors into
>> that array in your other data structures. That's gives the needed
>> level of indirection without involving any actual access types
>> (meaning that you let Ada do the storage management, and depending on
>> your container implementation, also reduce/eliminate the danger of
>> dangling access types).
>
> In the general case, you'd need to cope with deleting (the equivalent
> of) Person objects.

True, but that's the dangling cursor problem, and you're certainly no worse 
off with a dangling cursor than a dangling access type. (And the container 
implementation might have detection for dangling cursors, that's not likely 
with access types.)

> And wouldn't even appending a new Person risk invalidating any existing
> cursors? AARM A18(5.k) says "Cursors *generally* remain valid as long as
> the container exists and the element referenced is not deleted",
> emphasis added. AdaCore's Vector implementation would be OK with
> inserting elements _after_ the Cursor concerned, since the Cursor is
> based on an index into an array. See discussion at AARM A18.2(240) ff.

With the exception of the Vector container, cursors always stay valid 
through operations on the container. They continue to point at the same 
element no matter what insertions/deletions occur, until of course the 
container itself is destroyed. (Generally, one can't reliably detect cursors 
that point into a destroyed container [since all of the data structures have 
been recycled], but that is a lot less likely problem than a cursor that 
points at a deleted element of a still-existing container.)

The Vector container allows "sliding" of elements, which may (or may not) 
cause a cursor to become invalid. But that can only happen with an 
insertion/deletion *in front* of the cursor -- never with Append. There's a 
bunch of special rules in the RM for that case.

If keeping the cursor stable is a priority, I'd use a list or map container 
rather than a vector. For "Person", a map seems likely (you'd want to be 
able to look them up by name, I'd think).

> I quite like the idea of using an indefinite container to hold the
> Person objects, but I think I'd use a Map with the key an integer
> (Natural?), with the next key held in a private global, incremented as
> each new Person is created. The reference to a Person would be the
> associated key.

That would work but would probably be extra work for no real reason. The 
only real advantage that I can see is that you'd get real dangling reference 
detection with that (without depending upon the container implementation). 
YMMV, of course.

> One disadvantage to this design is that Containers hold non-limited
> types. Your users run the risk of writing code that gets hold of a copy
> of the object and modifies that, rather than modifying the actual
> object.

Right. Not much that can be done about that, unfortunately. Limited types 
seem to defy reusable containerization. I've tried to design such a 
container, but there's always some reason that it won't work without 
introducing access types.

The one thing I've done with Claw programs is to declare the type 
non-limited controlled and override Adjust to raise Program_Error. [Claw 
uses non-limited types, so if you have a window extension that you don't 
want copied, you have to take some action.] But that won't work with the 
containers, as the initial copy would raise Program_Error. If you can live 
with only having default initialization, then you could modify the elements 
in place in such a scenario. But that limits one to definite types.

                               Randy.


      parent reply	other threads:[~2017-03-12  1:36 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-09 13:45 Getting the index for an element in mutually referencing containers Mart van de Wege
2017-03-09 15:25 ` Egil H H
2017-03-09 15:45   ` Mart van de Wege
2017-03-09 16:02     ` Mart van de Wege
2017-03-09 16:11     ` Egil H H
     [not found] ` <ly7f3xedp4.fsf@pushface.org>
     [not found]   ` <86k27xpikd.fsf@gaheris.avalon.lan>
     [not found]     ` <lywpbxc9my.fsf@pushface.org>
     [not found]       ` <86wpbxneuz.fsf@gaheris.avalon.lan>
     [not found]         ` <o9vcbp$t0t$1@franka.jacob-sparre.dk>
2017-03-11  6:45           ` Mart van de Wege
2017-03-11  8:40           ` Simon Wright
2017-03-11  8:58             ` Dmitry A. Kazakov
2017-03-11 11:21               ` Simon Wright
2017-03-11 14:18                 ` Dmitry A. Kazakov
2017-03-11 20:05                   ` Simon Wright
2017-03-11 20:52                     ` Dmitry A. Kazakov
2017-03-11 21:46                       ` Simon Wright
2017-03-11 22:37                         ` Niklas Holsti
2017-03-12  8:22                           ` Simon Wright
2017-03-12  9:38                             ` G.B.
2017-03-12 11:21                               ` Simon Wright
2017-03-13 10:29                             ` Alejandro R. Mosteo
2017-03-12  8:20                         ` Dmitry A. Kazakov
2017-03-12 11:30                           ` Simon Wright
2017-03-12 11:55                             ` Dmitry A. Kazakov
2017-03-12 16:44                               ` Simon Wright
2017-03-12 17:42                                 ` Dmitry A. Kazakov
2017-03-13 19:55                                   ` Randy Brukardt
2017-03-13 20:53                                     ` Dmitry A. Kazakov
2017-03-14 20:40                                       ` Randy Brukardt
2017-03-15  8:44                                         ` Dmitry A. Kazakov
2017-03-15 20:12                                           ` Randy Brukardt
2017-03-16  2:59                                             ` Paul Rubin
2017-03-16  9:04                                             ` Dmitry A. Kazakov
2017-03-13 23:25                                   ` Simon Wright
2017-03-14  8:25                                     ` Dmitry A. Kazakov
2017-03-12  1:36             ` Randy Brukardt [this message]
replies disabled

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