From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,27dc164946031512 X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Date: Sat, 20 Jan 2007 20:39:40 +0100 From: Gautier User-Agent: Thunderbird 1.5.0.9 (Windows/20061207) MIME-Version: 1.0 Newsgroups: comp.lang.ada Subject: Re: Limited_Controlled and constructor functions References: <45b24cbd$1_6@news.bluewin.ch> In-Reply-To: <45b24cbd$1_6@news.bluewin.ch> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit NNTP-Posting-Host: 83.76.158.58 X-Original-NNTP-Posting-Host: 83.76.158.58 Message-ID: <45b27de9_6@news.bluewin.ch> X-Trace: news.bluewin.ch 1169325545 83.76.158.58 (20 Jan 2007 21:39:05 +0100) Organization: Bluewin AG Complaints-To: abuse@bluewin.ch X-Original-NNTP-Posting-Host: 127.0.0.1 Path: g2news2.google.com!news3.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!wns13feed!worldnet.att.net!164.128.36.58!news.ip-plus.net!newsfeed.ip-plus.net!news.bluewin.ch!not-for-mail Xref: g2news2.google.com comp.lang.ada:8369 Date: 2007-01-20T20:39:40+01:00 List-Id: Oh, and a version without implicit dynamic allocation at all: --8<-----------8<-----------8<-----------8<-----------8<-----------8<--------- pragma Ada_83; with Text_IO, Variant_pkg; procedure Variants is use Variant_pkg; P : constant Params := (Param("Hello"), Param("Ada"), Param(12), Param(3.14)); begin for i in P'Range loop Text_IO.Put_Line( "Parameter #" & Integer'Image(i) & ": [" & Image(P(i)) & ']' ); end loop; end Variants; --8<-----------8<-----------8<-----------8<-----------8<-----------8<--------- package Variant_pkg is type BorString( maxlength: Positive ) is record length: Natural:= 0; s: String( 1..maxlength ); end record; type Kind is (A_String, An_Integer, A_Float); xamax: constant:= 1024; type Atom(k: Kind:= An_Integer) is record case k is when A_String => s: BorString(xamax); when An_Integer => i: Integer; when A_Float => f: Float; end case; end record; type Params is array(Positive range <>) of Atom; function Param(s: String) return Atom; function Param(i: Integer) return Atom; function Param(f: Float) return Atom; function Image(a: Atom) return String; end Variant_pkg; --8<-----------8<-----------8<-----------8<-----------8<-----------8<--------- package body Variant_pkg is function Param(s: String) return Atom is a: Atom(A_String); begin a.s.s(1..s'Length):= s; a.s.length:= s'Length; return a; end Param; function Param(i: Integer) return Atom is begin return Atom'(k => An_Integer, i => i); end Param; function Param(f: Float) return Atom is begin return Atom'(k => A_Float, f => f); end Param; function Image(a: Atom) return String is begin case a.k is when A_String => return a.s.s(1..a.s.length); when An_Integer => return Integer'Image(a.i); when A_Float => return Float'Image(a.f); end case; end Image; end Variant_pkg;