diff options
Diffstat (limited to 'gcc/ada/a-cbhama.adb')
-rw-r--r-- | gcc/ada/a-cbhama.adb | 63 |
1 files changed, 43 insertions, 20 deletions
diff --git a/gcc/ada/a-cbhama.adb b/gcc/ada/a-cbhama.adb index d7c75d44aaf..471193079b5 100644 --- a/gcc/ada/a-cbhama.adb +++ b/gcc/ada/a-cbhama.adb @@ -34,15 +34,18 @@ with Ada.Containers.Hash_Tables.Generic_Bounded_Keys; pragma Elaborate_All (Ada.Containers.Hash_Tables.Generic_Bounded_Keys); with Ada.Containers.Prime_Numbers; use Ada.Containers.Prime_Numbers; +with Ada.Finalization; use Ada.Finalization; with System; use type System.Address; package body Ada.Containers.Bounded_Hashed_Maps is - type Iterator is new - Map_Iterator_Interfaces.Forward_Iterator with record - Container : Map_Access; - Node : Count_Type; - end record; + type Iterator is new Limited_Controlled and + Map_Iterator_Interfaces.Forward_Iterator with + record + Container : Map_Access; + end record; + + overriding procedure Finalize (Object : in out Iterator); overriding function First (Object : Iterator) return Cursor; @@ -393,6 +396,22 @@ package body Ada.Containers.Bounded_Hashed_Maps is HT_Ops.Free (Container, X); end Exclude; + -------------- + -- Finalize -- + -------------- + + procedure Finalize (Object : in out Iterator) is + begin + if Object.Container /= null then + declare + B : Natural renames Object.Container.all.Busy; + + begin + B := B - 1; + end; + end if; + end Finalize; + ---------- -- Find -- ---------- @@ -424,14 +443,8 @@ package body Ada.Containers.Bounded_Hashed_Maps is end First; function First (Object : Iterator) return Cursor is - M : constant Map_Access := Object.Container; - N : constant Count_Type := HT_Ops.First (M.all); begin - if N = 0 then - return No_Element; - else - return Cursor'(Object.Container.all'Unchecked_Access, N); - end if; + return Object.Container.First; end First; ----------------- @@ -656,7 +669,7 @@ package body Ada.Containers.Bounded_Hashed_Maps is Process (Cursor'(Container'Unrestricted_Access, Node)); end Process_Node; - B : Natural renames Container'Unrestricted_Access.Busy; + B : Natural renames Container'Unrestricted_Access.all.Busy; -- Start of processing for Iterate @@ -675,12 +688,17 @@ package body Ada.Containers.Bounded_Hashed_Maps is end Iterate; function Iterate - (Container : Map) return Map_Iterator_Interfaces.Forward_Iterator'class + (Container : Map) return Map_Iterator_Interfaces.Forward_Iterator'Class is - Node : constant Count_Type := HT_Ops.First (Container); - It : constant Iterator := (Container'Unrestricted_Access, Node); + B : Natural renames Container'Unrestricted_Access.all.Busy; + begin - return It; + return It : constant Iterator := + (Limited_Controlled with + Container => Container'Unrestricted_Access) + do + B := B + 1; + end return; end Iterate; --------- @@ -770,11 +788,16 @@ package body Ada.Containers.Bounded_Hashed_Maps is Position : Cursor) return Cursor is begin - if Position.Node = 0 then + if Position.Container = null then return No_Element; - else - return (Object.Container, Next (Position).Node); end if; + + if Position.Container /= Object.Container then + raise Program_Error with + "Position cursor of Next designates wrong map"; + end if; + + return Next (Position); end Next; ------------------- |