| -- { dg-do run } |
| -- { dg-options "-gnata" } |
| |
| with Ada.Strings.Hash; |
| with Ada.Containers.Hashed_Sets; |
| with Ada.Containers.Hashed_Maps; |
| with Ada.Containers.Indefinite_Hashed_Sets; |
| with Ada.Containers.Indefinite_Hashed_Maps; |
| |
| procedure Containers2 is |
| -- Check that Cursors of the hashed containers follow the correct |
| -- predefined equality rules - that two Cursors to the same element |
| -- are equal, one one is obtained through, for example, iteration, |
| -- and the other is obtained through a search |
| |
| subtype Definite_Name is String (1 .. 5); |
| |
| type Named_Item is |
| record |
| Name : Definite_Name; |
| Item : Integer := 0; |
| end record; |
| |
| |
| function Equivalent_Item (Left, Right: Named_Item) return Boolean |
| is (Left.Name = Right.Name); |
| |
| function DI_Hash (Item: Named_Item) return Ada.Containers.Hash_Type |
| is (Ada.Strings.Hash (Item.Name)); |
| |
| package HS is new Ada.Containers.Hashed_Sets |
| (Element_Type => Named_Item, |
| Hash => DI_Hash, |
| Equivalent_Elements => Equivalent_Item); |
| |
| package IHS is new Ada.Containers.Indefinite_Hashed_Sets |
| (Element_Type => Named_Item, |
| Hash => DI_Hash, |
| Equivalent_Elements => Equivalent_Item); |
| |
| package HM is new Ada.Containers.Hashed_Maps |
| (Key_Type => Definite_Name, |
| Element_Type => Integer, |
| Hash => Ada.Strings.Hash, |
| Equivalent_Keys => "="); |
| |
| package IHM is new Ada.Containers.Indefinite_Hashed_Maps |
| (Key_Type => Definite_Name, |
| Element_Type => Integer, |
| Hash => Ada.Strings.Hash, |
| Equivalent_Keys => "="); |
| |
| Item_Data : constant array (1 .. 5) of Named_Item |
| := ((Name => "ABCDE", others => <>), |
| (Name => "FGHIJ", others => <>), |
| (Name => "KLMNO", others => <>), |
| (Name => "PQRST", others => <>), |
| (Name => "UVWXY", others => <>)); |
| |
| use type HS.Cursor; |
| use type IHS.Cursor; |
| use type HM.Cursor; |
| use type IHM.Cursor; |
| |
| type HS_Cursor_Vec is array (Item_Data'Range) of HS.Cursor; |
| type IHS_Cursor_Vec is array (Item_Data'Range) of IHS.Cursor; |
| type HM_Cursor_Vec is array (Item_Data'Range) of HM.Cursor; |
| type IHM_Cursor_Vec is array (Item_Data'Range) of IHM.Cursor; |
| |
| HSC : HS.Set; |
| IHSC : IHS.Set; |
| HMC : HM.Map; |
| IHMC : IHM.Map; |
| |
| HS_Create_Cursors : HS_Cursor_Vec; |
| IHS_Create_Cursors : IHS_Cursor_Vec; |
| HM_Create_Cursors : HM_Cursor_Vec; |
| IHM_Create_Cursors : IHM_Cursor_Vec; |
| |
| HS_Index : HS.Cursor; |
| IHS_Index : IHS.Cursor; |
| HM_Index : HM.Cursor; |
| IHM_Index : IHM.Cursor; |
| |
| HS_Find : HS.Cursor; |
| IHS_Find : IHS.Cursor; |
| HM_Find : HM.Cursor; |
| IHM_Find : IHM.Cursor; |
| |
| |
| Inserted : Boolean; |
| |
| begin |
| |
| for I in Item_Data'Range loop |
| HSC.Insert (New_Item => Item_Data(I), |
| Position => HS_Create_Cursors(I), |
| Inserted => Inserted); |
| |
| pragma Assert (Inserted); |
| |
| |
| IHSC.Insert (New_Item => Item_Data(I), |
| Position => IHS_Create_Cursors(I), |
| Inserted => Inserted); |
| |
| pragma Assert (Inserted); |
| |
| HMC.Insert (New_Item => Item_Data(I).Item, |
| Key => Item_Data(I).Name, |
| Position => HM_Create_Cursors(I), |
| Inserted => Inserted); |
| |
| pragma Assert (Inserted); |
| |
| IHMC.Insert (New_Item => Item_Data(I).Item, |
| Key => Item_Data(I).Name, |
| Position => IHM_Create_Cursors(I), |
| Inserted => Inserted); |
| |
| pragma Assert (Inserted); |
| |
| end loop; |
| |
| HS_Index := HSC.First; |
| IHS_Index := IHSC.First; |
| HM_Index := HMC.First; |
| IHM_Index := IHMC.First; |
| |
| for I in Item_Data'Range loop |
| pragma Assert (HS.Has_Element (HS_Index)); |
| pragma Assert (IHS.Has_Element (IHS_Index)); |
| pragma Assert (HM.Has_Element (HM_Index)); |
| pragma Assert (IHM.Has_Element (IHM_Index)); |
| |
| HS_Find := HSC.Find (Item_Data(I)); |
| pragma Assert (HS_Create_Cursors(I) = HS_Index); |
| pragma Assert (HS_Find = HS_Index); |
| |
| IHS_Find := IHSC.Find (Item_Data(I)); |
| pragma Assert (IHS_Create_Cursors(I) = IHS_Index); |
| pragma Assert (IHS_Find = IHS_Index); |
| |
| HM_Find := HMC.Find (Item_Data(I).Name); |
| pragma Assert (HM_Create_Cursors(I) = HM_Index); |
| pragma Assert (HM_Find = HM_Index); |
| |
| IHM_Find := IHMC.Find (Item_Data(I).Name); |
| pragma Assert (IHM_Create_Cursors(I) = IHM_Index); |
| pragma Assert (IHM_Find = IHM_Index); |
| |
| HS.Next (HS_Index); |
| IHS.Next (IHS_Index); |
| HM.Next (HM_Index); |
| IHM.Next (IHM_Index); |
| end loop; |
| |
| end; |