comp.lang.ada
 help / color / mirror / Atom feed
* Building limited types through nested creator functions
@ 2012-02-05 22:03 Simon Belmont
  2012-02-06 12:44 ` Julian Leyh
                   ` (3 more replies)
  0 siblings, 4 replies; 14+ messages in thread
From: Simon Belmont @ 2012-02-05 22:03 UTC (permalink / 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



^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2012-02-07 17:04 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-02-05 22:03 Building limited types through nested creator functions Simon Belmont
2012-02-06 12:44 ` 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

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