comp.lang.ada
 help / color / mirror / Atom feed
From: Simon Belmont <sbelmont700@gmail.com>
Subject: Building limited types through nested creator functions
Date: Sun, 5 Feb 2012 14:03:21 -0800 (PST)
Date: 2012-02-05T14:03:21-08:00	[thread overview]
Message-ID: <40048c5a-ecf5-43e6-8c76-a294d0c333d1@l14g2000vbe.googlegroups.com> (raw)

Hi,

Consider two limited record types, inner and outer, with the former
nested inside the latter.  If the records are public, then code can
initialize the outer by specifying an aggregate for the inner, as in:

type Inner is limited
  record
    e : Integer;
  end record;

type Outer is limited
  record
    i : Inner;
  end record;

o : Outer := Outer'(i => Inner'(e => 42));

However, if types are made private, suitable functions must be
provided to make the appropriate objects.  If just Inner is private,
then this can be done (assuming simple creator functions that just
create the objects with the given values):

o : Outer := Outer'(i => Make_Inner(arg => 42));

but if both are private, then the following:

o : Outer := Make_Outer (arg => Make_Inner(arg => 42));

ends up being illegal, because in the code:

function Make_Outer (arg : Inner) return Outer is
begin
  return Outer'(i => arg);
end Make_Outer

would end up trying to copy a limited type.  For the cases in which an
existing object is passed in, this would be the appropriate action,
but for cases where the object is built-in-place into the argument,
clearly the intended behavior is to build it in place to the resultant
object.  It's easy enough to use an access value, but as unnecessary
use of access values is generally discouraged, I was just curious if
there was an alternative mechanism to achieve the desired effect.

-sb



             reply	other threads:[~2012-02-05 22:03 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-05 22:03 Simon Belmont [this message]
2012-02-06 12:44 ` Building limited types through nested creator functions Julian Leyh
2012-02-06 19:11 ` Shark8
2012-02-06 22:33   ` Simon Belmont
2012-02-07  0:03 ` Adam Beneschan
2012-02-07  0:27   ` Simon Belmont
2012-02-07  0:53     ` Adam Beneschan
2012-02-07  2:19       ` Simon Belmont
2012-02-07  9:10         ` Dmitry A. Kazakov
2012-02-07 10:58           ` Georg Bauhaus
2012-02-07 13:25             ` Dmitry A. Kazakov
2012-02-07 14:43               ` Yannick Duchêne (Hibou57)
2012-02-07 15:08                 ` Dmitry A. Kazakov
2012-02-07 17:04 ` Robert A Duff
replies disabled

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