comp.lang.ada
 help / color / mirror / Atom feed
From: Matthew Heaney <matthewjheaney@earthlink.net>
Subject: Re: Usage of Interfaces with Ada 95
Date: Sun, 28 Sep 2003 21:50:53 GMT
Date: 2003-09-28T21:50:53+00:00	[thread overview]
Message-ID: <uhe2wh97s.fsf@earthlink.net> (raw)
In-Reply-To: j6aj41-7tj.ln1@boavista.snafu.de

Michael Erdmann <Michael.Erdmann@snafu.de> writes:

> Again the iterator is nice example. For example if you take a group of
> developers you will find an agreement that something like an iterator
> is nessecary. But if you let them build there code independently, you
> will find that all are using iterators on various but with slightly
> different interfaces. I my example i like to provide a package
> enumerator where the developer X can put in his data type, but the
> gerneric package forces him to implement the interface for his data
> type and nothing else. If the semantic of this interface is simple, it
> will be mutch easier for somebody else to maintain the code written on
> this concept.

You still haven't groked the static polymorphism idea.

If I have the following generic algorithm:

  generic
     type Iterator_Type is private;
     with function Succ (Iterator : Iterator_Type)
       return Iterator_Type is <>;
     with procedure Process (Iterator : Iterator_Type) is <>;
     with function "=" (L, R : Iterator_Type)
       return Boolean is <>;
  procedure Generic_Algorithm (First, Back : Iterator_Type);

Then of course this is going to check how iterators are declared by
independent developers -- as soon as he tries to instantiate the generic
algorithm.  Any iterator any developer builds must conform to this
logical interface.

You want the do the check at the time of compilation of the declaration
of the iterator type.  I don't.  I defer the check until the time of
compilation of the instantiation of the generic algorithm.

If you understand the difference then you understand static
polymorphism.  Forget about Java because it's only going to confuse you.

One consequence of defering the check is that is doesn't matter if
independent developers come up with different iterator interfaces.  The
generic algorithm doesn't care, because it only cares about the logical
properties of the iterator, not the syntax of the declaration.

The algorithm above is written with Charles iterators in mind.  So
naturally it's simple to instantiate it.  Let's start with a list:

  package List_Types is new Charles.Lists.Double.Unbounded (ET);

  procedure Op (List : List_Types.Container_Type) is

     procedure Process (I : List_Types.Iterator_Type) is
        E : ET := Element (I);
     begin
        ... -- do whatever
     end;

     procedure Algorithm is
        new Generic_Algorithm (Iterator_Type);  -- accept defaults
  begin
     Algorithm (First (List), Back (List));
  end;


Now let's use the generic algorithm on a vector, which doesn't have an
iterator type:

   package Vector_Types is new Charles.Vectors.Unbounded
     (Index_Typey => IT,
      Element_Type => ET);

   procedure Op (Vector : Vector_Type.Container_Type) is

      procedure Process (I : IT) is
         E : ET := Element (Vector, Index => I);
      begin
         ... -- do whatever
      end;

     procedure Algorithm is
        new Generic_Algorithm
             (Iterator_Type => IT,  -- index subtype
              Succ          => IT'Succ);
  begin
     Algorithm (First (Vector), Back (Vector));
  end;


Now let's use the generic algorithm again, on an array, which doesn't
have an iterator type either:

   procedure Op (A : Array_Subtype) is

      procedure Process (I : IT) is
         E : ET renames A (I);
      begin
         ... -- do whatever
      end;

     procedure Algorithm is
        new Generic_Algorithm
             (Iterator_Type => IT,  -- index subtype
              Succ          => IT'Succ);
  begin
     Algorithm (First => A'First, Back => A'First + A'Length);
  end;


In your original example, your preferred iterator style is to have
operations First, Next, and HasMoreElement.  Let's use the generic
algorithm above on your iterator:

   procedure Op (C : in CT) is

      procedure Process (I : IT) is
        E : ET := Get_Element (I); -- or whatever
      begin
        ... -- do whatever
      end;

      function Is_Done (Iter, Back : IT) return Boolean is
      begin
         return not HasMoreElement (Iter);  -- ignore Back
      end;
     
      procedure Algorithm is
        new Generic_Algorithm
             (Iterator_Type => IT,  -- index subtype
              Succ          => Next,
              "="           => Is_Done);

      Dummy : IT;

   begin -- Op

      Algorithm (First (C), Back => Dummy);

   end Op;


So here you have 4 different containers, each with a different iteration
scheme.  Yet there is only a single generic algorithm.

If you understand how this all works then you will understand static
polymorphism.  Forget about Java because it's only going to confuse you.






  reply	other threads:[~2003-09-28 21:50 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-09-26 16:36 Usage of Interfaces with Ada 95 Michael Erdmann
2003-09-26 16:50 ` chris
2003-09-26 16:55 ` Hyman Rosen
2003-09-26 19:10   ` Michael Erdmann
2003-09-26 20:37     ` Hyman Rosen
2003-09-27 15:05       ` Michael Erdmann
2003-09-28  2:11         ` Matthew Heaney
2003-09-29  2:25         ` George Shapovalov
2003-09-28  2:14   ` Matthew Heaney
2003-09-28  8:28     ` Michael Erdmann
2003-09-28 14:33       ` Matthew Heaney
2003-09-28 15:09         ` Michael Erdmann
2003-09-28 21:50           ` Matthew Heaney [this message]
2003-09-30  4:57             ` Michael Erdmann
2003-09-30 10:02               ` Mário Amado Alves
2003-09-30 12:31               ` Matthew Heaney
2003-09-30 19:58                 ` Michael Erdmann
2003-09-28 17:10         ` Simon Wright
2003-09-28 21:52           ` Matthew Heaney
2003-09-28 21:58           ` Matthew Heaney
2003-09-29 19:37             ` Georg Bauhaus
2003-09-29 19:45               ` Georg Bauhaus
2003-09-30  7:10               ` Preben Randhol
2003-09-29 20:11             ` Simon Wright
2003-09-29 22:56               ` Matthew Heaney
2003-09-30 14:53                 ` Matthew Heaney
2003-09-30 16:13                   ` Preben Randhol
2003-09-29 13:49           ` Matthew Heaney
2003-09-28 18:22       ` Robert I. Eachus
2003-09-29  3:02         ` Hyman Rosen
2003-09-30  3:11           ` Robert I. Eachus
2003-09-30 13:38             ` Hyman Rosen
2003-09-30 21:46               ` Robert I. Eachus
2003-09-30 22:10                 ` Hyman Rosen
2003-10-01  2:30                   ` Robert I. Eachus
2003-10-01  2:41                   ` Robert I. Eachus
2003-10-01 13:21                     ` Hyman Rosen
2003-10-01 17:01                       ` Robert I. Eachus
2003-10-01 18:46                       ` Matthew Heaney
2003-09-29 14:52       ` Stephen Leake
2003-09-29 23:00         ` Matthew Heaney
2003-09-30 12:49           ` Marin David Condic
2003-09-30 23:48             ` 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