From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!news.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Jeffrey Carter Newsgroups: comp.lang.ada Subject: Re: how to delete from Ada.Containers.Doubly_Linked_Lists Date: Mon, 18 Aug 2014 12:57:15 -0700 Organization: Also freenews.netfront.net; news.tornevall.net; news.eternal-september.org Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit Injection-Date: Mon, 18 Aug 2014 19:57:16 +0000 (UTC) Injection-Info: mx05.eternal-september.org; posting-host="c80a4d3163c70168f86ada42dbeebdf3"; logging-data="21379"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18bbCnf/vgYkPD2QXOULT8E+xswMXKQ0eE=" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.0 In-Reply-To: Cancel-Lock: sha1:sXseIXX1dVF5oeXEfQT6HPfgXzw= Xref: news.eternal-september.org comp.lang.ada:21809 Date: 2014-08-18T12:57:15-07:00 List-Id: On 08/18/2014 11:51 AM, Björn Lundin wrote: > > > I've got a sample below, > but I fell it is clumpsy. > How should a nice solution look like ? You probably ought to read about "tampering with cursors" in the ARM (A.18.3). In your case, iterating over the list needs the list to remain unchanged until iteration finishes. Deleting during iteration would violate this. This restriction is intended for safety, and sometimes seems onerous. I've had to iterate over one data structure, storing cursors in another data structure, then iterate over the 2nd data structure to delete using the stored cursors. You can delete during iteration if you don't invoke an Iterate subprogram: declare C : Example_Pkg.Cursor := List.First; Next : Example_Pkg.Cursor; use type Example_Pkg.Cursor; begin loop exit when C = Example_Pkg.No_Element; declare I : constant Example_Type := Example_Pkg.Element (C); begin if I.A /= 15 then Example_Pkg.Next (Position => C); else Next := Example_Pkg.Next (C); List.Delete (Position => C); C := Next; end if; end ; end loop; end; -- Jeff Carter "You a big nose have it." Never Give a Sucker an Even Break 107