comp.lang.ada
 help / color / mirror / Atom feed
From: Stephen Leake <stephen.a.leake.1@gsfc.nasa.gov>
Subject: Re: Specialization
Date: 31 May 2002 09:27:56 -0400
Date: 2002-05-31T13:35:23+00:00	[thread overview]
Message-ID: <u1ybsla5f.fsf@gsfc.nasa.gov> (raw)
In-Reply-To: ad5vj4$euo$1@wanadoo.fr

"Baugereau" <baugereau@ifrance.kom> writes:

> > This is the problem. You should (almost certainly :) have an array of
> > ELEMENTPTR, not an array of ELEMENT. When an element is added to
> > Vector, you call 'new' for it. When an element is erased from the
> > vector you call an instantiation of Unchecked_Deallocation on it. Then
> > Finalize will be called automatically, if necessary.
> >
> > See the file sal-poly-unbounded_arrays.ads
> > in SAL at http://users.erols.com/leakstan/Stephe/Ada/sal.html
> > for an example of a similar package.
> >
> > You will find that you will have to allow your generic ELEMENT type to
> > be unconstrained and/or indefinite, if the Vector package is to be
> > truly useful. For example, try to define a Vector of String. Once you
> > do that, you are forced to have an array of pointer-to-element.
> >
> 
> Ok so this is the difference of philosophy with STL's vector, which is plain
> value-oriented.
> What I dislike here is the lack of locality of the elements, and the need to
> "new" every time I add an element...
> Any comment?

I should have mentioned that there are other ways to get the Finalize
procedure called, without using Unchecked_Deallocation. 

Perhaps the cleanest is to require the client to pass in a
"Null_Value" object:

generic
   type Element is private;
   Null_Value : in Element;
package Foo is

   type Element_array is array (1 .. 10) of Element;

   procedure Empty (Item : in out Element_Array);

end Foo;

Then in the body of Empty you fill the array with Null_Value by
assignment. If Element is Controlled, this will call Finalize on the
values in the array. It is up to the client to ensure that Null_Value
is sufficiently small to not be a burden when copied lots of times.

Another way is to require the type to be derived from Controlled:

generic
   type element is new Ada.Finalization.Controlled;
package foo is
...
end foo;

But then this package is not useful for non-controlled types.

One more: require the client to pass in a Finalize procedure:

generic
   type Element is private;
   with procedure Finalize (Item : in out Element) is <>;
package Foo is
   type Element_array is array (1 .. 10) of Element;

   procedure Empty (Item : in out Element_Array);

end Foo;

Now Empty can call Finalize on each element of the array. For
non-controlled types, Finalize can be a null operation. This is the
approach I use in SAL; it allows a generic package to be
instantiated with the widest range of types.

-- 
-- Stephe



  parent reply	other threads:[~2002-05-31 13:27 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-05-30 12:39 Specialization Baugereau
2002-05-30 17:09 ` Specialization Ted Dennison
2002-05-30 17:29   ` Specialization Baugereau
2002-05-30 19:20     ` Specialization Stephen Leake
2002-05-30 19:48       ` Specialization Baugereau
2002-05-31  1:18         ` Specialization Jim Rogers
2002-05-31  5:41           ` Specialization Sergey Koshcheyev
2002-05-31 11:36             ` Specialization Baugereau
2002-05-31 14:08             ` Specialization Jim Rogers
2002-05-31 16:45               ` Specialization Hyman Rosen
2002-05-31 17:05               ` Specialization Sergey Koshcheyev
2002-05-31 17:40                 ` Specialization Hyman Rosen
2002-05-31 20:04                   ` Specialization Sergey Koshcheyev
2002-05-31 21:25                     ` Specialization Hyman Rosen
2002-05-31 13:27         ` Stephen Leake [this message]
2002-05-31 19:46           ` Specialization Simon Wright
2002-06-01 15:30             ` Specialization Stephen Leake
2002-05-31 19:44   ` Specialization Simon Wright
2002-06-01 15:25     ` Specialization Stephen Leake
2002-06-01 17:12       ` Specialization Simon Wright
2002-06-01 19:50         ` Specialization Stephen Leake
2002-05-30 17:46 ` Specialization Toshitaka Kumano
replies disabled

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