comp.lang.ada
 help / color / mirror / Atom feed
From: Dmitry A. Kazakov <mailbox@dmitry-kazakov.de>
Subject: Re: discriminant in constraint must appear alone
Date: Wed, 03 Dec 2003 10:06:41 +0100
Date: 2003-12-03T10:06:41+01:00	[thread overview]
Message-ID: <h49rsvs791br3ch637nv8odvao62jr3pq0@4ax.com> (raw)
In-Reply-To: Yh7zb.396856$HS4.3208207@attbi_s01

On Tue, 02 Dec 2003 21:15:36 GMT, tmoran@acm.org wrote:

>> > I want to define a discriminated record type with two arrays. One array
>> only half the size
>> > of the other. Below is the type definition that I want to use.
>> >
>> >   type R (D : Positive) is
>> >      record
>> >         A : String (1 .. D);
>> >         B : String (1 .. D / 2);
>> >      end record;
>> >Are there other possiblities?
>
>>    type R (D1, D2 : Positive) is new Ada.Finalization.Controlled with
>
>  If you use Controlled, then this could be one of those occasions where
>access types are really useful.
>
>  type String_Ptr_Type is access String;
>  procedure Free is new Ada.Unchecked_Conversion(String, String_Ptr_Type);
>  type R (D : Positive) is
>     record
>        A : String_Ptr_Type;
>        B : String_Ptr_Type;
>     end record;
>
>Then "R.A" needs to be "R.A.all", but R.A(i) can stay untouched.
>
>   procedure Initialize (Obj : in out R) is
>   begin
>     A := new String(1 .. Obj.D);
>     B := new String(1 .. Obj.D/2);
>   end Initialize;
>   procedure Finalize (Obj : in out R) is
>   begin
>     Free(Obj.B);
>     Free(Obj.A);
>   end Finalize;

Well, if heap allocation comes into play then better:

   type R is new Ada.Finalization.Controlled with private;
   function Create (D : Positive) return R;  -- Constructor
   procedure Adjust (X : in out R);  -- Copying constructor
   procedure Finalize (X : in out R);  -- Destructor
   function A (X : R) return String; -- Getters
   function B (X : R) return String;
   ...
private
   type R_Implementation (D1, D2 : Positive) is record
      A : String (1..D1);
      B : String (1..D2);
   end R_Implementation;
   type R_Implementation_Ptr is access R_Implementation;

   type R is new Ada.Finalization.Controlled with record
      Implementation : R_Implementation_Ptr;
   end record;

Implemented like:

function Create (D : Positive) return R is
begin
   return
   (  Implementation =>
         new R_Implementation (D, D / 2)
   );
end Create;

procedure Adjust (X : in out R) is
begin
  X.Implementation :=
      new R_Implementation'(X.Implementation.all);
end Adjust;

procedure Finalize (X : in out R) is
begin
  Free (X.Implementation);
end Finalize;

---------
But I think it is better to change the standard! (:-))

--
Regards,
Dmitry Kazakov
http://www.dmitry-kazakov.de



  reply	other threads:[~2003-12-03  9:06 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-12-02 19:43 discriminant in constraint must appear alone Vincent Smeets
2003-12-02 20:56 ` Randy Brukardt
2003-12-02 21:15   ` tmoran
2003-12-03  9:06     ` Dmitry A. Kazakov [this message]
2003-12-03  0:06 ` Robert I. Eachus
2003-12-03 21:02 ` Vincent Smeets
2003-12-04 19:16   ` Randy Brukardt
2003-12-05  0:56     ` info version of Ada Reference Manual Stephen Leake
2003-12-05  1:08       ` Stephane Richard
2003-12-05  1:27       ` Ludovic Brenta
2003-12-05  4:36       ` Fionn mac Cuimhaill
2003-12-05  5:28         ` [Totally OT] Nick Roberts
2003-12-05 14:07         ` info version of Ada Reference Manual Stephen Leake
2003-12-05 14:18       ` Arthur Evans Jr
2003-12-05 14:52         ` Stephen Leake
2003-12-07 15:22           ` Arthur Evans Jr
2003-12-05 14:28       ` Georg Bauhaus
replies disabled

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