comp.lang.ada
 help / color / mirror / Atom feed
From: Ludovic Brenta <ludovic@ludovic-brenta.org>
Subject: Re: OO Style with Ada Containers
Date: Thu, 15 Nov 2007 10:36:54 +0100
Date: 2007-11-15T10:36:54+01:00	[thread overview]
Message-ID: <87oddv3l55.fsf@ludovic-brenta.org> (raw)
In-Reply-To: 1195086265.070953.93180@d55g2000hsg.googlegroups.com

braver <deliverable@gmail.com> writes:
> my sample application [...] gets a Vector of tokens and inserts them
> into an Ordered_Map to count word occurrences:

I don't think you need to store all the tokens.  All you need is a
Hashed_Set (which stores objects without duplication).  I would do
something like

   type Word_Counter is
      Word : Ada.Strings.Unbounded.Unbounded_String;
      Count : Natural;
   end Word_Counter;

   function Equivalent (L, R: Word_Counter) is
      use type Ada.Strings.Unbounded.Unbounded_String;
   begin
      return L.Word = R.Word; -- ignore Count in the comparison
   end Equivalent;

   function Hash (Element : Word_Counter) is
   begin
      return Ada.Strings.Unbounded.Hash (Element.Word);
   end Hash;

   package Word_Counter_Hashed_Sets is
     new Ada.Containers.Hadhed_Sets
       (Element_Type => Word_Counter,
        Hash => Hash,
        Equivalent_Elements => Equivalent);

   Counters : Word_Counter_Hashed_Sets.Set;
   Current_Word : Ada.Strings.Unbounded.Unbounded_String;
   Position : Word_Counter_Hashed_Sets.Cursor;
   use type Word_Counter_Hashed_Sets.Cursor;
begin
   ...
   Current_Word := Get_Next_Word;
   Position := Counters.Find (Current_Word);
   if Position = Word_Counter_Hashed_Sets.No_Element then
      Counters.Insert (New_Item => (Word => Current_Word, Count => 1));
   else
      declare
         E : constant Word_Counter := Counters.Element (Position);
      begin
         Counters.Replace_Element
            (Position => Position,
             New_Item => (Word => E.Word, -- [1]
                          Counter => E.Counter + 1));
      end;
   end if;
   ...
end;

(does [1] duplicate E.Word each time we increment the counter?  If so,
consider using
Ada.Containers.Hashed_Sets.Generic_Keys.Update_Element_Preserving_Keys).

> -- would need to import "=" for private type WC.Cursor:
> -- if Ngram_Cursor = WC.No_Element

declare
   use type WC.Cursor;
begin
   if Ngram_Cursor = WC.No_Element then

> I'd appreciate any improvements to the above, which I deduced from ARM

HTH

-- 
Ludovic Brenta.




  reply	other threads:[~2007-11-15  9:36 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-11-14 23:28 OO Style with Ada Containers braver
2007-11-14 23:50 ` Adam Beneschan
2007-11-14 23:59   ` braver
2007-11-15  0:24     ` braver
2007-11-15  9:36       ` Ludovic Brenta [this message]
2007-11-15 10:36         ` braver
2007-11-15 11:35           ` Ludovic Brenta
2007-11-15 13:50             ` braver
2007-11-19  2:45               ` Matthew Heaney
2007-11-15 18:22             ` braver
2007-11-15 20:18               ` Ludovic Brenta
2007-11-19  2:48                 ` Matthew Heaney
2007-11-19  2:47               ` Matthew Heaney
2007-11-19  2:39             ` Matthew Heaney
2007-11-19  2:38           ` Matthew Heaney
2007-11-19  2:36         ` Matthew Heaney
2007-11-19  2:24       ` Matthew Heaney
2007-11-23 10:28         ` braver
2007-11-23 13:29           ` Martin Krischik
2007-11-23 14:19             ` Georg Bauhaus
2007-11-25 13:38           ` Ludovic Brenta
2007-11-26  3:58             ` Matthew Heaney
2007-11-26  3:55           ` Matthew Heaney
2007-11-23 22:25         ` braver
2007-11-23 22:46           ` Pascal Obry
2007-11-23 22:52             ` braver
2007-11-26  4:09               ` Matthew Heaney
2007-11-26  4:07             ` Matthew Heaney
2007-11-26  4:03           ` Matthew Heaney
2007-11-26 13:45             ` Matthew Heaney
2007-11-26 19:09               ` braver
2007-11-26 20:29                 ` Matthew Heaney
2007-11-27 19:31                   ` Georg Bauhaus
2007-11-27 20:12                     ` Matthew Heaney
2007-11-25 14:08         ` braver
2007-11-26  4:21           ` Matthew Heaney
2007-11-19  1:04   ` Matthew Heaney
2007-11-15  8:43 ` Dmitry A. Kazakov
2007-11-15 14:04   ` Maciej Sobczak
2007-11-19  2:53     ` Matthew Heaney
2007-11-19 13:44       ` Maciej Sobczak
2007-11-19 14:44         ` Martin
2007-11-19 15:51         ` Matthew Heaney
2007-11-19 17:33           ` Markus E L
2007-11-19 21:29           ` Maciej Sobczak
2007-11-19 22:16             ` Matthew Heaney
2007-11-19 22:22               ` Matthew Heaney
2007-11-20 14:11               ` Maciej Sobczak
2007-11-20 17:00                 ` Matthew Heaney
2007-11-20 17:17                   ` Matthew Heaney
2007-11-20 21:13                   ` Maciej Sobczak
2007-11-20 21:57                     ` Matthew Heaney
2007-11-21  4:51                     ` Matthew Heaney
2007-11-21  9:18                       ` Georg Bauhaus
2007-11-21 15:59                         ` Maciej Sobczak
2007-11-21 17:41                           ` Georg Bauhaus
2007-11-21 22:25                         ` Jeffrey R. Carter
2007-11-20 18:06                 ` Georg Bauhaus
2007-11-19 16:19         ` Dmitry A. Kazakov
2007-11-19 20:45           ` Maciej Sobczak
2007-11-20  2:24             ` Matthew Heaney
2007-11-20  9:06             ` Dmitry A. Kazakov
2007-11-20 12:16               ` Georg Bauhaus
2007-11-21 15:17                 ` Dmitry A. Kazakov
2007-11-19  2:50   ` Matthew Heaney
2007-11-19  1:03 ` 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