comp.lang.ada
 help / color / mirror / Atom feed
From: Matthew Heaney <mheaney@on2.com>
Subject: Re: OO Style with Ada Containers
Date: Tue, 20 Nov 2007 13:57:35 -0800 (PST)
Date: 2007-11-20T13:57:35-08:00	[thread overview]
Message-ID: <58f1006e-2bbb-4736-a70f-90d139b9c04a@e4g2000hsg.googlegroups.com> (raw)
In-Reply-To: 400347d7-aa93-4175-a3dc-e415ad0d9ca3@i29g2000prf.googlegroups.com

On Nov 20, 4:13 pm, Maciej Sobczak <see.my.homep...@gmail.com> wrote:
>
> You cannot do arithmetics with cursors. They don't have appropriate
> operators and the examples you shown work with indices, not with
> cursors. Cursors themselves can be only incremented and decremented.

Well, if it makes any difference you could write:

generic
  with package Vector_Types is
    new Ada.Containers.Vectors (<>);
  use Vector_Types;

  V : access constant Vector;  --verify this
  -- you could also try
  -- V : in Vector;

package Vector_Cursor_Operations is

  function "+" (C : Cursor; I : Index_Type'Base)
    return Cursor;

  function "-" (L, R : Cursor) return Index_Type'Base;

end Vector_Cursor_Operations;


package body Vector_Cursor_Operations is

  function "+" (C : Cursor; I : Index_Type'Base)
    return Cursor
  is
    J : Index_Type'Base;

  begin
    if Has_Element (C) then
       J := V.Last_Index + 1;
    else
       J := To_Index (C);
    end if;

    return To_Cursor (V, J + I);
  end "+";

  function "-" (L, R : Cursor) return Index_Type'Base is
  begin
    if Has_Element (L) then
       if Has_Element (R) then
          return To_Index (L) - To_Index (R);
       else
          return No_Index;  --?
       end if;
    elsif Has_Element (R) then
       return V.Last_Index + 1 - To_Index (R);
    else
       return No_Index;  --?
    end if;
  end "-";

end Vector_Cursor_Operations;

The semantics needed to be nailed down but that should give you the
general idea.  Then you can say:

procedure Op (V : Integer_Vectors.Vector) is
  package Cursor_Ops is
    new Vector_Cursor_Operations
   (Integer_Vectors,
    V'Access);  -- verify this
  use Cursor_Ops;

  Middle : constant Cursor :=
    V.First + (No_Element - V.First) / 2;

begin
  Sort (V.First, Middle);
  Sort (Middle, No_Element);
end Op;



  reply	other threads:[~2007-11-20 21:57 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-11-14 23:28 OO Style with Ada Containers braver
2007-11-14 23:50 ` Adam Beneschan
2007-11-14 23:59   ` braver
2007-11-15  0:24     ` braver
2007-11-15  9:36       ` Ludovic Brenta
2007-11-15 10:36         ` braver
2007-11-15 11:35           ` Ludovic Brenta
2007-11-15 13:50             ` braver
2007-11-19  2:45               ` Matthew Heaney
2007-11-15 18:22             ` braver
2007-11-15 20:18               ` Ludovic Brenta
2007-11-19  2:48                 ` Matthew Heaney
2007-11-19  2:47               ` Matthew Heaney
2007-11-19  2:39             ` Matthew Heaney
2007-11-19  2:38           ` Matthew Heaney
2007-11-19  2:36         ` Matthew Heaney
2007-11-19  2:24       ` Matthew Heaney
2007-11-23 10:28         ` braver
2007-11-23 13:29           ` Martin Krischik
2007-11-23 14:19             ` Georg Bauhaus
2007-11-25 13:38           ` Ludovic Brenta
2007-11-26  3:58             ` Matthew Heaney
2007-11-26  3:55           ` Matthew Heaney
2007-11-23 22:25         ` braver
2007-11-23 22:46           ` Pascal Obry
2007-11-23 22:52             ` braver
2007-11-26  4:09               ` Matthew Heaney
2007-11-26  4:07             ` Matthew Heaney
2007-11-26  4:03           ` Matthew Heaney
2007-11-26 13:45             ` Matthew Heaney
2007-11-26 19:09               ` braver
2007-11-26 20:29                 ` Matthew Heaney
2007-11-27 19:31                   ` Georg Bauhaus
2007-11-27 20:12                     ` Matthew Heaney
2007-11-25 14:08         ` braver
2007-11-26  4:21           ` Matthew Heaney
2007-11-19  1:04   ` Matthew Heaney
2007-11-15  8:43 ` Dmitry A. Kazakov
2007-11-15 14:04   ` Maciej Sobczak
2007-11-19  2:53     ` Matthew Heaney
2007-11-19 13:44       ` Maciej Sobczak
2007-11-19 14:44         ` Martin
2007-11-19 15:51         ` Matthew Heaney
2007-11-19 17:33           ` Markus E L
2007-11-19 21:29           ` Maciej Sobczak
2007-11-19 22:16             ` Matthew Heaney
2007-11-19 22:22               ` Matthew Heaney
2007-11-20 14:11               ` Maciej Sobczak
2007-11-20 17:00                 ` Matthew Heaney
2007-11-20 17:17                   ` Matthew Heaney
2007-11-20 21:13                   ` Maciej Sobczak
2007-11-20 21:57                     ` Matthew Heaney [this message]
2007-11-21  4:51                     ` Matthew Heaney
2007-11-21  9:18                       ` Georg Bauhaus
2007-11-21 15:59                         ` Maciej Sobczak
2007-11-21 17:41                           ` Georg Bauhaus
2007-11-21 22:25                         ` Jeffrey R. Carter
2007-11-20 18:06                 ` Georg Bauhaus
2007-11-19 16:19         ` Dmitry A. Kazakov
2007-11-19 20:45           ` Maciej Sobczak
2007-11-20  2:24             ` Matthew Heaney
2007-11-20  9:06             ` Dmitry A. Kazakov
2007-11-20 12:16               ` Georg Bauhaus
2007-11-21 15:17                 ` Dmitry A. Kazakov
2007-11-19  2:50   ` Matthew Heaney
2007-11-19  1:03 ` Matthew Heaney
replies disabled

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