comp.lang.ada
 help / color / mirror / Atom feed
From: "Björn Lundin" <b.f.lundin@gmail.com>
Subject: how to delete from Ada.Containers.Doubly_Linked_Lists
Date: Mon, 18 Aug 2014 20:51:17 +0200
Date: 2014-08-18T20:51:17+02:00	[thread overview]
Message-ID: <lsthum$n6e$1@dont-email.me> (raw)


Hi,
I try to get aquinted with Ada.Containers.Doubly_Linked_Lists,
which I feel may replace a homebrew list class we
use at work.

Especailly the 'for of' notation
seems nice to have.

But How do I delete an item in the list
while looping it?

I've got a sample below,
but I fell it is clumpsy.
How should a nice solution look like ?

/Björn


with Text_Io;
with Ada.Containers.Doubly_Linked_Lists;

procedure Test_List is
    type Example_Type is record
      A :Integer := 0;
      B: Integer := 0;
    end record;

    procedure To_String(E : Example_Type) is
    begin
      Text_io.Put_Line(E.A'Img & E.B'Img);
    end To_String;

begin

  Text_io.Put_Line("start Ada.Containers.Doubly_Linked_Lists; ");

  declare
    Data : Example_Type;
    package Example_Pkg is new
Ada.Containers.Doubly_Linked_Lists(Example_Type);
    List : Example_Pkg.List;
  begin

    Text_io.Put_Line("insert 5 elements at tail, ");
    for i in 1..5 loop
      Data := (A => i, B => 2 * i);
      List.Append(Data);
    end loop;

    for i of List loop
      To_String(i);
    end loop;

    Text_io.Put_Line("Update in place");

    for i of List loop
      I.A := 5*I.A;
      I.B := 50*I.B;
    end loop;

    for i of List loop
      To_String(i);
    end loop;

    Text_io.Put_Line("delete if I.a = 15");

    for c in List.Iterate loop
      declare
        i : Example_Type := Example_Pkg.Element(C);
      begin
        if I.A = 15 then
           List.Delete(C);      <-- program_error raised
        end if;
      end ;
    end loop;

    --works but clumplsy

    declare
      C_Save : Example_Pkg.Cursor;
    begin
      for c in List.Iterate loop
        declare
          i : Example_Type := Example_Pkg.Element(C);
        begin
          if I.A = 15 then
            C_Save := C;
            exit;
          end if;
        end ;
      end loop;
      List.Delete(C_Save);
    end;

    for i of List loop
      To_String(i);
    end loop;
    Text_io.Put_Line("done");
  end;
end Test_List;


sample run:

insert 5 elements at tail,
 1 2
 2 4
 3 6
 4 8
 5 10
Update in place
 5 100
 10 200
 15 300
 20 400
 25 500
delete if I.a = 15

Execution terminated by unhandled exception
Exception name: PROGRAM_ERROR
Message: attempt to tamper with cursors (list is busy)



             reply	other threads:[~2014-08-18 18:51 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-18 18:51 Björn Lundin [this message]
2014-08-18 19:57 ` how to delete from Ada.Containers.Doubly_Linked_Lists Jeffrey Carter
2014-08-19  8:56   ` Björn Lundin
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox