Release notes
Includes Guarded and Synchronized Maps.
The C++ code offers two variants of accessors such as Queues.Front, one of which returns a value while the other returns a reference. The second case is now supported by generics such as eg Queues.Process_Front.
The Copy operation of Collections, Queues, Rings and Stacks checks for self-assignment before proceeding.
Synchronized Unbounded Rings now support blocking (balking); eg, an attempt to Pop will block until the Ring has something in it to pop. For related reasons, the Pop_Value operation is provided.
AVL Trees had an error (inherited from the C++) which would sometimes corrupt the Tree on deletion.
Containers have new versions of the Visit and Modify generics that include a parameter as an argument to Visit and Modify that is passed to the Apply routine. Thanks to Steve Doiel.
Added pragma Elaborate_Body throughout.
Continued the renaming of Container parameters from Obj to something slightly more mnemonic.
AVL Trees are no longer limited.
Corrected ordering problem with Unbounded Ordered Collections when keys are equal. Insert now adds from the front of the Collection, Append from the rear.
BC.Support.Bounded, BC.Support.Unbounded subprogram specs were confused about whether indexing was from 0 (as in the C++) or 1 (in the Ada). BC.Support.Unbounded.Append(2) had an error when appending after the first element.
Corrected a GNAT compiler problem (GNAT was too permissive).
Added ObjectAda-special versions of the Bag test driver (avoiding compiler problems).
Added Unbounded Rings in standard, Guarded and Synchronized forms.
ObjectAda problems with Semaphores.
Passive iteration (in BC.Containers) didn't reset the passed-in Iterator.
Notes from John P. Woodruff on use with Rational Apex.
Added a word-counter demo, as suggested by John English in the Ada Standard Component Library Working Group.
Further contributions.
Added Bags (only in the Unbounded form so far).
Added Sets.
Reworked Iteration; passive iteration now obtains the Container over which to iterate via an Iterator bound to the container. This allows different styles of iteration with one interface.
Graphs have three Vertex iterators: incoming only, outgoing only, both ways.
Binary trees have in-order, pre-order and post-order iterators; Multiway trees have pre-order and post-order iterators. Only passive iteration is available, and the style is different from that of other Containers.
If a section of a list which didn't contain a shared node was purged, an invalid pointer access (Constraint_Error) would occur. This error was in the C++ (where it was OK, it seems, to free() a null pointer).
Assignment involving unbounded forms didn't correctly invalidate the cache in the copy.
Began a demos page.
Began a "contributions" section, with initial contributions from Daniel Gaudry.
Added ObjectAda-special versions of test drivers (avoiding compiler problems).
Removed a use of the GNAT-special 'Img attribute.
Removed a couple of badly-placed pragma Inlines.
Added AVL Trees.
Removed some abbreviations; for instance, in BC.Containers.Stacks.Unbounded, the type Unb_Stack becomes Unbounded_Stack. These changes will break existing code.
Reworked Iteration throughout, with a vast improvement in the efficiency of List iterators. These changes will break existing code; compiler problems mean that you can't use GNAT 3.10p.
Moved Graph iterators up to the parent package (BC.Graphs), and included a little demonstration of Graph usage (Ada_Units).
For consistency, the concrete Graph, Vertex and Arc types are now prefixed with Undirected_ or Directed_ as appropriate; eg, a directed Vertex becomes Directed_Vertex.
Internal changes in Storage Management.
Fixed inefficiency in Unbounded (and perhaps Dynamic) forms of Queues and Stacks.
Storage Management for Dynamic and Unbounded forms required that we instantiate some support packages inside the using generic rather than having the user pre-instantiate them. We decided to adopt the same policy for Bounded forms too. These changes will break existing code.
Added some comments to package specs.
Added some minor demo code (storage, time_lists and time_queues).
There were several storage leaks.
It's illegal to declare abstract subprograms in a private part.
The Stack and Queue iterators were broken (by sjw).