Re: Ada.Containers.Vectors - querying multiple elements



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
.



Relevant Pages

  • Re: 10 rules for benchmarking (was Re: Teaching new tricks to an old dog (C++ -->Ada))
    ... so I did the same in Ada, results are in the T and TC columns. ... array are used, ... I take it you mean the one best performing assembly language ... that a given assembly language program cannot be beaten by ...
    (comp.programming)
  • Re: 10 rules for benchmarking (was Re: Teaching new tricks to an old dog (C++ -->Ada))
    ... so I did the same in Ada, results are in the T and TC columns. ... array are used, ... I take it you mean the one best performing assembly language ... that a given assembly language program cannot be beaten by ...
    (comp.lang.ada)
  • Re: Surprise in array concatenation
    ... > Dmitry A. Kazakov wrote: ... >> Better ADT is what Ada needs. ... The concept of array must be consistent ... for I in A'First..A'Last loop ...
    (comp.lang.ada)
  • Re: Surprise in array concatenation
    ... >> computational states for which A is considered be 1. ... >> memory dump and discover a bit pattern 000000001 at the address FF07712CA0 ... could you stop naming this ADT an array? ... > These are Ada arrays, rock solid low level stuff, based on preexisting ...
    (comp.lang.ada)
  • Re: Surprise in array concatenation
    ... >> Slices should slide to the lower bound. ... The Ada rule breaks ... >> abstraction: ... > So if I pass a subprogram a slice of an array indexed by an enumeration type ...
    (comp.lang.ada)