home *** CD-ROM | disk | FTP | other *** search
/ PC World 1997 November / PCWorld_1997-11_cd.bin / software / programy / komix / DATA.Z / generic_ordered_set.adb < prev    next >
Text File  |  1997-03-24  |  3KB  |  106 lines

  1. -- generic_ordered.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. -- ordered set 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_Ordered_Set is
  14.  
  15.     procedure Free is new
  16.     Unchecked_Deallocation(Ordered_Set_Item, Ordered_Set_Item_Acc);
  17.  
  18.     -- Add element E to set S; raises Already_Exists if E already exists in S
  19.     procedure Add(S : in out Ordered_Set; E : Element) is
  20.     Item : Ordered_Set_Item_Acc := S.First;
  21.     Last : Ordered_Set_Item_Acc := null;
  22.     begin
  23.     while Item /= null loop
  24.         if Item.Elem = E then
  25.         raise Already_Exists;
  26.         end if;
  27.         Last := Item;
  28.         Item := Item.Next;
  29.     end loop;
  30.     Item := new Ordered_Set_Item;
  31.     if Last = null then
  32.         S.First := Item;
  33.     else
  34.         Last.Next := Item;
  35.     end if;
  36.     Item.Elem := E;
  37.     Item.Next := null;
  38.     S.Count := S.Count + 1;
  39.     end Add;
  40.  
  41.     -- Remove element E from set S; raises Does_Not_Exist if S doesn't have E
  42.     procedure Remove(S : in out Ordered_Set; E : Element) is
  43.     Item : Ordered_Set_Item_Acc := S.First;
  44.     Last : Ordered_Set_Item_Acc := null;
  45.     begin
  46.     while Item /= null loop
  47.         if Item.Elem = E then
  48.         if Last = null then
  49.             S.First := Item.Next;
  50.         else
  51.             Last.Next := Item.Next;
  52.         end if;
  53.         S.Count := S.Count - 1;
  54.         return;
  55.         end if;
  56.         Last := Item;
  57.         Item := Item.Next;
  58.     end loop;
  59.     raise Does_Not_Exist;
  60.     end Remove;
  61.  
  62.     -- Remove all elements from set S
  63.     procedure Remove_All(S : in out Ordered_Set) is
  64.     Item : Ordered_Set_Item_Acc := S.First;
  65.     Next : Ordered_Set_Item_Acc;
  66.     begin
  67.     while Item /= null loop
  68.         Next := Item.Next;
  69.         Free(Item);
  70.         Item := Next;
  71.     end loop;
  72.     S.First := null;
  73.     S.Count := 0;
  74.     end Remove_All;
  75.  
  76.     -- Return whether or not set S contains element E
  77.     function Has(S : Ordered_Set; E : Element) return Boolean is
  78.     Item : Ordered_Set_Item_Acc := S.First;
  79.     begin
  80.     while Item /= null loop
  81.         if Item.Elem = E then
  82.         return True;
  83.         end if;
  84.         Item := Item.Next;
  85.     end loop;
  86.     return False;
  87.     end Has;
  88.  
  89.     -- Return the number of elements in S
  90.     function Count(S : Ordered_Set) return Natural is
  91.     begin
  92.     return S.Count;
  93.     end Count;
  94.  
  95.     -- Iterator
  96.     procedure Iterate(S : Ordered_Set) is
  97.     Item : Ordered_Set_Item_Acc := S.First;
  98.     begin
  99.     while Item /= null loop
  100.         Process(Item.Elem);
  101.         Item := Item.Next;
  102.     end loop;
  103.     end Iterate;
  104.  
  105. end Generic_Ordered_Set;
  106.