-- -- Copyright (C) 2014-2022, AdaCore -- SPDX-License-Identifier: Apache-2.0 -- with Ada.Containers.Vectors; package body Gpr_Parser_Support.Iterators is ------------- -- Iterate -- ------------- procedure Iterate (I : in out Iterator'Class; Proc : access procedure (Element : Element_Type)) is Element : Element_Type; begin while I.Next (Element) loop Proc (Element); end loop; end Iterate; ------------- -- Consume -- ------------- function Consume (I : Iterator'Class) return Element_Array is package Element_Vectors is new Ada.Containers.Vectors (Positive, Element_Type); Element : Element_Type; V : Element_Vectors.Vector; begin -- Note: This is bad design in Ada: We're hiding mutation of the -- Iterator object, because if we make it mutable, then you can no -- longer call consume on an expression that returns an Iterator, which -- in user APIs is not very friendly, because it means you cannot write -- write:: -- -- for Element of Node.Find (...).Consume loop -- ... -- end loop; -- -- You have to declare the iterator explicitly. while I'Unrestricted_Access.Next (Element) loop V.Append (Element); end loop; declare Result : Element_Array (1 .. Natural (V.Length)); begin for I in Result'Range loop Result (I) := V.Element (I); end loop; return Result; end; end Consume; end Gpr_Parser_Support.Iterators;