home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / komix / DATA.Z / generic_dictionary.adb < prev    next >
Text File  |  1997-10-20  |  3KB  |  120 lines

  1. -- generic_dictionary.adb
  2. --
  3. -- Copyright (c) 1996 Cadre Technologies Inc, All Rights Reserved
  4. --
  5. -- This file contains the implementation of a simple, unoptimized, generic
  6. -- dictionary package that is provided without any express or implied
  7. -- warranties and is intended for interim use in order to allow the
  8. -- compilation and linking of the generated Ada code.  This package should
  9. -- ultimately be replaced by a production quality version such as from the
  10. -- compiler vendor's program library.
  11.  
  12. with Unchecked_Deallocation;
  13. package body Generic_Dictionary is
  14.  
  15.     procedure Free is new
  16.     Unchecked_Deallocation(Dictionary_Item, Dictionary_Item_Acc);
  17.  
  18.     -- Add value V with key K to dictionary D
  19.     procedure Add(D : in out Dictionary; K : Key; V : Value) is
  20.     Item : Dictionary_Item_Acc := D.First;
  21.     Last : Dictionary_Item_Acc := null;
  22.     begin
  23.     while Item /= null loop
  24.         if Item.K = K then
  25.         raise Already_Exists;
  26.         end if;
  27.         Last := Item;
  28.         Item := Item.Next;
  29.     end loop;
  30.     Item := new Dictionary_Item;
  31.     if Last = null then
  32.         D.First := Item;
  33.     else
  34.         Last.Next := Item;
  35.     end if;
  36.     Item.K := K;
  37.     Item.V := V;
  38.     Item.Next := null;
  39.     D.Count := D.Count + 1;
  40.     end Add;
  41.  
  42.     -- Remove value with key K from dictionary D
  43.     procedure Remove(D : in out Dictionary; K : Key) is
  44.     Item : Dictionary_Item_Acc := D.First;
  45.     Last : Dictionary_Item_Acc := null;
  46.     begin
  47.     while Item /= null loop
  48.         if Item.K = K then
  49.         if Last = null then
  50.             D.First := Item.Next;
  51.         else
  52.             Last.Next := Item.Next;
  53.         end if;
  54.         D.Count := D.Count - 1;
  55.         return;
  56.         end if;
  57.         Last := Item;
  58.         Item := Item.Next;
  59.     end loop;
  60.     raise Does_Not_Exist;
  61.     end Remove;
  62.  
  63.     -- Remove all values from dictionary D
  64.     procedure Remove_All(D : in out Dictionary) is
  65.     Item : Dictionary_Item_Acc := D.First;
  66.     Next : Dictionary_Item_Acc;
  67.     begin
  68.     while Item /= null loop
  69.         Next := Item.Next;
  70.         Free(Item);
  71.         Item := Next;
  72.     end loop;
  73.     D.First := null;
  74.     D.Count := 0;
  75.     end Remove_All;
  76.  
  77.     -- Return whether or not dictionary D contains value with key K
  78.     function Has(D : Dictionary; K : Key) return Boolean is
  79.     Item : Dictionary_Item_Acc := D.First;
  80.     begin
  81.     while Item /= null loop
  82.         if Item.K = K then
  83.         return True;
  84.         end if;
  85.         Item := Item.Next;
  86.     end loop;
  87.     return False;
  88.     end Has;
  89.  
  90.     -- Return value for key K from dictionary D
  91.     function Find_Value(D : Dictionary; K : Key) return Value is
  92.     Item : Dictionary_Item_Acc := D.First;
  93.     begin
  94.     while Item /= null loop
  95.         if Item.K = K then
  96.         return Item.V;
  97.         end if;
  98.         Item := Item.Next;
  99.     end loop;
  100.     raise Does_Not_Exist;
  101.     end Find_Value;
  102.  
  103.     -- Return the number of values in D
  104.     function Count(D : Dictionary) return Natural is
  105.     begin
  106.     return D.Count;
  107.     end Count;
  108.  
  109.     -- Iterator
  110.     procedure Iterate(D : Dictionary) is
  111.     Item : Dictionary_Item_Acc := D.First;
  112.     begin
  113.     while Item /= null loop
  114.         Process(Item.K, Item.V);
  115.         Item := Item.Next;
  116.     end loop;
  117.     end Iterate;
  118.  
  119. end Generic_Dictionary;
  120.