comp.lang.ada
 help / color / mirror / Atom feed
From: Georg Bauhaus <bauhaus@futureapps.de>
Subject: Re: How to use associative arrays in Ada 2005?
Date: Fri, 24 Nov 2006 01:33:49 +0100
Date: 2006-11-24T01:33:45+01:00	[thread overview]
Message-ID: <1164328429.5590.61.camel@localhost.localdomain> (raw)
In-Reply-To: <1164310051.811802.237400@l12g2000cwl.googlegroups.com>

On Thu, 2006-11-23 at 11:27 -0800, snoopysalive wrote:

> 
> The statement "Ages.Insert("family name",Insert("name",23));" doesn't
> work. So, how is it possible to do something like this in C++:
> "...
> map<string, map<string,int>> ages;
> ages["family name"]["name"] = 23;
> ..."

I think that in this case the Ada.Containers requirement
of being minimal building blocks applies. And probably also
the principle of query/command separation, which is not followed
by std::map::operator[].  [] does many things at the same time,
hence it is not minimal.

If I remember Matt's tutorial correctly, there is an example showing how
to manipulate items in containers in situ. Barnes' book has this, too.

If the elements in a map are containers themselves (or are
otherwise big), you may want to use Update_Element.

If you have                +-----------+
                      +--> |   ...     |
   +-------------+    |    +-----------+
   |    ...      |  --+    |   ...     |  +-->  ...
   +-------------+       +----------+     |
   | family name |  -->  |   ...    |  ---+
   +-------------+       +----------+
   |    ...      |       |   name   |  ------>  23
                         +----------+
                         |   ...    |

That is in order to manipulate one of the 2nd level maps,
you could either:

- Get the element at key "family name", which is a map.
  This creates a copy of the map.
- Manipulate the copied map.
- Put the map back to where it had been (at key "family name"),
  again copying.

Or,

- Get a cursor for the element at key "family name".
- Define a subprogram that manipulates the 2nd level map
  (the one containing "name" as key).
- Call Update_Element with the cursor and the subprogram.

with Ada.Text_IO,
     Ada.Strings.Hash,
     Ada.Containers.Indefinite_Hashed_Maps;
use  Ada.Text_IO,
     Ada.Strings,
     Ada.Containers;

procedure book2 is
    package Str_Int_Maps is
        new Ada.Containers.Indefinite_Hashed_Maps
            (String,
             Integer,
             Ada.Strings.Hash,
             "=");
    use Str_Int_Maps;
    package Str_Map_Maps is
        new Ada.Containers.Indefinite_Hashed_Maps
            (String,
             Str_Int_Maps.Map,
             Ada.Strings.Hash,
             "=");

    Ages : Str_Map_Maps.Map; -- That's the "hash of a hash"
    Named_Age: Str_Int_Maps.Map;


    -- life by population statistics:

    Average: constant Natural := 80;
    function Grow_Older(Now: Integer) return Integer is separate;
        -- used to compute a new `Age` from `Now`

    Age: Integer := 0;

    procedure Set_Age(name: String; value: in out Str_Int_Maps.Map) is
    begin
        Named_Age.Include("name", Age);  -- Note how `Age` is used here
    end Set_Age;

begin
    Ages.Insert("family name", Named_Age);

    while Age < Average loop
        Age := Grow_Older(Age);

        -- 
        Ages.Update_Element(position => Ages.Find("family name"),
                            process => Set_Age'access); -- in situ
    end loop;
end book2;

This might seem like a lot, but once you have your setup, you
can reuse it, or write []-style wrappers, if you need them
etc..  Scope is important in this example, because the `Age`
variable is visible to Set_Age, and need not be passed around.





  parent reply	other threads:[~2006-11-24  0:33 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-21 10:11 How to use associative arrays in Ada 2005? snoopysalive
2006-11-21 11:49 ` Georg Bauhaus
2006-11-21 14:18 ` Matthew Heaney
2006-11-21 23:35   ` snoopysalive
2006-11-23 19:27     ` snoopysalive
2006-11-23 19:40       ` Georg Bauhaus
2006-11-24  0:33       ` Georg Bauhaus [this message]
2006-11-24 11:49         ` Matthew Heaney
2006-11-24  8:27       ` Dmitry A. Kazakov
2006-11-24 11:51         ` Matthew Heaney
2006-11-26 19:05           ` snoopysalive
2006-11-26 20:30             ` Matthew Heaney
2006-11-27  9:15             ` Dmitry A. Kazakov
2006-11-27 19:53               ` Matthew Heaney
2006-11-27 21:11                 ` Dmitry A. Kazakov
2006-11-27 21:52                   ` Matthew Heaney
2006-11-28  8:29                     ` Alex R. Mosteo
2006-11-28 13:19                       ` Matthew Heaney
2006-11-28  8:34                     ` Dmitry A. Kazakov
2006-11-28 13:21                       ` Matthew Heaney
2006-11-27 21:08             ` Simon Wright
2006-11-27 22:22               ` Matthew Heaney
2006-11-27 22:58                 ` Simon Wright
2006-11-28  1:55                   ` Matthew Heaney
2006-11-24 11:35       ` Matthew Heaney
replies disabled

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