comp.lang.ada
 help / color / mirror / Atom feed
From: Keith Thompson <kst-u@mib.org>
Subject: Re: How can I create an empty array of a generic type?
Date: Fri, 12 Jul 2019 21:11:13 -0700
Date: 2019-07-12T21:11:13-07:00	[thread overview]
Message-ID: <lnftnaa80u.fsf@kst-u.example.com> (raw)
In-Reply-To: 5f53e122-6b99-48ca-b6cc-4ae43c0a2221@googlegroups.com

b.mcguinness747@gmail.com writes:
> I have a generic package
>
> generic
>   type Element_Type is private;
>   type Key_Component_Type is private;
>   with function "<" (Left, Right : Key_Component_Type) return Boolean is <>;
>   with function "=" (Left, Right : Element_Type) return Boolean is <>;
> package Ternary_Trees is
> ...
> private
> ...
>   Empty_Key  : constant Key_Type(1..0) := (others => Key_Component_Type'First);
> ...
> end Ternary_Trees;
>
> When I try to compile the package, I get an error message:
>
> ternary_trees.ads:77:54: prefix for "First" attribute may not be private type

You haven't shown us the declaration for Key_Type.  Presumably it's an
array of Key_Component_Type.

This compiles:

generic
  type Element_Type is private;
  type Key_Component_Type is private;
  with function "<" (Left, Right : Key_Component_Type) return Boolean is <>;
  with function "=" (Left, Right : Element_Type) return Boolean is <>;
package Ternary_Trees is
  type Key_Type is array(Positive range <>) of Key_Component_Type;
private
  Dummy: Key_Component_Type;
  Empty_Key  : constant Key_Type(1..0) := (others => Dummy);
end Ternary_Trees;

The Dummy value is a bit ugly.  An alternative is to require the
instantiator to provide a value:

generic
  type Element_Type is private;
  type Key_Component_Type is private;
  Default_Key_Component: Key_Component_Type;
  with function "<" (Left, Right : Key_Component_Type) return Boolean is <>;
  with function "=" (Left, Right : Element_Type) return Boolean is <>;
package Ternary_Trees is
  type Key_Type is array(Positive range <>) of Key_Component_Type;
private
  Dummy: Key_Component_Type;
  Empty_Key  : constant Key_Type(1..0) := (others => Default_Key_Component);
end Ternary_Trees;

-- 
Keith Thompson (The_Other_Keith) kst-u@mib.org  <http://www.ghoti.net/~kst>
Will write code for food.
void Void(void) { Void(); } /* The recursive call of the void */

  reply	other threads:[~2019-07-13  4:11 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-13  3:36 How can I create an empty array of a generic type? b.mcguinness747
2019-07-13  4:11 ` Keith Thompson [this message]
2019-07-13  5:24   ` J-P. Rosen
2019-07-13 21:19     ` Keith Thompson
2019-07-14 11:09       ` reinert
2019-07-14 11:15     ` reinert
2019-07-14 11:27       ` Jeffrey R. Carter
2019-07-14 12:49       ` J-P. Rosen
2019-07-13 21:02 ` b.mcguinness747
2019-07-14 16:41   ` bj.mooremr
2019-10-16  2:03     ` Andrew Shvets
2019-10-16  4:49       ` Egil H H
replies disabled

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