Re: Ada.Containers.Vectors - querying multiple elements
- From: Robert A Duff <bobduff@xxxxxxxxxxxxxxxxxxxx>
- Date: 29 Apr 2005 14:34:11 -0400
Jeffrey Carter <spam@xxxxxxxx> writes:
> Randy Brukardt wrote:
>
> > It's not really corrected in Ada 2006; it has additional aggregates that
> > help, but the basic problem of having to mess with the bounds still exists:
> > Obj : Some_Array (Enum'First ..
> > Enum'Val(Enum'Pos(Enum'First)+Some_Length-1);
> > doesn't work if Some_Length = 0 and there is no general way to fix
> > that. You
> > just have to special case Some_Length = 0 and that is unpleasant.
>
> Right, but you can say
>
> Obj : Some_Array := Some_Array'(<>);
>
> (I hope I've remembered the syntax correctly)
I don't see any such syntax in the draft RM,
and I'm not sure which syntax you're referring to.
>... and Obj'Length = 0; there
> was no way to do this before if Enum'First = Enum'Last. And you should
> be able to convert Obj into a corresponding unbounded array.
Every array object has a 'Last in Ada. It's simply impossible to create
an array with a 'Last that does not exist. So a zero-length array
whose 'First is the lower bound of the base range is simply impossible.
I don't think this has changed in Ada 2006.
I don't think it's a problem, either. If you want zero-length arrays,
then you're counting things, and signed integers are the appropriate
index type. Arrays indexed by enums are usually things like tables,
and therefore not empty. Can you think of an example where you want
an empty array, and a enum or modular type is appropriate for the index?
I can't think of any at the moment.
> > The solution that Ada.Containers.Vector took to this problem is essentially
> > to ban instantiating it with subtypes where 'First = 'Base'First. (OK, you
> > can do the instantiation, but it will raise Constraint_Error.) One can argue
> > whether that is the best solution, but it seems clear that all of the
> > possible solutions are ugly.
>
> Yes. I think this solution is uglier than having Last = First if Length = 0.
Last = First seems just plain wrong, to me. You want to loop from First
up to Last -- if Length = 0, that loop had better not do anything.
- Bob
.
- Follow-Ups:
- Re: Ada.Containers.Vectors - querying multiple elements
- From: Randy Brukardt
- Re: Ada.Containers.Vectors - querying multiple elements
- References:
- Ada.Containers.Vectors - querying multiple elements
- From: Duncan Sands
- Re: Ada.Containers.Vectors - querying multiple elements
- From: Georg Bauhaus
- Re: Ada.Containers.Vectors - querying multiple elements
- From: Jeffrey Carter
- Re: Ada.Containers.Vectors - querying multiple elements
- From: Randy Brukardt
- Re: Ada.Containers.Vectors - querying multiple elements
- From: Jeffrey Carter
- Re: Ada.Containers.Vectors - querying multiple elements
- From: Randy Brukardt
- Re: Ada.Containers.Vectors - querying multiple elements
- From: Jeffrey Carter
- Ada.Containers.Vectors - querying multiple elements
- Prev by Date: Re: Timing Block of GNAT code in milliseconds
- Next by Date: Re: Timing Block of GNAT code in milliseconds
- Previous by thread: Re: Ada.Containers.Vectors - querying multiple elements
- Next by thread: Re: Ada.Containers.Vectors - querying multiple elements
- Index(es):
Relevant Pages
|
|