Improvements and Changes from version 1.0 to 1.1
------------------------------------------------

* Made several bug fixes.

* Improved performance in object I/O from the reserve.

* Added iterator functionality.

* Added max, min, and abs template functions.

* Added looping macros.

* New support for Sun (Solaris), HP (HP-UX), SGI (IRIX), and IBM (AIX).

* A better installation mechanism.

* New "firstThat" functions in "CmContainer" and "CmReserve" class.

* Iterator functions "restart" and "toEnd" are now "first" and "last".

* Output arguments of several template functions in both "CmTContainer"
  and "CmTIterator" were changed from "T" to "const T&".

* Remove "isOld" and "isNew" functions from "CmReserve" and added a
  single "exists" function.


Improvements and Changes from version 1.1 to 2.0
------------------------------------------------

* Package now comes with a simple test program.

* Changed library over to the new standard boolean type where
  "bool" is the type and the values are "true" and "false".

* Added function "lastThat" to both "CmContainer" and "CmReserve"
  which works the same as "firstThat" except that the last object
  satisfying the specified condition is returned.

* Changed argument from "CmObject*" to "const CmObject*" in functions
  "isEqual" and "compare" in class "CmObject" and in all derived classes.

* Remove classes "CmRing" and "CmTRing" from library.  These classes
  caused several base container class functions to work incorrectly
  due to the fact that a ring iterator could never be "done".

* Added new functions to the base container classes and their derived
  classes.  Function "removeAt" removes the object at a specified index
  and new "remove" function (taking an iterator reference) removes the
  exact object pointed to by the specified iterator.

* Added functions "forEach", "firstThat", "lastThat", "query",
  "lookupAll", and "addAllFrom" to the template class "CmTContainer".
  These functions work just as their counterparts in "CmContainer".

* Changed argument from "CmObject*" to "const CmObject*" in functions
  "remove", "lookup", "contains", and "occurrences" in all object based
  containers.

* Added set operators to set template.

* Added a second parameter "T* = NULL" to the constructor for the class
  "CmTVector" so that an array of items can be passed in to initialize
  the vector.

* Added a second constructor to the class "CmTVector" that takes the
  vector size and a single item to fill the new vector with.

* Replaced the classes "CmSet", and "CmTSet" (which derived from
  hash tables) with the new classes "CmHashSet", "CmBTreeSet",
  "CmTHashSet", and "CmTBTreeSet" which derive from hash tables and
  balanced trees.

* Added new functions to "CmLinkedList" and "CmTLinkedList".  The
  function "replaceAt" replaces an object at a specified index,
  "insertAt" inserts an object at a specified index, and two "index"
  functions return the index where a given object lies in the list.

* Added a second "index" function (taking an iterator as input) to
  "CmArray", "CmOrderedArray", "CmTArray", and "CmTOrderedArray".
  This function returns the index of the exact object pointed to
  by the specified iterator.

* Changed static display styles in classes "CmDate" and "CmTime" to
  iostream manipulators.

* Moved container reference in all iterators into the base iterator
  classes and added a "container" function to both "CmIterator" and
  "CmTIterator" which returns that reference.

* Added support for GNU C++ version 2.7.1.

* Removed SGI makefiles.  The compiler I was using kept reporting nested
  typedefs as an error and I decided to wait for them to fix their compiler
  rather than take the typedefs out.

* Added doubly linked list classes "CmDLinkedList" and "CmTDLinkedList"
  to the library.

* Added dictionary classes "CmDictionary" and "CmTDictionary" to the
  library which derive from the new doubly linked list classes.

* Made key arguments "const" in "replace" function of all dictionaries.

* Made "protected" class members "private" except where "protected"
  was absolutely necessary.

* Added virtual "total" function to base containers that returns "size"
  for all containers that didn't already have a "total" function.  Changed
  return type of "total" function  in array and hash table classes.

* Changed template dictionaries so that they cannot contain duplicate
  keys (to make them consistent with object based dictionaries).

* Functions "lookup", "contains", and "occurrences" are no longer pure
  virtual functions in classes "CmContainer" and "CmTContainer.  They are
  still virtual, however, and it is still recommended that they be redefined
  for specific containers for performance reasons.

* Made "object" set function return pointer to the object being replaced
  in the class "CmAssociation".

* The string class "CmString" was greatly enhanced to make it somewhat
  more consistent with the proposed standard C++ string.

* The vector class "CmTVector" was greatly enhanced to provide much of
  the functionality of the proposed standard C++ class "dynarray".

* Added better run time type information mechanism with new classes
  "CmTypeId" and "CmTypeInfo".  This mechanism works similarly to the
  proposed standard for run time type indentification.

* Added convenience constructors to "CmTHashTable", "CmTHashSet", and
  "CmTBag" taking a hashing function pointer as well as the table size.

* Added a new constructor to several containers taking a reference to
  the base container class in order to facilitate container conversion.

* Removed usage of template class "CmTStack" from the class "CmBinaryTree"
  so that the object based containers can be used with compilers that
  do not support templates.

* Moved I/O class registration and reference table maintenance out of
  the class "CmReserve" into a new class "CmIO".  Also, class I/O
  registration is no longer done through a function call.  A single
  macro "CMOBJECT_REGISTER" can be called (in file scope) in the source
  file of any object that is to be read/written and the registration
  will be done automatically when the program is started.  This also
  eliminates the need for the function "CmReserve::initialize" as all
  the Compendium classes are now registered automatically.

* Fixed bug in "nextOccurrence" and "previousOccurrence" and
  changed the names of these functions to "next" and "previous".

* Fixed bug in "remove" function of both "CmBTree" and "CmTBTree".

* Fixed bug in "index" function of both "CmArray" and "CmTArray".

* Fixed memory leak in "CmBinaryTreeIterator".

* Fixed bug in "append" function of "CmString",

* Fixed bug in macros "CmRepeat" and "CmDo" where iterators were not
  properly deleted.

* Fixed memory leak in "balance" function of both object and template
  based binary trees.

* Fixed memory clobbering bug in "lookup" functions in all dictionary
  template classes.

* Fixed missing lower bounds checks in array and ordered array iterator
  classes and templates.

* Fixed "operator-" functions in set classes and templates to work
  properly.
