home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / TCPP30-3.ZIP / DOC.ZIP / CLASSLIB.DOC < prev    next >
Text File  |  1992-02-18  |  262KB  |  6,731 lines

  1.  
  2.  
  3. Online document
  4. ___________________________________________________________________________
  5.  
  6.                                               The container class libraries
  7.  
  8.  
  9.                                   CONTENTS
  10.  
  11.  
  12.  
  13.  
  14. 1  The container class libraries   1     Member functions  . . . . . . . 38
  15. What's new since version 1.0?  . . 1     Friends . . . . . . . . . . . . 40
  16. Why two sets of libraries? . . . . 3   Array . . . . . . . . . . . . . . 41
  17. Container basics . . . . . . . . . 4     Example . . . . . . . . . . . . 41
  18.     Object-based and other               Member functions  . . . . . . . 42
  19.     classes  . . . . . . . . . . . 6   ArrayIterator . . . . . . . . . . 43
  20.   Class categories . . . . . . . . 6     Member functions  . . . . . . . 43
  21.   Non-container classes  . . . . . 7   Association . . . . . . . . . . . 44
  22.     Error class  . . . . . . . . . 7     Member functions  . . . . . . . 44
  23.     Sortable class . . . . . . . . 7     Example . . . . . . . . . . . . 45
  24.     Association class  . . . . . . 8   Bag . . . . . . . . . . . . . . . 47
  25.   Container classes  . . . . . . . 8     Member functions  . . . . . . . 47
  26.   Containers and ownership . . . . 9   BaseDate  . . . . . . . . . . . . 49
  27.   Container iterators  . . . . .  11     Member functions  . . . . . . . 49
  28.   Sequence classes . . . . . . .  12   BaseTime  . . . . . . . . . . . . 51
  29.   Collections  . . . . . . . . .  12     Member functions  . . . . . . . 51
  30.     Unordered collections  . . .  13   Btree . . . . . . . . . . . . . . 53
  31.     Ordered collections  . . . .  13     Member functions  . . . . . . . 53
  32. The BIDS template library  . . .  13     Friends . . . . . . . . . . . . 55
  33.   Templates, classes, and              BtreeIterator . . . . . . . . . . 55
  34.   containers . . . . . . . . . .  14     Member functions  . . . . . . . 56
  35.   Container implementation . . .  14   Collection  . . . . . . . . . . . 57
  36.   The template solution  . . . .  15     Member functions  . . . . . . . 58
  37.     ADTs and FDSs  . . . . . . .  16   Container . . . . . . . . . . . . 59
  38.     Class templates  . . . . . .  17     Member functions  . . . . . . . 60
  39.   Container class compatibility . 20     Friends . . . . . . . . . . . . 63
  40.   Header files . . . . . . . . .  22   ContainerIterator . . . . . . . . 64
  41.   Tuning an application  . . . .  23     Member functions  . . . . . . . 64
  42.   FDS implementation . . . . . .  24   Date  . . . . . . . . . . . . . . 65
  43.   ADT implementation . . . . . .  27     Member functions  . . . . . . . 65
  44. The class library directory  . .  31   Deque . . . . . . . . . . . . . . 66
  45.   The INCLUDE directory  . . . .  32     Example . . . . . . . . . . . . 67
  46.   The OBJS directory . . . . . .  32     Member functions  . . . . . . . 68
  47.   The SOURCE directory . . . . .  32   Dictionary  . . . . . . . . . . . 69
  48.     Creating a library . . . . .  33     Member functions  . . . . . . . 69
  49.   The LIB directory  . . . . . .  34   DoubleList  . . . . . . . . . . . 70
  50.   The EXAMPLES directory . . . .  34     Member functions  . . . . . . . 71
  51. Preconditions and checks . . . .  35     Friends . . . . . . . . . . . . 73
  52. Container class reference  . . .  36   DoubleListIterator  . . . . . . . 73
  53. AbstractArray  . . . . . . . . .  37     Member functions  . . . . . . . 73
  54.   Data members . . . . . . . . .  37   Error . . . . . . . . . . . . . . 74
  55.  
  56.  
  57.  
  58.                                      i
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.   Member functions . . . . . . .  75     Member functions  . . . . . . . 92
  66. HashTable  . . . . . . . . . . .  75   Set . . . . . . . . . . . . . . . 92
  67.   Member functions . . . . . . .  76     Member functions  . . . . . . . 92
  68.   Friends  . . . . . . . . . . .  78   Sortable  . . . . . . . . . . . . 93
  69. HashTableIterator  . . . . . . .  78     Member functions  . . . . . . . 95
  70.   Member functions . . . . . . .  78     Related functions . . . . . . . 96
  71. List . . . . . . . . . . . . . .  79   SortedArray . . . . . . . . . . . 97
  72.   Member functions . . . . . . .  79   Stack . . . . . . . . . . . . . . 97
  73.   Friends  . . . . . . . . . . .  80     Example . . . . . . . . . . . . 98
  74. ListIterator . . . . . . . . . .  81     Member functions  . . . . . . . 99
  75.   Member functions . . . . . . .  81   String  . . . . . . . . . . . .  100
  76. MemBlocks  . . . . . . . . . . .  82     Member functions  . . . . . .  100
  77. MemStack . . . . . . . . . . . .  83     Example . . . . . . . . . . .  101
  78. Object . . . . . . . . . . . . .  84   Time  . . . . . . . . . . . . .  102
  79.   Data member  . . . . . . . . .  84     Member functions  . . . . . .  103
  80.   Member functions . . . . . . .  84   Timer . . . . . . . . . . . . .  104
  81.   Friends  . . . . . . . . . . .  87     Member functions  . . . . . .  104
  82.   Related functions  . . . . . .  87   TShouldDelete . . . . . . . . .  105
  83. PriorityQueue  . . . . . . . . .  88     Member functions  . . . . . .  105
  84.   Member functions . . . . . . .  89
  85. Queue  . . . . . . . . . . . . .  90   Index                            107
  86.   Example  . . . . . . . . . . .  91
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.                                     ii
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130. Online document
  131. ___________________________________________________________________________
  132.  
  133.  
  134.  
  135.                                               The container class libraries
  136.  
  137.  
  138.           For more  Turbo C++ version 3.0 includes two complete container
  139.  information about  class libraries: an enhanced version of the Object-
  140.     templates, see  based library supplied with version 1.0, plus a brand-
  141.   Chapter 13, "C++  new implementation based on templates. This chapter
  142.        specifics."  describes both libraries. We assume that you are
  143.                     familiar with the syntax and semantics of C++ and with
  144.                     the basic concepts of object-oriented programming
  145.                     (OOP). To understand the template-based version (called
  146.                     BIDS, for Borland International Data Structures), you
  147.                     should be acquainted with C++'s new template mechanism.
  148.  
  149.                     The chapter is divided into seven parts:
  150.  
  151.                     o A review of the difference between versions 1.0 and
  152.                       3.0 of the class libraries
  153.                     o An overview of the Object- and template-based
  154.                       libraries
  155.                     o A survey of the Object container classes, introducing
  156.                       the basic concepts and terminology
  157.                     o An overview of the BIDS library
  158.                     o The CLASSLIB directory and how to use it
  159.                     o Debugging tools
  160.                     o An alphabetic reference guide to the Object container
  161.                       library, listing each class and its members
  162.  
  163.  
  164.  
  165. ===========================================================================
  166. What's new since version 1.0?
  167. ===========================================================================
  168.  
  169.                     The version 1.0 container library is an Object-based
  170.                     implementation. Both container objects and the elements
  171.                     stored in them are all ultimately derived from the
  172.  
  173.  
  174.  
  175.                                    - 1 -
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.                     class Object. Further, the data structures used to
  183.                     implement each container class were fixed and (usually)
  184.                     hidden from the programmer. This provides a simple,
  185.                     effective model for most container applications.
  186.                     Version 3.0 therefore offers an enhanced, code-
  187.                     compatible version of the previous Object-based
  188.                     container library. We call this the Object container
  189.                     class library. In addition, a more flexible (but more
  190.                     complex), template-based container library, called BIDS
  191.                     (Borland International Data Structures), is supplied
  192.                     with version 3.0. Through the power of templates, BIDS
  193.                     lets you vary the underpinning data structure for a
  194.                     container and lets you store arbitrary objects in a
  195.                     container. With the appropriate template parameters,
  196.                     BIDS can actually emulate the Object container library.
  197.  
  198.                     Before we review the differences between the Object and
  199.                     BIDS models, we'll list the changes to the Object
  200.                     container library since version 1.0:
  201.  
  202.                     o New Btree and PriorityQueue classes.
  203.                     o New TShouldDelete class gives the programmer control
  204.                       over container/element ownership. You can control the
  205.                       fate of objects when they are detached from a
  206.                       container and when the container is flushed (using
  207.                       the new flush method) or destroyed.
  208.                     o New memory management classes, MemBlocks and
  209.                       MemStack, for efficient memory block and memory stack
  210.                       (mark-and-release) allocations.
  211.                     o New PRECONDITION and CHECK macros provide sophisti-
  212.                       cated assert mechanisms to speed application develop-
  213.                       ment and debugging.
  214.                     o New Timer class gives you a stopwatch for timing
  215.                       program execution.
  216.  
  217.    When you choose  Existing Turbo C++ version 1.01 container class code
  218.    Container Class  will still run with the version 3.0 libraries. The new
  219.     Library in the  Object container class libraries, in directory
  220.     IDE's Options|  \CLASSLIB, are distinguished by the prefix TC:
  221.   Linker|Libraries  TCLASSx.LIB and TCLASDBx.LIB where x specifies the
  222.    dialog box, the  memory model, and DB indicates the special debug
  223.       Object-based  version. To reduce verbiage, we will often refer to
  224.  libraries will be  this container implementation as the Object or TC
  225.      automatically  version.
  226.         linked in.
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.                                    - 2 -
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.         To use the  The corresponding libraries for the new template-based
  241.     template-based  container classes are distinguished by the prefix BIDS:
  242.     libraries, you  BIDSx.LIB and BIDSDBx.LIB. Let's review the reasons for
  243.    must explicitly  having two sets of container libraries. The use of all
  244.            add the  these libraries is covered on page 31.
  245.        appropriate
  246.      BIDS[DB]x.LIB
  247.    library to your
  248.         project or
  249.          makefile.
  250.  
  251.  
  252.  
  253. ===========================================================================
  254. Why two sets of libraries?
  255. ===========================================================================
  256.  
  257.                     The Object container classes have been retained and
  258.                     enhanced to provide code compatibility with the version
  259.                     1.0 library. They provide a gentler learning curve than
  260.                     the template-based BIDS library. The Object container
  261.                     code offers faster compilation but slightly slower
  262.                     execution than the template version. The project files
  263.                     for the example and demo programs are set up to use the
  264.                     Object version of the container libraries.
  265.  
  266.                     BIDS exploits the new exciting templates feature of C++
  267.                     2.1. It offers you considerable flexibility in choosing
  268.                     the best underlying data structure for a given
  269.                     container application. With the Object version, each
  270.                     container is implemented with a fixed data structure,
  271.                     chosen to meet the space/speed requirements of most
  272.                     container applications. For example, a Bag object is
  273.                     implemented with a hash table, and a Deque object with
  274.                     a double list. With BIDS you can fine-tune your
  275.                     application by varying the container implementation
  276.                     with the minimum recoding--often a single typedef will
  277.                     suffice. You can switch easily from StackAsList to
  278.                     StackAsVector and test the results. In fact, you'll see
  279.                     that by setting appropriate values for <T>, a generic
  280.                     class parameter, you can implement the Object model
  281.                     exactly. With BIDS, you can even choose between
  282.                     polymorphic and non-polymorphic implementations of the
  283.                     Object container model. Such choices between execution
  284.                     speed (non-polymorphic) and future flexibility
  285.                     (polymorphic) can be tested without major recoding.
  286.  
  287.  
  288.  
  289.  
  290.  
  291.                                    - 3 -
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.      Existing code  Both the Object and BIDS versions provide the same
  299.       based on the  functional interface. For example, the push and pop
  300.   Object container  member functions work the same for all Stack objects.
  301.       classes will  This makes the new template-based libraries highly
  302.    compile and run  compatible with existing code written for the Object
  303.    perfectly using  library.
  304.       the new BIDS
  305.   classes, just by  The objects stored in Object library containers must be
  306.     linking in the  derived from the class Object. To store ints, say, you
  307.        appropriate  would have to derive an Integer class from Object
  308.           library.  (you'll see how later). With BIDS you have complete
  309.                     freedom and direct control over the types of objects
  310.                     stored in a container. The stored data type is simply a
  311.                     value passed as a template parameter. For instance,
  312.                     BI_ListImp<int> gives you a list of ints.
  313.  
  314.                     Regardless of which container class model you elect to
  315.                     use, you should be familiar with container terminology,
  316.                     the Object class hierarchy, and the functionality
  317.                     provided for each container type. Although the classes
  318.                     in the BIDS library have different naming conventions
  319.                     and special template parameters, the prototypes and
  320.                     functionality of each class member are the same as
  321.                     those in the Object library.
  322.  
  323.  
  324.  
  325. ===========================================================================
  326. Container basics
  327. ===========================================================================
  328.  
  329.   If you are fully  We start by describing the Object container class
  330.      versed in the  hierarchy as enhanced for Turbo C++ version 3.0. This
  331.      Turbo C++ 1.0  hierarchy offers a high degree of modularity through
  332.     version of the  inheritance and polymorphism. You can use these classes
  333. container library,  as they are, or you can extend and expand them to pro-
  334.   you should first  duce an object-oriented software package specific to
  335.      check out the  your needs.
  336.     Object library
  337.       enhancements  At the top of the class hierarchy is the Object class
  338.   before moving to  (see Figure 1), an abstract class that cannot be
  339.      the templates  instantiated (no objects of its type can be declared).
  340.    section on page  An abstract class serves as an umbrella for related
  341.                14.  classes. As such, it has few if any data members, and
  342.                     some or all of its member functions are pure virtual
  343.                     functions. Pure virtual functions serve as placeholders
  344.                     for functions of the same name and signature intended
  345.  
  346.  
  347.  
  348.  
  349.                                    - 4 -
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.                     to be defined eventually in derived classes. In fact,
  357.                     any class with at least one pure virtual function is,
  358.                     by definition, an abstract class.
  359.  
  360. Figure 1: Class hierarchies in CLASSLIB
  361.  
  362. Object─┬─Error
  363.        ├─Sortable────┬─String
  364.        │             ├─BaseDate─────Date
  365.        │             └─BaseTime─────Time
  366.        ├─Association
  367.        └─Container───┬─Collection─┬─AbstractArray─┬─Array
  368.                      │            │               └─SortedArray
  369.                      │            ├─HashTable
  370.                      │            ├─Bag──Set──Dictionary
  371.                      │            ├─List
  372.                      │            ├─Btree
  373.                      │            └─DoubleList
  374.                      ├─Stack
  375.                      ├─Deque──Queue
  376.                      └─PriorityQueue
  377. ContainerIterator────┬─HashTableIterator
  378.                      ├─ListIterator
  379.                      ├─DoubleListIterator
  380.                      ├─BtreeIterator
  381.                      └─ArrayIterator
  382. Memblocks
  383. MemStack
  384.                     Note that TShouldDelete provides a second base
  385.                     (multiple inheritance) for both Container and
  386.                     Association.
  387.  
  388.                     A class derived from an abstract class can provide a
  389.                     body defining the inherited pure virtual function. If
  390.                     it doesn't, the derived class remains abstract,
  391.                     providing a base for further derivations. When you
  392.                     reach a derived class with no pure virtual functions,
  393.                     the class is called a non-abstract or instance class.
  394.                     As the name implies, instance classes can be
  395.                     instantiated to provide usable objects.
  396.  
  397.                     An abstract class can be the base for both abstract and
  398.                     instance classes. For example, you'll see that
  399.                     Container, an abstract class derived from the abstract
  400.                     class Object, is the base for both Collection
  401.                     (abstract) and Stack (instance).
  402.  
  403.  
  404.  
  405.  
  406.  
  407.                                    - 5 -
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.    To enhance your  As you read this chapter, bear in mind that a derived
  415.   understanding of  class inherits and can access all non-private data
  416.   the classes, you  members and member functions from all its ancestral
  417.   can review their  base classes. For example, the Array class does not
  418.    declarations in  need to explicitly define a function to print an array,
  419.    the source code  because its immediate parent class AbstractArray does
  420.       files in the  so. The Container class, an ancestor further up the
  421.           CLASSLIB  class tree, defines a different print function that can
  422.         directory.  also be used with an array, because an array is a
  423.                     container. To determine all the member functions
  424.                     available to an object, you will have to ascend the
  425.                     class hierarchy tree. Because the public interface is
  426.                     intended to be sufficient for applications, object-
  427.                     oriented programming makes a knowledge of private data
  428.                     members unnecessary; therefore, private members (with a
  429.                     few exceptions) are not documented in this chapter.
  430.  
  431.  
  432. ------------------  The Object-based hierarchy contains classes derived
  433.   Object-based and  from the class Object (together with some other utility
  434.      other classes  classes). Object provides a minimal set of members
  435. ------------------  representing what every derived object must do; these
  436.                     are described in the reference section under Object
  437.                     (page 84). Both the containers-as-objects and the
  438.                     objects they store are objects derived (ultimately)
  439.                     from Object. Later you'll see that the template-based
  440.                     containers can contain objects of any data type, not
  441.                     just those derived from Object.
  442.  
  443.   Class categories  =======================================================
  444.  
  445.                     The classes in or near the Object hierarchy can be
  446.                     divided into three groups:
  447.  
  448.                     o The non-container classes include Object itself, and
  449.                       those classes derived from Object, such as String and
  450.                       Date, which cannot store other objects.
  451.                     o The container classes (also derived from Object),
  452.                       such as Array and List, which can store objects of
  453.                       other, usually non-container, class types.
  454.                     o The helper and utility classes not derived from
  455.                       Object, such as TShouldDelete, ListIterator and
  456.                       MemStack.
  457.  
  458.                     Let's look at each category in more detail, although as
  459.                     with most OOP topics, they are closely related.
  460.  
  461.  
  462.  
  463.  
  464.  
  465.                                    - 6 -
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.      Non-container  =======================================================
  473.            classes
  474.                     The basic non-container classes provided are Object and
  475.                     its three children: Error (instance), Sortable
  476.                     (abstract), and Association (instance). Recall that the
  477.                     main purpose of these classes is to provide objects
  478.                     that can be stored as data elements in containers. To
  479.                     this end, all Object-derived classes provide a hashing
  480.                     function allowing any of their objects to be stored in
  481.                     a hash table.
  482.  
  483. ------------------  Error is not a normal class; it exists solely to define
  484.        Error class  a unique, special object called theErrorObject. A
  485. ------------------  pointer to theErrorObject carries the mnemonic
  486.  Error see page 74  NOOBJECT. NOOBJECT is rather like a null pointer, but
  487.   in the reference  serves the vital function of occupying empty slots in a
  488.           section.  container. For example, when an Array object is created
  489.                     (not to be confused with a traditional C array), each
  490.                     of its elements will initially contain NOOBJECT.
  491.  
  492. ------------------  Sortable is an abstract class from which sortable
  493.     Sortable class  classes must be derived. Some containers, known as
  494. ------------------  ordered collections, need to maintain their elements in
  495.                     a particular sequence. Collections such as SortedArray
  496.                     and PriorityQueue, for example, must have consistent
  497.                     methods for comparing the "magnitude" of objects.
  498.                     Sortable adds the pure virtual function isLessThan to
  499.                     its base, Object. Classes derived from Sortable need to
  500.                     define IsLessThan and IsEqual (inherited from Object)
  501.                     for their particular objects. Using these members, the
  502.                     relational operators <, ==, >, >=, and so on, can be
  503.                     overloaded for sortable objects. Typical sortable
  504.                     classes are String, Date, and Time, the objects of
  505.                     which are ordered in the natural way. Of course, string
  506.                     ordering may depend on your locale, but you can always
  507.                     override the comparison functions (another plus for
  508.                     C++).
  509.  
  510.   For more details  Distinguish between the container object and the
  511.    on Sortable see  objects it contains: Sortable is the base for non-
  512.     page 93 in the  container objects; it is not a base for ordered
  513. reference section.  collections. Every class derived from Object inherits
  514.                     the isSortable member function so that objects can be
  515.                     queried as to their "sortability."
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.                                    - 7 -
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530. ------------------  Association is a non-container, instance class
  531.  Association class  providing special objects to be stored (typically) in
  532. ------------------  Dictionary collections. An Association object, known as
  533.    Association see  an association, is a pair of objects known as the key
  534.     page 44 in the  and the value. The key (which is unique in the
  535. reference section.  dictionary) can be used to retrieve the value. Every
  536.                     class derived from Object inherits the isAssociation
  537.                     member function so that objects can report whether they
  538.                     are associations or not.
  539.  
  540.  Container classes  =======================================================
  541.  
  542.                     In the Object-based library, all the container storage
  543.                     and access methods assume that the stored elements are
  544.                     derived from Object. They are actually stored as
  545.                     references or pointers to Object offering the
  546.                     advantages and disadvantages of polymorphism. Most of
  547.                     the container access member functions are virtual, so a
  548.                     container does not need to "know" how its contained
  549.                     elements were derived. A container can, in theory,
  550.                     contain mixed objects of different class types, so
  551.                     proper care is needed to maintain type-safe linkage.
  552.                     Every class has member functions called IsA and nameOf,
  553.                     which allow objects to announce their class ID and
  554.                     name. As you've seen, there are also isSortable and
  555.                     isAssociation member functions for testing object
  556.                     types.
  557.  
  558.                     All the container classes are derived from the abstract
  559.                     Container class, a child of Object. Container
  560.                     encapsulates just a few simple properties upon which
  561.                     more specialized containers can be built. The basic
  562.                     container provides the following functionality:
  563.  
  564.                     o Displays its elements
  565.                     o Calculates its hash value
  566.                     o Pure virtual slot for counting the number of items
  567.                       with getItemsInContainer
  568.                     o Pure virtual slot for flushing (emptying) the
  569.                       container with flush
  570.                     o Performs iterations over its elements
  571.                     o Reports and changes the ownership of its elements
  572.                       (inherited from TShouldDelete)
  573.  
  574.                     So far, our containers have no store, access, or detach
  575.                     methods. (We can flush the container but we cannot
  576.                     detach individual elements.) Nor is there a hasMember
  577.  
  578.  
  579.  
  580.  
  581.                                    - 8 -
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.                     member function, that is, a general way of determining
  589.                     whether a given object is an element of the container.
  590.                     This is a deliberate design decision. As we move up the
  591.                     hierarchy, you'll see that what distinguishes the
  592.                     various derived container classes are the storage and
  593.                     access rules that actually define each container's
  594.                     underlying data structure. Thus push and pop member
  595.                     functions are added for Stack, indexing operators are
  596.                     added for Array, and so on. There is not enough in
  597.                     common to warrant having generic add and retrieve
  598.                     methods at the Container level. There is no one perfect
  599.                     way of extracting common properties from groups of
  600.                     containers, and therefore no perfect container class
  601.                     hierarchy. The Object-based container hierarchy is just
  602.                     one possible design based on reasonable compromises.
  603.                     The BIDS version, as you'll see, offers a different
  604.                     perspective.
  605.  
  606.                     The first three Container functions listed previously
  607.                     are fairly self-explanatory. We'll discuss the
  608.                     important subjects of ownership and iteration in the
  609.                     next two sections.
  610.  
  611.  
  612.     Containers and  =======================================================
  613.          ownership
  614.                     Before you use the Container family, you must
  615.                     understand the concept of ownership. As in real life, a
  616.                     C++ container starts out empty and must be filled with
  617.                     objects before the objects can be said to be in the
  618.                     container. Unlike the real world, however, when objects
  619.                     are placed in the container, they are, by default,
  620.                     owned by the container. The basic idea is that when a
  621.                     container owns its objects, the objects are destroyed
  622.                     when the container is destroyed.
  623.  
  624.                     Recall that containers are themselves objects subject
  625.                     to the usual C++ scoping rules, so local containers
  626.                     come and go as they move in and out of scope. Care is
  627.                     needed, therefore, to prevent unwanted destruction of a
  628.                     container's contents, so provision is made for changing
  629.                     ownership. A container can, throughout its lifetime,
  630.                     relinquish and regain ownership of its objects as often
  631.                     as it likes by calling the ownsElements member function
  632.                     (inherited from TShouldDelete). The fate of its objects
  633.                     when the container disappears is determined by the
  634.                     ownership status ruling at the time of death. Consider
  635.                     the following:
  636.  
  637.  
  638.  
  639.                                    - 9 -
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.                      void test()
  647.                      {
  648.                        Array a1( 10 );    // construct an array
  649.                        Array a2( 10 );    // and another
  650.  
  651.                        a1.ownsElements( 1 );  // array a1 owns its objects
  652.                                                  (the default)
  653.                        a2.ownsElements( 0 );  // array a2 relinquishes
  654.                                                  ownership
  655.  
  656.                        // load and manipulate the arrays here
  657.  
  658.                      }
  659.  
  660.                     When test exits, a1 will destroy its objects, but the
  661.                     objects in a2 will survive (subject, of course, to
  662.                     their own scope). The a1.ownsElements( 1 ) call is not
  663.                     really needed since, by default, containers own their
  664.                     contents.
  665.  
  666.                     Ownership also plays a role when an object is removed
  667.                     from a container. The pure virtual function
  668.                     Container::flush is declared as
  669.  
  670.                        virtual void flush( DeleteType dt = DefDelete ) = 0;
  671.  
  672.                     flush empties the container but whether the flushed
  673.                     objects are destroyed or not is controlled by the dt
  674.                     argument. DeleteType is an enum defined in
  675.                     TShouldDelete. A value of NoDelete means preserve the
  676.                     flushed objects regardless of ownership; Delete means
  677.                     destroy the objects regardless of ownership; DefDelete,
  678.                     the default value, means destroy the objects only if
  679.                     owned by the container. Similarly Collection (derived
  680.                     from Container) has a detach member function, declared
  681.                     as
  682.  
  683.                        virtual void detach( Object& obj, DeleteType dt =
  684.                        NoDelete ) = 0;
  685.  
  686.                     which looks for obj in the collection and removes it if
  687.                     found. Again, the fate of the detached object is
  688.                     determined by the value dt. Here, the default is not to
  689.                     destroy the detached object. Collection::destroy is a
  690.                     variant that calls detach with DefDelete.
  691.  
  692.                     A related problem occurs if you destroy an object that
  693.                     resides in a container without "notifying" the
  694.  
  695.  
  696.  
  697.                                   - 10 -
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.                     container. The safest approach is to use the
  705.                     container's methods to detach and destroy its contents.
  706.  
  707.         Important!  If you declare an automatic object (an object that's
  708.                     local to your routine) and place that object in a
  709.                     global container, your local object will be destroyed
  710.                     when the routine leaves the scope in which it was
  711.                     declared. To prevent this, you must only add heap
  712.                     objects (objects that aren't local to the current
  713.                     scope) to global containers. Similarly, when you remove
  714.                     an object from a global container, you are responsible
  715.                     for destroying it and freeing the space in which it
  716.                     resides.
  717.  
  718.  
  719.          Container  =======================================================
  720.          iterators
  721.                     You saw earlier that Container, the base for all
  722.                     containers in the Object-based library, supports
  723.                     iteration. Iteration means traversing or scanning a
  724.                     container, accessing each stored object in turn to
  725.                     perform some test or action. The separate
  726.                     ContainerIterator-based hierarchy provides this
  727.                     functionality. Iterator classes are derived from this
  728.                     base to provide iterators for particular groups of
  729.                     containers, so you'll find HashTableIterator,
  730.                     ListIterator, BtreeIterator, and so on.
  731.  
  732.              Under  There are two flavors of iterators: internal and
  733.  ContainerIterator  external. Each container inherits the three member
  734.  on page 64 in the  functions: firstThat, lastThat, and forEach, via the
  735. reference section,  Object and Container classes. As the names indicate,
  736.    you see how the  these let you scan through a container either testing
  737.     pre- and post-  each element for a condition or performing an action on
  738.          increment  each of the container's elements. When you invoke one
  739.   operators ++ are  of these three member functions, the appropriate
  740.      overloaded to  iterator object is created for you internally to
  741.      simplify your  support the iteration. Most iterations can be performed
  742. iterator programs.  in this way since the three iterating functions are
  743.                     very flexible. They take a pointer-to-function argument
  744.                     together with an arbitrary parameter list, so you can
  745.                     do almost anything. For even more flexibility, there
  746.                     are external iterators that you can build via the
  747.                     initIterator member function. With these, you have to
  748.                     set up your own loops and test for the end-of-
  749.                     container.
  750.  
  751.  
  752.  
  753.  
  754.  
  755.                                   - 11 -
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.                     Returning to the container class hierarchy, we look at
  763.                     three classes derived directly from Container: Stack,
  764.                     Deque, and PriorityQueue.
  765.  
  766.  
  767.   Sequence classes  =======================================================
  768.  
  769.                     The instance classes Stack, Deque (and its offspring
  770.                     Queue), and PriorityQueue are containers collectively
  771.                     known as sequence classes. A sequence class is
  772.                     characterized by the following properties:
  773.  
  774.                     1. Objects can be inserted and removed.
  775.  
  776.                     2. The order of insertions and deletions is
  777.                        significant.
  778.  
  779.                     3. Insertions and extractions can occur only at
  780.                        specific points, as defined by the individual class.
  781.                        In other words, access is nonrandom and restricted.
  782.  
  783.                     Sequences (like all containers) know how many elements
  784.                     they have (using getItemsInContainer) and if they are
  785.                     empty or not (using isEmpty). However, they cannot
  786.                     usually determine if a given object is a member or not
  787.                     (there is still no general hasMember or findMember
  788.                     member function). Stacks, queues, priority queues, and
  789.                     deques vary in their access methods as explained in
  790.                     more detail in the reference section.
  791.  
  792.                     Sequence is not itself a class because sequences do not
  793.                     share enough in common to warrant a separate base
  794.                     class. However, you might find it helpful to consider
  795.                     the classes together when reviewing the container
  796.                     hierarchy.
  797.  
  798.  
  799.        Collections  =======================================================
  800.  
  801.                     The next level of specialization is the abstract class
  802.                     Collection, derived from Container, and poised to
  803.                     provide a slew of widely used data structures. The key
  804.                     difference between collections and containers  is that
  805.                     we now have general hasMember and findMember member
  806.                     functions.
  807.  
  808.                     From Collection we derive the unordered collections
  809.                     Bag, HashTable, List, DoubleList, and AbstractArray,
  810.  
  811.  
  812.  
  813.                                   - 12 -
  814.  
  815.  
  816.  
  817.  
  818.  
  819.  
  820.                     and the ordered collection Btree. In turn,
  821.                     AbstractArray spawns the unordered Array and the
  822.                     ordered SortedArray. Bag serves as the base for Set
  823.                     which in turn is the base for Dictionary. These
  824.                     collections all refine the storage and retrieval
  825.                     methods in their own fashions.
  826.  
  827.  
  828. ------------------  With unordered collections, any objects derived from
  829.          Unordered  Object can be stored, retrieved, and detached. The
  830.        collections  objects do not have to be sortable because the access
  831. ------------------  methods do not depend on the relative "magnitude" of
  832.                     the elements. Classes that fall into this category are
  833.  
  834.                     o HashTable
  835.                     o Bag, Set, and Dictionary
  836.                     o List and DoubleList
  837.                     o Array
  838.  
  839.  
  840. ------------------  An ordered collection depends on relative "magnitude"
  841.            Ordered  when adding or retrieving its elements. Hence these
  842.        collections  elements must be objects for which the isLessThan
  843. ------------------  member function is defined. In other words, the
  844.                     elements in an ordered collection must be derived from
  845.                     the class Sortable. The following are ordered
  846.                     collections:
  847.  
  848.                     o Btree
  849.                     o SortedArray
  850.  
  851.  
  852.  
  853. ===========================================================================
  854. The BIDS template library
  855. ===========================================================================
  856.  
  857.                     The BIDS container class library can be used as a
  858.                     springboard for creating useful classes for your
  859.                     individual needs. Unlike the Object container library,
  860.                     BIDS lets you fine-tune your applications by varying
  861.                     the underlying data structures for different containers
  862.                     with minimum reprogramming. This extends the power of
  863.                     encapsulation: the implementor can change the internals
  864.                     of a class with little recoding and the user can easily
  865.                     replace a class with one that provides a more
  866.                     appropriate algorithm. The BIDS class library achieves
  867.                     this flexibility by using the C++ template mechanism.
  868.  
  869.  
  870.  
  871.                                   - 13 -
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.        For a basic  With BIDS, the container is considered as an ADT
  879. description of C++  (abstract data type), and its underlying data structure
  880.      templates see  is independently treated as an FDS (fundamental data
  881.        Chapter 13.  structure). BIDS also allows separate selections of the
  882.                     type of objects to be stored, and whether to store the
  883.                     objects themselves or pointers to objects.
  884.  
  885.         Templates,  =======================================================
  886.       classes, and
  887.         containers  Computer science has devoted much attention to devising
  888.                     suitable data structures for different applications.
  889.                     Recall Wirth's equation, Programs = Algorithms + Data
  890.                     Structures, which stresses the equal importance of data
  891.                     structures and their access methods.
  892.  
  893.                     As used in current OOP terminology, a container is
  894.                     simply an object that implements a particular data
  895.                     structure, offering member functions for adding and
  896.                     accessing its data elements (usually other objects)
  897.                     while hiding from the user as much of the inner detail
  898.                     as possible. There are no simple rules to determine the
  899.                     best data structure for a given program. Often, the
  900.                     choice is a compromise between competing space (RAM)
  901.                     and time (accessibility) considerations, and even here
  902.                     the balance can shift suddenly if the number of
  903.                     elements or the frequency of access grows or falls
  904.                     beyond a certain number.
  905.  
  906.  
  907.          Container  =======================================================
  908.     implementation
  909.                     Often, you can implement the desired container
  910.                     properties in many ways using different underlying data
  911.                     structures. For example, a stack, characterized by its
  912.                     Last-In-First-Out (LIFO) access, can be implemented as
  913.                     a vector, a linked list, or perhaps some other
  914.                     structure. The vector-based stack is appropriate when
  915.                     the maximum number of elements to be stored on the
  916.                     stack is known in advance. A vector allocates space for
  917.                     all its elements when it is created. The stack as a
  918.                     list is needed when there is no reasonable upper bound
  919.                     to the size of the stack. The list is a slower imple-
  920.                     mentation than the vector, but it doesn't use any more
  921.                     memory than it needs for the current state of the
  922.                     stack.
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.                                   - 14 -
  930.  
  931.  
  932.  
  933.  
  934.  
  935.  
  936.                     The way objects are stored in the container also
  937.                     affects size and performance: they can be stored
  938.                     directly by copying the object into the data structure,
  939.                     or stored indirectly via pointers. The type of data to
  940.                     be stored is a key factor. A stack of ints, for
  941.                     example, would probably be stored directly, where large
  942.                     structs would call for indirect storage to reduce
  943.                     copying time. For "in-between" cases, however, choosing
  944.                     strategies is not always so easy. Performance tuning
  945.                     requires the comparison of different container
  946.                     implementations, yet traditionally this entails drastic
  947.                     recoding.
  948.  
  949.  
  950.       The template  =======================================================
  951.           solution
  952.                     The template approach lets you develop a stack-based
  953.                     application, say, using vectors as the underlying
  954.                     structure. You can change this to a list implementation
  955.                     without major recoding (a single typedef change, in
  956.                     fact). The BIDS library also lets you experiment with
  957.                     object-storage strategies late in the development
  958.                     cycle. Each container-data structure combination is
  959.                     implemented with both direct and indirect object
  960.                     storage, and the template approach allows a switch of
  961.                     strategy with minimal rewriting. The data type of the
  962.                     stored elements is also easy to change using template
  963.                     parameters, and you are free to use any data type you
  964.                     want.
  965.  
  966.                     As you'll see, BIDS offers container/data structure
  967.                     combinations that match those of the Object-based
  968.                     version. For example, the Object library implements
  969.                     Stack using lists, so Stack can be simulated exactly
  970.                     with the template class BI_TCStackAsList. Let's look at
  971.                     the template approach in more detail.
  972.  
  973.  
  974.  
  975.  
  976.  
  977.  
  978.  
  979.  
  980.  
  981.  
  982.  
  983.  
  984.  
  985.  
  986.  
  987.                                   - 15 -
  988.  
  989.  
  990.  
  991.  
  992.  
  993.  
  994. ------------------  We discussed earlier the stack and its possible
  995.      ADTs and FDSs  implementations as a linked list or as a vector. The
  996. ------------------  potential for confusion is that stacks, lists, and
  997.                     vectors are all commonly referred to as data
  998.                     structures. However, there is a difference. We can
  999.                     define a stack abstractly in terms of its LIFO
  1000.                     accessibility, but it's difficult to envision a list
  1001.                     without thinking of specifics such as nodes and
  1002.                     pointers. Likewise, we picture a vector as a concrete
  1003.                     sequence of adjacent memory locations. So we call the
  1004.                     stack an ADT (abstract data type) and we call the list
  1005.                     and vector FDSs (fundamental data structures). The BIDS
  1006.                     container library offers each of the standard ADTs
  1007.                     implemented with a choice of appropriate FDSs. Table 1
  1008.                     indicates the combinations provided:
  1009.  
  1010.          ADTs as
  1011. fundamental data    -------------------------------------------------------
  1012.       structures                                      ADT              Sorted
  1013.                     FDS          Stack  Queue  Deque  Bag  Set  Array  Array
  1014.                     -------------------------------------------------------
  1015.  
  1016.                     Vector       x      x      x      x    x    x      x
  1017.                     List         x
  1018.                     DoubleList          x      x
  1019.  
  1020.                     -------------------------------------------------------
  1021.  
  1022.                     The abstract data types involved are Stacks, Queues,
  1023.                     Deques, Bags, Sets, and Arrays. Each ADT can be
  1024.                     implemented several different ways using the
  1025.                     fundamental data structures Vector, List, and
  1026.                     DoubleList as indicated by a bullet ( x ) in the table.
  1027.                     Thus, all ADTs are implemented as vectors. In addition,
  1028.                     Stacks are implemented as a list; Queues and Deques
  1029.                     implemented as doubly-linked lists. (Not shown in the
  1030.                     table are the sorted and counted FDSs from which
  1031.                     various ADTs can be developed.)
  1032.  
  1033.                     There is nothing sacred about these combinations; you
  1034.                     can use the template classes to develop your own
  1035.                     ADT/FDS implementations.
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043.  
  1044.  
  1045.                                   - 16 -
  1046.  
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052. ------------------  ADTs are implemented in both direct and indirect
  1053.    Class templates  versions. The direct versions store the objects
  1054. ------------------  themselves, while the indirect versions store pointers
  1055.                     to objects. You can store whatever objects you want as
  1056.                     elements in these FDSs using the power of templates.
  1057.                     Here are the ADT and FDS templates we provide:
  1058.  
  1059.  
  1060. ---------------------------------------------------------------------------
  1061. Table 2: FDS class templates
  1062.  
  1063. Class template              Description
  1064. ---------------------------------------------------------------------------
  1065.  
  1066. BI_VectorImp<T>             vector of Ts
  1067. BI_VectorIteratorImp<T>     iterator for a vector of Ts
  1068. BI_CVectorImp<T>            counted vector of Ts
  1069. BI_SVectorImp<T>            sorted vector of Ts
  1070. BI_IVectorImp<T>            vector of pointers to T
  1071. BI_IVectorIteratorImp<T>    iterator for a vector of pointers to T
  1072. BI_ICVectorImp<T>           counted vector of pointers to T
  1073. BI_ISVectorImp<T>           sorted vector of pointers to T
  1074. BI_ListImp<T>               list of Ts
  1075. BI_SListImp<T>              sorted list of Ts
  1076. BI_IListImp<T>              list of pointers to T
  1077. BI_ISListImp<T>             sorted list of pointers to T
  1078. BI_DoubleListImp<T>         double-linked list of Ts
  1079. BI_SDoubleListImp<T>        sorted double-linked list of Ts
  1080. BI_IDoubleListImp<T>        double-linked list of pointers to T
  1081. BI_ISDoubleListImp<T>       sorted double-linked list of pointers to T
  1082.  
  1083. ---------------------------------------------------------------------------
  1084.  
  1085.                     Each basic FDT has a direct and indirect iterator; to
  1086.                     save space we have shown only the Vector iterators.
  1087.  
  1088.                     The BI_ prefix stands for Borland International and the
  1089.                     suffix Imp for implementation. The indirect versions
  1090.                     have the prefix BI_I with the extra I for Indirect. The
  1091.                     extra prefixes S and C mean Sorted and Counted
  1092.                     respectively. The template parameter T in <T>
  1093.                     represents the data type of the objects to be stored.
  1094.                     You instantiate the template by supplying this data
  1095.                     type. For example, BI_ListImp<double> gives you a list
  1096.                     of doubles. See Table 3 on page 19 for a summary of
  1097.                     these abbreviations. For direct object storage, the
  1098.  
  1099.  
  1100.  
  1101.  
  1102.  
  1103.                                   - 17 -
  1104.  
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110.                     type T must have meaningful copy semantics and a
  1111.                     default constructor. Indirect containers, however, hold
  1112.                     pointers to T, and pointers always have
  1113.  
  1114.  
  1115.  
  1116.  
  1117.  
  1118.  
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.  
  1127.  
  1128.  
  1129.  
  1130.  
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.  
  1137.  
  1138.  
  1139.  
  1140.  
  1141.  
  1142.  
  1143.  
  1144.  
  1145.  
  1146.  
  1147.  
  1148.  
  1149.  
  1150.  
  1151.  
  1152.  
  1153.  
  1154.  
  1155.  
  1156.  
  1157.  
  1158.  
  1159.  
  1160.  
  1161.                                   - 18 -
  1162.  
  1163.  
  1164.  
  1165.  
  1166.  
  1167.  
  1168.                     good copy semantics. This means that indirect
  1169.                     containers can contain objects of any type.
  1170.  
  1171. Abbreviations in
  1172.   CLASSLIB names    -----------------------------------------------------------------
  1173.                     Abbreviation       Description
  1174.                     -----------------------------------------------------------------
  1175.  
  1176.                       I                Indirect
  1177.                       C                Counted
  1178.                       S                Sorted
  1179.                       O                Object-based, non-polymorphic
  1180.                       TC               Object-based, polymorphic (compatible with
  1181.                                        original Turbo C++ library)
  1182.  
  1183.                     -----------------------------------------------------------------
  1184.  
  1185.    For details see  For the sorted FDSs (BI_SVectorImp, BI_ISVectorImp, and
  1186.     the discussion  so on), T must have valid == and < operators to define
  1187.  under Sortable on  the ordering of the elements. It should be clear that
  1188.           page 94.  the IS variants refer to the objects being sorted, not
  1189.                     that the pointers to the objects are sorted.
  1190.  
  1191.                     Each implementation of an ADT with an FDS is named
  1192.                     using the convention (ADT)As(FDS)<T>, as follows:
  1193.  
  1194.  
  1195. ----------------------------------------------------------------------------
  1196. Table 4: ADT class templates
  1197.  
  1198. Class name                    Description
  1199. ----------------------------------------------------------------------------
  1200.  
  1201. BI_StackAsVector<T>           Stack of Ts as a vector
  1202. BI_QueueAsVector<T>           Queue of Ts as a vector
  1203. BI_DequeAsVector<T>           Deque of Ts as a vector
  1204. BI_BagAsVector<T>             Bag of Ts as a vector
  1205. BI_SetAsVector<T>             Set of Ts as a vector
  1206. BI_ArrayAsVector<T>           Array of Ts as a vector
  1207. BI_SArrayAsVector<T>          Sorted array of Ts as a vector
  1208.  
  1209. BI_IStackAsVector<T>          Stack of pointers to T as a vector
  1210. BI_IQueueAsVector<T>          Queue of pointers to T as a vector
  1211.  
  1212. ...                           and so on
  1213.  
  1214. BI_StackAsList<T>             Stack of Ts as a list
  1215. BI_IStackAsList<T>            Stack of pointers to T as a list
  1216.  
  1217.  
  1218.  
  1219.                                   - 19 -
  1220.  
  1221.  
  1222.  
  1223.  
  1224.  
  1225.  
  1226. Table 4: ADT class templates (continued)___________________________________
  1227.  
  1228. BI_QueueAsDoubleList<T>       Queue of Ts as a double list
  1229. BI_DequeAsDoubleList<T>       Deque of Ts as a double list
  1230. BI_IQueueAsDoubleList<T>      Queue of pointers to T as a double list
  1231. BI_IDequeAsDoubleList<T>      Deque of pointers to T as a double list
  1232.  
  1233. ----------------------------------------------------------------------------
  1234.  
  1235.     There are also  Again, the <T> argument, either a class or predefined
  1236.        BI_Oxxx and  data type, provides the data type for the contained
  1237.  BI_TCxxx variants  elements. Each of the bulleted items ( x ) in Table 1
  1238.    discussed soon.  can be mapped to two templates (direct and indirect
  1239.                     versions) with names following this convention.
  1240.  
  1241.  
  1242.    Container class  ========================================================
  1243.      compatibility
  1244.                     Each template must be instantiated with a particular
  1245.                     data type as the type of the element that it will hold.
  1246.                     This allows the compiler to generate the correct code
  1247.                     for dealing with any possible type of element without
  1248.                     restricting the elements to just those derived from
  1249.                     Object.
  1250.  
  1251.                     Each ADT is also used to instantiate two classes that
  1252.                     imitate the behavior of the Object class libraries. Here
  1253.                     is a list of them:
  1254.  
  1255.  
  1256.                     --------------------------------------------------------
  1257. Object-based FDS    Class name                Description
  1258.          classes    --------------------------------------------------------
  1259.  
  1260.                     BI_OStackAsVector         Stack of pointers to Object,
  1261.                                               as a vector
  1262.                     BI_OQueueAsVector         Queue of pointers to Object,
  1263.                                               as a vector
  1264.                     BI_ODequeAsVector         Deque of pointers to Object,
  1265.                                               as a vector
  1266.                     BI_OBagAsVector           Bag of pointers to Object, as
  1267.                                               a vector
  1268.                     BI_OSetAsVector           Set of pointers to Object, as
  1269.                                               a vector
  1270.                     BI_OArrayAsVector         Array of pointers to Object,
  1271.                                               as a vector
  1272.                     BI_OSArrayAsVector        Sorted array of pointers to
  1273.                                               Object, as a vector
  1274.  
  1275.  
  1276.  
  1277.                                   - 20 -
  1278.  
  1279.  
  1280.  
  1281.  
  1282.  
  1283.  
  1284.                     Table 5: Object-based FDS classes (continued)__________
  1285.  
  1286.                     BI_TCStackAsVector        Polymorphic stack of pointers
  1287.                                               to Object, as a vector
  1288.                     BI_TCQueueAsVector        Polymorphic queue of pointers
  1289.                                               to Object, as a vector
  1290.                     BI_TCDequeAsVector        Polymorphic deque of pointers
  1291.                                               to Object, as a vector
  1292.                     BI_TCBagAsVector          Polymorphic bag of pointers to
  1293.                                               Object, as a vector
  1294.                     BI_TCSetAsVector          Polymorphic set of pointers to
  1295.                                               Object, as a vector
  1296.                     BI_TCArrayAsVector        Polymorphic array of pointers
  1297.                                               to Object, as a vector
  1298.                     BI_TCSArrayAsVector       Polymorphic sorted array of
  1299.                                               pointers to Object, as a
  1300.                                               vector
  1301.  
  1302.                     BI_OStackAsList           Stack of pointers to Object,
  1303.                                               as a list
  1304.                     BI_TCStackAsList          Polymorphic stack of pointers
  1305.                                               to Object, as a list
  1306.  
  1307.                     BI_OQueueAsDoubleList     Queue of pointers to Object,
  1308.                                               as a double list
  1309.                     BI_ODequeAsDoubleList     Deque of pointers to Object,
  1310.                                               as a double list
  1311.  
  1312.                     BI_TCQueueAsDoubleList    Polymorphic queue of pointers
  1313.                                               to Object, as a double list
  1314.                     BI_TCDequeAsDoubleList    Polymorphic deque of pointers
  1315.                                               to Object, as a double list
  1316.  
  1317.                     --------------------------------------------------------
  1318.  
  1319.                     Note that these versions have no explicit <T>
  1320.                     parameters; they use the fixed data types shown
  1321. The TCxxx versions  (pointers to Object). The BI_Oxxx (O for Object library)
  1322.     offer the same  versions of these classes have no virtual functions.
  1323.       behavior and  This makes it easier for the compiler to generate inline
  1324.  interfaces as the  function expansions, which in turn makes the BI_Oxxx
  1325.    Object library.  versions of the containers somewhat faster than the
  1326.                     corresponding polymorphic BI_TCxxx (TC for Turbo C++)
  1327.                     versions. The obverse of the coin is that the BI_Oxxx
  1328.                     versions do not share the polymorphic behavior of the
  1329.                     Object container library.
  1330.  
  1331.  
  1332.  
  1333.  
  1334.  
  1335.                                   - 21 -
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341.  
  1342.                     In the Object container library, Stack implements a
  1343.                     stack as a polymorphic list of pointers to Object. The
  1344.                     BIDS class BI_TCStackAsList therefore mirrors the
  1345.                     Object-based class Stack. Even with BI_TCStackAsVector,
  1346.                     the public interface and semantics are the same as for
  1347.                     the Object-based Stack. The user "sees" the ADT while
  1348.                     the FDS is "hidden." For these reasons, we will not
  1349.                     repeat the alphabetic list of Object-based classes and
  1350.                     member functions for the BIDS library.
  1351.  
  1352.                     Consider your many choices when writing container code
  1353.                     with the BIDS model. You can gain speed over future
  1354.                     flexibility by using the non-polymorphic classes, such
  1355.                     as BI_OStackAsList or BI_OStackAsVector. Or you can
  1356.                     retain the polymorphism of the Object-based hierarchy by
  1357.                     using the BI_TCxxx classes.
  1358.  
  1359.  
  1360.       Header files  ========================================================
  1361.  
  1362.                     Each group of FDSs is defined in its own header file,
  1363.                     which contains templates for both the direct and the
  1364.                     indirect versions. The names of the headers are as
  1365.                     follows:
  1366.  
  1367.                       vectimp.h
  1368.                       listimp.h
  1369.                       dlistimp.h
  1370.  
  1371.                     In vectimp.h, for example, you'll find declarations for
  1372.                     all the vector, counted vector, and sorted vector
  1373.                     templates, together those for a direct and indirect
  1374.                     vector iterator.
  1375.  
  1376.                     Note also the stdtempl.h file that defines the useful
  1377.                     template functions min, max, and range. If you are new
  1378.                     to templates, this file offers a useful, gentle
  1379.                     introduction to the subject.
  1380.  
  1381.                     Each ADT family is defined in its own header file, named
  1382.                     as follows:
  1383.  
  1384.                       stacks.h
  1385.                       queues.h
  1386.                       deques.h
  1387.                       bags.h
  1388.                       sets.h
  1389.                       arrays.h
  1390.  
  1391.  
  1392.  
  1393.                                   - 22 -
  1394.  
  1395.  
  1396.  
  1397.  
  1398.  
  1399.  
  1400.    Note the plural  The file stacks.h, for example, defines the following
  1401.          form that  templates:
  1402.  distinguishes the
  1403. BIDS include files   BI_StackAsVector<T>
  1404.   from the Object-   BI_IStackAsVector<T>
  1405. based include file   BI_OStackAsVector
  1406.                      BI_TCStackAsVector
  1407.                      BI_StackAsList<T>
  1408.                      BI_IStackAsList<T>
  1409.                      BI_OStackAsList
  1410.                      BI_TCStackAsList
  1411.  
  1412.  
  1413.          Tuning an  ========================================================
  1414.        application
  1415.                     Consider the following example:
  1416.  
  1417.                      typedef BI_StackAsVector<int> intStack;
  1418.  
  1419.                      int main()
  1420.                      {
  1421.                        intStack is;
  1422.                        for( int i = 0; i < 10; i++ )
  1423.                          is.push( i );
  1424.                        for( i = 0; i < 10; i++ )
  1425.                          cout << is.pop() << endl;
  1426.                        return(0);
  1427.                      }
  1428.  
  1429.                     Here we are implementing a stack of ints using a vector
  1430.                     as the underlying data structure. If you later determine
  1431.                     that a list would be a more suitable implementation for
  1432.                     the stack, you can simply replace the typedef with the
  1433.                     following:
  1434.  
  1435.                         typedef BI_StackAsList<int> intStack;
  1436.  
  1437.                     After recompilation, the stack implementation is changed
  1438.                     from vector to list. Similarly, you can try a stack of
  1439.                     pointers to int, with:
  1440.  
  1441.                         typedef BI_IStackAsList<int> intStack;
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.                                   - 23 -
  1452.  
  1453.  
  1454.  
  1455.  
  1456.  
  1457.  
  1458. FDS implementation  ========================================================
  1459.  
  1460.                     Each FDS is implemented as two templates, one that
  1461.                     provides the direct version, and one that provides the
  1462.                     indirect version. The indirect version makes use of an
  1463.                     InternalIxxxImp class. The following simplified extract
  1464.                     from listimp.h will give you an idea how the different
  1465.                     list FDSs are implemented. Note that BI_ListElement<T>
  1466.                     is an internal template class used to implement the node
  1467.                     (data of type T and pointer to next node) of a list. The
  1468.                     direct list of objects of type T is implemented by the
  1469.                     template class BI_ListImp<T>, which also provides the
  1470.                     base for BI_SListImp<T> (sorted lists). The example
  1471.                     shows how the add member function is implemented in the
  1472.                     direct, indirect, sorted and unsorted lists.
  1473.  
  1474.                      template <class T> class BI_ListElement
  1475.                      {
  1476.                      public:
  1477.                        BI_ListElement( T t, BI_ListElement<T> *p ) : data(t)
  1478.                          { next = p->next; p->next = this; }
  1479.                      // constructor
  1480.                      ...
  1481.                        BI_ListElement<T> *next;    // pointer to next node
  1482.                        T data;                     // object at node
  1483.                      ...
  1484.                      };
  1485.  
  1486.                      template <class T> class BI_ListImp
  1487.                      // linked list (unsorted) of type T objects; assumes T
  1488.                      has meaningful // copy semantics and a default
  1489.                      constructor
  1490.                      {
  1491.                      public:
  1492.                      ...
  1493.                        void add( T t ) { new BI_ListElement<T>( t, &head );
  1494.                      }
  1495.                      // adds objects at head of list (shown inline here to
  1496.                      save space)
  1497.                        T peekHead() const { return head.next->data; }
  1498.                      ...
  1499.                      };
  1500.  
  1501.                      template <class T> class BI_SListImp : public
  1502.                      BI_ListImp<T>
  1503.                      // sorted list; assumes T has meaningful copy
  1504.  
  1505.  
  1506.  
  1507.  
  1508.  
  1509.                                   - 24 -
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.                      // semantics and a default constructor
  1517.                      {
  1518.                      public:
  1519.                      ...
  1520.                        void add( T t ) { new BI_ListElement<T>( t,
  1521.                      findPred(t) ); }
  1522.                      // adds object in sorted position
  1523.                      ...
  1524.                      };
  1525.  
  1526.                      template <class T, class List> class
  1527.                      BI_InternalIListImp : public List
  1528.                      {
  1529.                      ...
  1530.                        void add( T *t ) { List::add ( t ); }
  1531.                      };
  1532.                      // The work is done in this intermediate class
  1533.                      // used as base for BI_IListImp; list is
  1534.                      // unsorted so we use List::add
  1535.  
  1536.                      template <class T> class BI_IListImp :
  1537.                      public BI_InternalIListImp<T, BI_ListImp< void * > >
  1538.                      { ... };
  1539.                      /* unsorted list of pointers to objects of type T;
  1540.                         since pointers always have meaningful copy
  1541.                         semantics, this class can handle any object type;
  1542.                         add comes straight from BI_InternalIListImp
  1543.                      */
  1544.  
  1545.                      template <class T> class BI_ISListImp :
  1546.                      public BI_InternalIListImp<T>, BSListImp< void * >> {
  1547.                      ... };
  1548.                      /* sorted list of pointers to objects of type T; since
  1549.                         pointers always have meaningful copy semantics, this
  1550.                         class can handle any object type
  1551.                      */
  1552.  
  1553.                     In addition to the template classes shown here,
  1554.                     listimp.h also declares BI_ListIteratorImp<T> and
  1555.                     BI_IListIteratorImp<T>, the iterators for direct and
  1556.                     indirect lists.
  1557.  
  1558.                     In the next section on ADTs, you'll see how the
  1559.                     different stack implementations in stacks.h pull in the
  1560.                     vector and list FDSs declared in vectimp.h and
  1561.                     listimp.h.
  1562.  
  1563.  
  1564.  
  1565.  
  1566.  
  1567.                                   - 25 -
  1568.  
  1569.  
  1570.  
  1571.  
  1572.  
  1573.  
  1574.                     The double list templates, in dlistimp.h, follows the
  1575.                     same pattern. The sorted versions of list and double
  1576.                     list provide exactly the same interface as the non-
  1577.                     sorted ones, except that the add member function adds
  1578.                     new elements in sorted order. This speeds up subsequent
  1579.                     access and also makes it easier to implement priority
  1580.                     queues.
  1581.  
  1582.                     vectimp.h also follows a similar pattern to listimp.h,
  1583.                     implementing BI_VectorImp<T> (direct) and
  1584.                     BI_IVectorImp<T> (indirect). These are low-level vectors
  1585.                     with no notion of add or detach. To support more
  1586.                     sophisticated ADTs, the counted vector,
  1587.                     BI_CVectorImp<T>, derived from BI_VectorImp<T>, is
  1588.                     provided. This maintains a pointer to the last valid
  1589.                     entry in the underlying Vector. It has an add member
  1590.                     function that inserts its argument at the top (the next
  1591.                     available slot), and a detach member function that
  1592.                     removes its argument and compresses the array.
  1593.                     BI_CVectorImp<T> provides the base for the sorted vector
  1594.                     template BI_SVectorImp<T>. With a sorted vector, you can
  1595.                     run through the indices from 0 to the last valid entry,
  1596.                     and the objects will emerge in sort order. Here's a
  1597.                     simplified extract from vectimp.h:
  1598.  
  1599.                      // extract from vectimp.h
  1600.  
  1601.                      template <class T> class BI_VectorImp { ... };
  1602.                      // direct uncounted, unsorted vector
  1603.  
  1604.                      template <class T> class BI_CVectorImp : public
  1605.                      BI_VectorImp<T>
  1606.                      // direct counted, unsorted vector
  1607.                      {
  1608.                      public:
  1609.                      ...
  1610.                        void add( T t );
  1611.                      // add at top of array; inc count; resize array if
  1612.                      necessary
  1613.                        void detach( T t, int del = 0 );
  1614.                        void detach( unsigned loc, int del = 0 );
  1615.                      // detach given object or object at loc
  1616.                      ...
  1617.                      };
  1618.  
  1619.                      template <class T> class BI_SVectorImp : public
  1620.                      BI_CVectorImp<T>
  1621.                      // direct counted, sorted vector
  1622.  
  1623.  
  1624.  
  1625.                                   - 26 -
  1626.  
  1627.  
  1628.  
  1629.  
  1630.  
  1631.  
  1632.                      {
  1633.                      public:
  1634.                        void add( T t );
  1635.                      // add at position that maintains sort
  1636.                      };
  1637.  
  1638.                      template <class T, class Vect> class
  1639.                      BI_InternalIVectorImp :
  1640.                      public Vect {...};
  1641.                      // interdiate base for BI_IVectorImp: no add
  1642.  
  1643.                      template <class T> class BI_IVectorImp :
  1644.                      public BI_InternalIVectorImp<T, BI_VectorImp<void *> >
  1645.                      {...};
  1646.                      // indirect uncounted, unsorted vector: no add
  1647.  
  1648.                      template <class T, class Vect> class
  1649.                      BI_InternalICVectorImp :
  1650.                      public BI_InternalIVectorImp<T, Vect>
  1651.                      // intermediate base for BI_ICVector
  1652.                      {
  1653.                      public:
  1654.                        void add( T *t) { Vect::add(t); }
  1655.                      ...
  1656.                      };
  1657.  
  1658.                      template <class T> class BI_ICVectorImp :
  1659.                      public BI_InternalICVectorImp<T, BI_CVectorImp<void *>
  1660.                      >
  1661.                      { ... };
  1662.                      // indirect counted vector; can contain any object type
  1663.  
  1664.                      template <class T> class BI_ISVectorImp :
  1665.                      public BI_InternalICVectorImp<T, BI_SVectorImp<void *>
  1666.                      >
  1667.                      { ... };
  1668.                      // indirect sorted vector
  1669.  
  1670.  
  1671. ADT implementation  ========================================================
  1672.  
  1673.                     Each ADT is implemented as several templates. For
  1674.                     example, the following provides an implementation of a
  1675.                     stack of objects of type T using vectors as the FDS:
  1676.  
  1677.                      // simplified extract from stacks.h
  1678.  
  1679.  
  1680.  
  1681.  
  1682.  
  1683.                                   - 27 -
  1684.  
  1685.  
  1686.  
  1687.  
  1688.  
  1689.  
  1690.                      template <class Vect, class T> class
  1691.                      BI_StackAsVectorImp
  1692.                      {
  1693.                      public:
  1694.                      ...
  1695.                        void push( T t ) { data[current++] = t; }
  1696.                      ...
  1697.  
  1698.                      protected:
  1699.                        Vect data;
  1700.                        unsigned current;
  1701.                      };
  1702.  
  1703.                     The first parameter, class Vect, is either a direct
  1704.                     vector or an indirect vector, depending on whether the
  1705.                     stack being created is direct or indirect, so Vect will
  1706.                     be either BI_VectorImp<T0> or BI_IVectorImp<T0>. The
  1707.                     type T represents the type of objects to be stored in
  1708.                     the stack. For a direct Vect, T should be the same as
  1709.                     T0; for an indirect Vect, T must be of type pointer to
  1710.                     T0. A direct stack implemented as a vector looks like
  1711.                     this:
  1712.  
  1713.                      template <class T> class BI_StackAsVector :
  1714.                          public BI_StackAsVectorImp< BI_VectorImp<T>, T >
  1715.                      {
  1716.                      public:
  1717.                          friend class BI_StackAsVectorIterator<T>;
  1718.                          ...
  1719.                      };
  1720.  
  1721.                      template <class T> class BI_StackAsVectorIterator :
  1722.                          public BI_VectorIteratorImp<T> {...};
  1723.  
  1724.                     That is, a BI_StackAsVector is implemented by using a
  1725.                     BI_StackAsVectorImp, whose "implementation" is of type
  1726.                     BI_VectorImp<T>, and whose elements are of type T.
  1727.                     BI_StackAsVector has its own iterator, derived from
  1728.                     underpinning FDS iterator with the contained-object type
  1729.                     T as parameter.
  1730.  
  1731.                     An indirect stack implemented as a vector looks like
  1732.                     this:
  1733.  
  1734.                      template <class T> class BI_IStackAsVector :
  1735.                          public BI_StackAsVectorImp< BI_IVectorImp<T>, T* >,
  1736.                          public virtual TShouldDelete
  1737.                      {...};
  1738.  
  1739.  
  1740.  
  1741.                                   - 28 -
  1742.  
  1743.  
  1744.  
  1745.  
  1746.  
  1747.  
  1748.                     That is, an BI_IStackAsVector is implemented by using a
  1749.                     BI_StackAsVectorImp, whose "implementation" is of type
  1750.                     BI_IVectorImp<T>, and whose elements are of type pointer
  1751.                     to T. The TShouldDelete base provides the ownership
  1752.                     control discussed in the Object-based class reference
  1753.                     section. TShouldDelete also serves as a second base for
  1754.                     the following classes.
  1755.  
  1756. Figure 2: TShouldDelete hierarchy
  1757.  
  1758.     TShouldDelete*──────┬──Association*
  1759.                         ├──Container
  1760.                         ├──BI_IArrayAsVector+
  1761.                         ├──BI_IBagAsVector+
  1762.                         ├──BI_IDequeAsDoubleList+
  1763.                         ├──BI_IDequeAsVector+         *Instance classes
  1764.                         ├──BI_ISArrayAsVector+
  1765.                         ├──BI_ISObjectArray+
  1766.                         ├──BI_IStackAsList+           +Template classes
  1767.                         └──BI_IStackAsVector+
  1768.  
  1769.  
  1770.                     The BI_OStackAsVector and BI_TCStackAsVector versions
  1771.                     (stacks of pointers to Objects, emulating the Object
  1772.                     container library) now follow easily:
  1773.  
  1774.                      class BI_OStackAsVector
  1775.                      // non-polymorphic stack with vector of pointers to
  1776.                      Objects
  1777.                      {
  1778.                      public:
  1779.                      ...
  1780.                        void push( Object *t ) { ostack.push(t); }
  1781.                      // ostack is type BI_IStackAsVector<Object>
  1782.                      // so we are pushing pointers to Object
  1783.                      ...
  1784.  
  1785.                      private:
  1786.                        BI_IStackAsVector<Object> ostack;
  1787.                      };
  1788.  
  1789.                      class BI_TCStackAsVector : public Container
  1790.                      // polymorphic stack with vector of pointers to
  1791.                      Objects
  1792.                      // inherits from the Object-based Container class
  1793.                      // Provides identical interface and functionality as
  1794.                      Object-based Stack // class but underlying data
  1795.                      structure is Vector not List
  1796.  
  1797.  
  1798.  
  1799.                                   - 29 -
  1800.  
  1801.  
  1802.  
  1803.  
  1804.  
  1805.  
  1806.                          {
  1807.                      public:
  1808.                      ...
  1809.                        void push( Object& o ) { stk.push( &o ); }
  1810.                      // stk is type BI_OStackAsVector
  1811.                      // so we are pushing Objects
  1812.                      ...
  1813.                      private:
  1814.                        BI_OStackAsVector stk;
  1815.                      };
  1816.  
  1817.  
  1818.                     We end the section with some short examples using the
  1819.                     BIDS classes.
  1820.  
  1821.             Source   #include <iostream.h>
  1822.                      #include <strstream.h>
  1823.  Uses the template   #include <arrays.h>
  1824. facility to pick a   #include <strng.h>
  1825.   specific FDS for
  1826.     the array ADT.   int main()
  1827.                      {
  1828.                         typedef BI_SArrayAsVector<String> lArray;
  1829.     In the "sorted      lArray a(2);
  1830.    array" FDS, the      for (int i = a.arraySize(); i; i--)
  1831.         index of a      {
  1832.   particular array         ostrstream os;
  1833. element depends on         os << "string " << i << ends;
  1834.  its value, not on         a.add( *(new String(os.str())));
  1835. the order in which      }
  1836.    it was entered.      cout << "array elements;\n";
  1837.                         for (i = 0; i < a.arraySize(); ++i)
  1838.                         {
  1839.    If the ADT used         cout<< a[i] << endl;
  1840.   BI_ArrayAsVector      }
  1841.      <String>, the      return(0);
  1842.     elements would   }
  1843.      appear in the
  1844.    order they were
  1845.       added to the
  1846.             array.
  1847.  
  1848.             Output   string 1
  1849.                      string 2
  1850.                      string 3
  1851.  
  1852.             Source
  1853.  
  1854.  
  1855.  
  1856.  
  1857.                                   - 30 -
  1858.  
  1859.  
  1860.  
  1861.  
  1862.  
  1863.  
  1864. Doubly-linked list   #include <iostream.h>
  1865.      with indirect   #include <strstream.h>
  1866.    storage as FDS.   #include <deques.h>
  1867.                      #include <strng.h>
  1868.  
  1869. Pointers to String      typedef BI_IDequeAsDoubleList<String> lDeque;
  1870.     objects in the
  1871.    deque container   int main()
  1872.            must be   {
  1873.  dereferenced when      lDeque d;
  1874.    extracting from      for (int i = 1; i < 5; i++)
  1875.         the deque.      {
  1876.                            ostrstream os;
  1877.                            os << "string " << i << ends;
  1878.                            // use alternating left, right insertions
  1879.                            if(i&1)
  1880.                               d.putLeft(new String(os.str()));
  1881.                            else
  1882.                               d.putRight(new String(os.str()));
  1883.                         }
  1884.                         cout << "Deque Contents:" << endl;
  1885.                         while (!d.isEmpty())
  1886.                         {
  1887.                            cout << *d.getLeft() << endl;
  1888.                         }
  1889.                         return(0);
  1890.                      }
  1891.  
  1892.             Output   Deque Contents:
  1893.                      string 3
  1894.                      string 1
  1895.                      string 2
  1896.                      string 4
  1897.  
  1898.  
  1899.  
  1900. ===========================================================================
  1901. The class library directory
  1902. ===========================================================================
  1903.  
  1904.                     The files in the class library are set up in the
  1905.                     following directory structure:
  1906.  
  1907.  
  1908.  
  1909.  
  1910.  
  1911.  
  1912.  
  1913.  
  1914.  
  1915.                                   - 31 -
  1916.  
  1917.  
  1918.  
  1919.  
  1920.  
  1921.  
  1922.                              ╔═══════════╗
  1923.                              ║ CLASSLIB\ ║
  1924.                              ╚═════╤═════╝
  1925.      ┌──────────────┬──────────────┼───────────┬────────────┐
  1926. ╔════╧═════╗   ╔════╧════╗   ┌─────┴────┐   ╔══╧═══╗   ╔════╧══════╗
  1927. ║ INCLUDE\ ║   ║ SOURCE\ ║   │   OBJS   │   ║ LIB\ ║   ║ EXAMPLES\ ║
  1928. ╚══════════╝   ╚═════════╝   └──────────┘   ╚══════╝   ╚═══════════╝
  1929.  
  1930.                     The CLASSLIB directory is under the TC directory. The
  1931.                     contents of the directories in the class library are
  1932.                     discussed in more detail in the following sections.
  1933.  
  1934.  
  1935.        The INCLUDE  =======================================================
  1936.          directory
  1937.                     The INCLUDE directory contains the header files
  1938.                     necessary to compile a program that uses the class
  1939.                     library. You must put this directory on the include
  1940.                     search path when you compile your program. Modify
  1941.                     Options|Directories|Include Directories if you changed
  1942.                     the default setup.
  1943.  
  1944.                     For each BIDS ADT (abstract data type), such as Stack,
  1945.                     there is a header file called stacks.h. The Object-
  1946.                     based class Stack is declared in stack.h. If the
  1947.                     identifier TEMPLATES is #defined, either in an .h file
  1948.                     or via the command line _D option, then when stack.h is
  1949.                     preprocessed, the Object-based declarations for Stack
  1950.                     are bypassed and the template versions are included. In
  1951.                     particular, if TEMPLATES is #defined, Stack is #defined
  1952.                     as BI_TCStackAsList, so any code written for the
  1953.                     Object-based Stack will be compiled with the BIDS
  1954.                     version.
  1955.  
  1956.  
  1957. The OBJS directory  =======================================================
  1958.  
  1959.                     Subdirectories of the OBJS directory contain .PRJ file
  1960.                     samples.
  1961.  
  1962.  
  1963.         The SOURCE  =======================================================
  1964.          directory
  1965.                     The SOURCE directory contains the source files that
  1966.                     implement many of the member functions of the classes
  1967.                     in the library. These source files are provided as a
  1968.                     guide for implementing new classes.
  1969.  
  1970.  
  1971.  
  1972.  
  1973.                                   - 32 -
  1974.  
  1975.  
  1976.  
  1977.  
  1978.  
  1979.  
  1980.                     You also need these source files if you want to build a
  1981.                     library. There are project files for small and large
  1982.                     models, debug and non-debug versions, and template and
  1983.                     non-template versions.
  1984.  
  1985.  
  1986. ------------------  To create a new library using the small memory model,
  1987. Creating a library  proceed as follows:
  1988. ------------------
  1989.                     1. Open the CLASSLIBS\OBJS\S (for standard or BIDS) or
  1990.                        CLASSLIBS\OBJS\DBS (for debug) directory.
  1991.  
  1992.                     2. Create a directory for the new library.
  1993.  
  1994.                     3. Copy the project file that's closest to the one you
  1995.                        want to create to that directory (use TCLASSS.PRJ to
  1996.                        create a standard classlib, TCLASDBS.PRJ to create a
  1997.                        debug version, or BIDSS.PRJ to create a templatized
  1998.                        version).
  1999.  
  2000.                     4. Rename the project file to TCLASSS.PRJ.
  2001.  
  2002.                     5. Run TC and select Project|Open TCLASSS.PRJ.
  2003.  
  2004.                     6. Set Options|Compiler|Code Generation to the small
  2005.                        memory model.
  2006.  
  2007.                     7. Select Compile|Build all.
  2008.  
  2009.                     8. Copy the resultant .LIB file to the CLASSLIB\LIB
  2010.                        directory.
  2011.  
  2012.                     For a large memory model, in step 2 copy a xL.PRJ file
  2013.                     and in step 3 rename it to TCLASSL.PRJ.
  2014.  
  2015.         Important!  When you take a library that you have built and use it
  2016.                     in one of the sample projects, you must update the
  2017.                     project. See Chapter 7, "Managing multi-file projects"
  2018.                     for more information. You must also be sure to compile
  2019.                     your project with precisely the same switches and op-
  2020.                     tions you used to build the library. If you don't have
  2021.                     the same options, you will get warnings from the linker
  2022.                     when the executable file is built.
  2023.  
  2024.  
  2025.  
  2026.  
  2027.  
  2028.  
  2029.  
  2030.  
  2031.                                   - 33 -
  2032.  
  2033.  
  2034.  
  2035.  
  2036.  
  2037.  
  2038.  The LIB directory  =======================================================
  2039.  
  2040.                     The LIB directory contains the compiled source modules
  2041.                     archived into a library. You must put this directory on
  2042.                     the library search path when you link your program. For
  2043.                     information about modifying the library search path,
  2044.                     see Chapter 8, "The command-line compiler" (for
  2045.                     command-line options).
  2046.  
  2047.                     The Object-based container classes are in TCLASSx.LIB,
  2048.                     where x is the memory-model designation (S for small, C
  2049.                     for compact, M for medium, L for large, and H for
  2050.                     huge). For each of these there are debugging versions
  2051.                     TCLASDBx.LIB.
  2052.  
  2053.  
  2054.       The EXAMPLES  =======================================================
  2055.          directory
  2056.                     The CLASSLIB\EXAMPLES directory contains the example
  2057.                     programs and their project files. You can compile these
  2058.                     programs to see how the parts of the class library are
  2059.                     put together to form an application. Most of the
  2060.                     examples use one or two of the classes in the
  2061.                     hierarchy; other examples are more complex. Here is a
  2062.                     list of the example programs and the classes that they
  2063.                     use:
  2064.  
  2065.                     1. STRNGMAX: A very simple example using String.
  2066.  
  2067.                     2. REVERSE: An intermediate example using Stack and
  2068.                        String.
  2069.  
  2070.                     3. LOOKUP: An intermediate example using Dictionary and
  2071.                        Association.
  2072.  
  2073.                     4. QUEUETST: An intermediate example using Queue and
  2074.                        introducing a non-hierarchical class, Time.
  2075.  
  2076.                     5. DIRECTRY: An advanced example illustrating derived
  2077.                        user classes with SortedArray.
  2078.  
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084.  
  2085.  
  2086.  
  2087.  
  2088.  
  2089.                                   - 34 -
  2090.  
  2091.  
  2092.  
  2093.  
  2094.  
  2095.  
  2096. ===========================================================================
  2097. Preconditions and checks
  2098. ===========================================================================
  2099.  
  2100.                     Version 3.0 offers some new debugging tools. The class
  2101.                     libraries TCLASDBx.LIB and BIDSDBx.LIB (where x
  2102.                     represents the memory model, S, C, L, M, or H) provide
  2103.                     the debugging versions of TCLASSx.LIB and BIDSx.LIB.
  2104.  
  2105.                     checks.h defines two macros, PRECONDITION( arg ) and
  2106.                     CHECK( arg ). Each macro takes an arbitrary expression
  2107.                     as an argument, just like assert. At runtime, if the
  2108.                     expression evaluates to 0, an error message is
  2109.                     displayed and execution terminates. If the expression
  2110.                     evaluates to a nonzero value, execution continues in
  2111.                     the normal fashion.
  2112.  
  2113.                     Use PRECONDITION on entry to a function to check the
  2114.                     validity of the arguments and to do any other checking
  2115.                     to determine that the function has been invoked
  2116.                     correctly.
  2117.  
  2118.                     Use CHECK for internal checking during the course of
  2119.                     execution of the function.
  2120.  
  2121.                     Compilation of PRECONDITION and CHECK is controlled by
  2122.                     the value of a manifest constant named __DEBUG. If
  2123.                     __DEBUG has the value 0, PRECONDITION and CHECK are set
  2124.                     to empty macros. In other words, setting __DEBUG to 0
  2125.                     removes all debugging. If __DEBUG has the value 1,
  2126.                     PRECONDITION macros are expanded into the tests
  2127.                     described above, but CHECK macros are empty. So,
  2128.                     setting __DEBUG to 1 enables PRECONDITIONs and disables
  2129.                     CHECKs. Setting __DEBUG to 2 or more, or not defining
  2130.                     it at all, enables both forms of testing. Table 6
  2131.                     summarizes the available debugging modes:
  2132.  
  2133.  
  2134.                     -----------------------------------------------------------------
  2135.  Class debugging      __DEBUG      PRECONDITION    CHECK
  2136.            modes    -----------------------------------------------------------------
  2137.  
  2138.                       0               Off           Off
  2139.                       1               On            Off
  2140.                       >1              On            On
  2141.                       undefined       On            On
  2142.  
  2143.  
  2144.  
  2145.  
  2146.  
  2147.                                   - 35 -
  2148.  
  2149.  
  2150.  
  2151.  
  2152.  
  2153.  
  2154.                     -----------------------------------------------------------------
  2155.  
  2156.                     When developing a class, set __DEBUG to 2 or leave it
  2157.                     undefined. This gives you maximum checking when the
  2158.                     code is still being worked on. When the class works
  2159.                     properly, but the application that is going to use the
  2160.                     class hasn't been completed, set __DEBUG to 1, so that
  2161.                     incorrect calls from the application can be caught,
  2162.                     without the additional overhead of the internal
  2163.                     checking within the class. Once everything is working,
  2164.                     set __DEBUG to 0 to remove all checking. Two versions
  2165.                     of the .LIB file are provided that contain the class
  2166.                     library code: one with PRECONDITIONs enabled, and one
  2167.                     with no debugging. These are named TCLASDBX.LIB and
  2168.                     TCLASSX.LIB, where X is replaced with the letter for
  2169.                     the appropriate memory model: s, c, m, l, or h. The
  2170.                     .LIB with DB in its name is the one with PRECONDITIONs
  2171.                     enabled.
  2172.  
  2173.  
  2174.  
  2175. ===========================================================================
  2176. Container class reference
  2177. ===========================================================================
  2178.  
  2179.                     This section describes each class in the library as
  2180.                     follows. We give the include file where it is defined,
  2181.                     a diagram showing the parent of each class and
  2182.                     immediate offspring, some introductory remarks, data
  2183.                     members and member functions (with protoypes) listed
  2184.                     alphabetically, what friendly relations exist, and,
  2185.                     where appropriate, an example of the class's use. The
  2186.                     members listed in the See also section belong to the
  2187.                     class under discussion unless scope-qualified. Thus in
  2188.                     the section on class X, you could find See also foo,
  2189.                     Y::foo, and so on. The first foo refers to X::foo.
  2190.                     Class derivations and class members are public unless
  2191.                     otherwise noted as protected. We do not document
  2192.                     destructors since they all perform the usual way. Most
  2193.                     container classes have virtual destructors.
  2194.  
  2195.  
  2196.  
  2197.  
  2198.  
  2199.  
  2200.  
  2201.  
  2202.  
  2203.  
  2204.  
  2205.                                   - 36 -
  2206.  
  2207.  
  2208.                                                               AbstractArray
  2209.  
  2210.  
  2211.  
  2212. ===========================================================================
  2213. AbstractArray                                                    abstarry.h
  2214. ===========================================================================
  2215.  
  2216.                     ┌────────────┐  ╔═════════════╗   ┌────────────┐
  2217.                     │ Collection ├──╢AbstractArray╟─┬─┤   Array    │
  2218.                     └────────────┘  ╚═════════════╝ │ └────────────┘
  2219.                                                     │ ┌────────────┐
  2220.                                                     └─┤SortedArray │
  2221.                                                       └────────────┘
  2222.                     The abstract class AbstractArray offers random access
  2223.                     to the elements of the collection via an indexing
  2224.                     mechanism that maps a range of integers to the array
  2225.                     elements. Indexes can be positive or negative integers
  2226.                     with arbitrary lower and upper bounds (within the range
  2227.                     of int). Arrays derived from AbstractArray can be
  2228.                     dynamically resized as elements are added to them. The
  2229.                     data member delta determines how many additional
  2230.                     elements are assigned to the array when overflow
  2231.                     occurs. AbstractArray exists because the derived
  2232.                     classes SortedArray and Array have enough in common to
  2233.                     warrant combining the common properties into an
  2234.                     abstract base class. Since the derived classes differ
  2235.                     only in the implementation of the member functions
  2236.                     detach and the subscript operator, the remaining
  2237.                     functions can be encapsulated in AbstractArray.
  2238.  
  2239.  
  2240.       Data members  =======================================================
  2241.  
  2242.  
  2243.              delta  sizeType delta;                               protected
  2244.  
  2245.                     delta represents the additional number of elements that
  2246.                     will be assigned to the array if overflow occurs. If
  2247.                     delta is zero, the array will not be resized following
  2248.                     overflow.
  2249.  
  2250.   lastElementIndex  int lastElementIndex;                         protected
  2251.  
  2252.                     The index value of the last element added to the array.
  2253.                     For an empty array this data member has the value
  2254.                     (lowerbound - 1).
  2255.  
  2256.         lowerbound  int lowerbound;                               protected
  2257.  
  2258.  
  2259.  
  2260.  
  2261.  
  2262.  
  2263.                                   - 37 -
  2264.  
  2265.  
  2266. AbstractArray
  2267.  
  2268.  
  2269.  
  2270.                     The lower bound of the array index, returned by the
  2271.                     lowerBound member function. lowerbound is the minimum
  2272.                     legal value of the absolute index.
  2273.  
  2274.                     See also: lowerBound
  2275.  
  2276.         upperbound  int upperbound;                               protected
  2277.  
  2278.                     The current upper bound of the array index, returned by
  2279.                     the upperBound member function. upperbound is the
  2280.                     maximum legal value of the absolute index.
  2281.  
  2282.                     See also: upperBound
  2283.  
  2284.  
  2285.   Member functions  =======================================================
  2286.  
  2287.  
  2288.            destroy  void destroy( int atIndex );
  2289.  
  2290.                     Removes the object at the given index. Whether the
  2291.                     object itself is destroyed or not depends on the
  2292.                     array's ownership status. If the array currently owns
  2293.                     the object, the object will be destroyed, otherwise the
  2294.                     object survives. destroy is implemented with detach(
  2295.                     atIndex, DefDelete ).
  2296.  
  2297.  
  2298.          arraySize  sizeType arraySize() const;
  2299.  
  2300.                     Returns the current number of cells allocated
  2301.                     (upperbound - lowerbound + 1).
  2302.  
  2303.        constructor  AbstractArray( int anUpper, int aLower = 0, sizeType
  2304.                     aDelta = 0 );
  2305.  
  2306.                     Constructs and "zeroes" an array, given the upper and
  2307.                     lower index bounds. The default lower bound is 0, the
  2308.                     traditional origin for C arrays. The default delta is
  2309.                     also zero, giving a fixed, nonresizable array. If delta
  2310.                     is nonzero, run-time array overflow invokes the
  2311.                     reallocate member function to provide more space (in
  2312.                     increments of delta). A PRECONDITION is set to test if
  2313.                     the lower bound is greater than or equal to the lower
  2314.                     bound.
  2315.  
  2316.             detach  virtual void detach( int atIndex, DeleteType dt =
  2317.                     NoDelete );
  2318.  
  2319.  
  2320.  
  2321.                                   - 38 -
  2322.  
  2323.  
  2324.                                                               AbstractArray
  2325.  
  2326.  
  2327.  
  2328.                     virtual void detach( Object& toDetach, DeleteType dt =
  2329.                     NoDelete );
  2330.  
  2331.                     The first version removes the object at atIndex; the
  2332.                     second version removes the object toDetach. The value
  2333.                     of dt and the current ownership setting determine
  2334.                     whether the object itself will be deleted. DeleteType
  2335.                     is defined in the base class TShouldDelete as enum {
  2336.                     NoDelete, DefDelete, Delete }. The default value of dt,
  2337.                     NoDelete, means that the object will not be deleted
  2338.                     regardless of ownership. With dt set to Delete, the
  2339.                     object will be deleted regardless of ownership. If dt
  2340.                     is set to DefDelete, the object will only be deleted if
  2341.                     the array owns its elements.
  2342.  
  2343.                     See also: TShouldDelete::ownsElements
  2344.  
  2345.       initIterator  virtual ContainerIterator& initIterator() const;
  2346.  
  2347.                     Creates an external iterator for this array.
  2348.  
  2349.                     See also: ContainerIterator class
  2350.  
  2351.            isEqual  int isEqual( const Object& testObject ) const;
  2352.  
  2353.                     Returns 1 if the testObject array is equal to the
  2354.                     calling array. Equal means that the two arrays have the
  2355.                     same object ID, the arrays' dimensions are equal, and
  2356.                     that their components are equal in each index position.
  2357.                     Otherwise, isEqual returns 0.
  2358.  
  2359.         lowerBound  int lowerBound() const;
  2360.  
  2361.                     Returns the array's lowerbound.
  2362.  
  2363.           objectAt  Object& objectAt( int atIndex ) const;        protected
  2364.  
  2365.                     Returns a reference to the element at the given index.
  2366.  
  2367.                     See also: operator []
  2368.  
  2369.        operator []  Object& operator []( int atIndex ) const;
  2370.  
  2371.                     Returns a reference to the object at the given array
  2372.                     index.
  2373.  
  2374.    printContentsOn  void printContentsOn( ostream& outputStream ) const;
  2375.  
  2376.  
  2377.  
  2378.  
  2379.                                   - 39 -
  2380.  
  2381.  
  2382. AbstractArray
  2383.  
  2384.  
  2385.  
  2386.                     Prints an array, with header and trailer, to the given
  2387.                     stream.
  2388.  
  2389.              ptrAt  Object *ptrAt( int atIndex ) const;           protected
  2390.  
  2391.                     Returns a pointer to the element at the given index.
  2392.  
  2393.         reallocate  void reallocate( sizeType newSize );          protected
  2394.  
  2395.                     If delta is zero, reallocate gives an __EEXPANDFS
  2396.                     error. Otherwise, reallocate tries to create a new
  2397.                     array of size newSize (adjusted upwards to the nearest
  2398.                     multiple of delta). The existing array is copied to the
  2399.                     expanded array and then deleted. Unused elements in the
  2400.                     new array are zeroed. An __ENOMEM error is invoked if
  2401.                     there is insufficient memory for the reallocation.
  2402.  
  2403.        removeEntry  void removeEntry( int loc );                  protected
  2404.  
  2405.                     Reduces the array by one element. Elements from index
  2406.                     (loc + 1) upwards are copied to positions loc, (loc +
  2407.                     1), and so on. The original element at loc is lost.
  2408.  
  2409.            setData  void setData( int loc, Object *data );        protected
  2410.  
  2411.                     The given data replaces the existing element at the
  2412.                     index loc.
  2413.  
  2414.       squeezeEntry  void squeezeEntry( int squeezePoint );        protected
  2415.  
  2416.                     Reduces the array by one element. As for removeEntry
  2417.                     but squeezePoint is an index relative to the lower
  2418.                     bound
  2419.  
  2420.         upperBound  int upperBound() const;
  2421.  
  2422.                     Returns the array's current upperbound.
  2423.  
  2424.  
  2425.            Friends  =======================================================
  2426.  
  2427.                     ArrayIterator is a friend of AbstractArray
  2428.  
  2429.  
  2430.  
  2431.  
  2432.  
  2433.  
  2434.  
  2435.  
  2436.  
  2437.                                   - 40 -
  2438.  
  2439.  
  2440.                                                                       Array
  2441.  
  2442.  
  2443.  
  2444. ===========================================================================
  2445. Array                                                               array.h
  2446. ===========================================================================
  2447.  
  2448.                     ┌─────────────┐  ╔════════════╗
  2449.                     │AbstractArray├──╢   Array    ║
  2450.                     └─────────────┘  ╚════════════╝
  2451.  
  2452.                     The instance class Array is derived from class
  2453.                     AbstractArray. An Array object defines an array in
  2454.                     which the ordering of the elements is arbitrary. That
  2455.                     is, the element at index i of the array need have no
  2456.                     relationship to the element at index i + 1.
  2457.  
  2458.                     Array adds the functions add and addAt. While add
  2459.                     stores a given object at the next free place in the
  2460.                     array (expanding the array if necessary), addAt stores
  2461.                     the object at a specified index.
  2462.  
  2463.  
  2464.            Example  =======================================================
  2465.  
  2466.             Source   #include <iostream.h>
  2467.                      #include <array.h>
  2468.                      #include <strng.h>
  2469.                      #include <assoc.h>
  2470.  
  2471.                      int main()
  2472.                      {
  2473.                          Array a(2);
  2474.  
  2475.                          String *s1 = new String("a string");
  2476.                          String *s2 = new String("another string");
  2477.                          Association *a1 = new Association(*s1,*s2);
  2478.  
  2479.                          // Put some objects in the array
  2480.                          a.add(*s1);
  2481.                          a.add(*s2);
  2482.                          a.add(*a1);
  2483.  
  2484.                          // Print as a Container
  2485.                          cout << "As a container:\n" << a << endl << endl;
  2486.  
  2487.                          // Print as an Array
  2488.                          cout << "As an array:\n";
  2489.                          a.printContentsOn(cout);
  2490.  
  2491.                          // Print as elements
  2492.  
  2493.  
  2494.  
  2495.                                   - 41 -
  2496.  
  2497.  
  2498. Array
  2499.  
  2500.  
  2501.  
  2502.                          cout << "\nAs elements:\n";
  2503.                          for (int i = 0; i < a.arraySize(); ++i)
  2504.                              cout << a[i] << endl;
  2505.                          return(0);
  2506.                      }
  2507.  
  2508.             Output   As a container:
  2509.                      Array { a string,
  2510.                          another atring,
  2511.                           Association { a string, another string }
  2512.                       }
  2513.  
  2514.                      As an array:
  2515.                      Array { a string,
  2516.                          another atring,
  2517.                           Association { a string, another string }
  2518.                       }
  2519.  
  2520.                      As elements:
  2521.                      a string
  2522.                      another string
  2523.                      Association { a string, another string}
  2524.  
  2525.  
  2526.   Member functions  =======================================================
  2527.  
  2528.  
  2529.                add  virtual void add( Object& toAdd );
  2530.  
  2531.                     Adds the given object at the next available index at
  2532.                     the end of an array. Adding an element beyond the upper
  2533.                     bound leads to an overflow condition. If overflow
  2534.                     occurs and delta is nonzero, the array is expanded (by
  2535.                     sufficient multiples of delta bytes) to accommodate the
  2536.                     addition. If delta is zero, overflow gives an error.
  2537.  
  2538.              addAt  void addAt( Object& toAdd, int atIndex );
  2539.  
  2540.                     Writes the given object at the specified index. If that
  2541.                     index is occupied, the previous object is deleted. If
  2542.                     atIndex is beyond the upper bound, the array is
  2543.                     expanded if delta is nonzero. If delta is zero,
  2544.                     attempting to addAt beyond the upper bound gives an
  2545.                     error.
  2546.  
  2547.        constructor  Array( int anUpper, int aLower = 0, sizeType Delta = 0
  2548.                     );
  2549.  
  2550.  
  2551.  
  2552.  
  2553.                                   - 42 -
  2554.  
  2555.  
  2556.                                                                       Array
  2557.  
  2558.  
  2559.  
  2560.                     Constructs and "zeroes" an array by calling the base
  2561.                     AbstractArray constructor.
  2562.  
  2563.                     See also: AbstractArray::AbstractArray
  2564.  
  2565.                isA  virtual classType isA() const;
  2566.  
  2567.                     Returns arrayClass, the Arrays type ID.
  2568.  
  2569.             nameOf  virtual char *nameOf() const;
  2570.  
  2571.                     Returns "Array", the Array type ID string.
  2572.  
  2573.  
  2574.  
  2575. ===========================================================================
  2576. ArrayIterator                                                    abstarry.h
  2577. ===========================================================================
  2578.  
  2579.                     ┌─────────────────┐  ╔══════════════════╗
  2580.                     │ContainerIterator├──╢  ArrayIterator   ║
  2581.                     └─────────────────┘  ╚══════════════════╝
  2582.                     Provides iterator functions to traverse objects of the
  2583.                     class AbstractArray and its derived classes.
  2584.                     ArrayIterator is a friend class of AbstractArray
  2585.  
  2586.  
  2587.   Member functions  =======================================================
  2588.  
  2589.  
  2590.        constructor  ArrayIterator( const AbstractArray& toIterate );
  2591.  
  2592.                     Creates an iterator object for the given array.
  2593.  
  2594.                     See also: restart
  2595.  
  2596.            current  virtual Object& current();
  2597.  
  2598.                     Returns the object at the current index of the
  2599.                     iterator. If the current index doesn't refer to a valid
  2600.                     object, NOOBJECT is returned.
  2601.  
  2602.        operator ++  virtual Object& operator ++ ();
  2603.                     virtual Object& operator ++ ( int );
  2604.  
  2605.                     See ContainerIterator operator ++
  2606.  
  2607.     operator int()  virtual operator int();
  2608.  
  2609.  
  2610.  
  2611.                                   - 43 -
  2612.  
  2613.  
  2614. ArrayIterator
  2615.  
  2616.  
  2617.  
  2618.                     Conversion operator to test for end of iterator
  2619.                     position.
  2620.  
  2621.            restart  virtual void restart();
  2622.  
  2623.                     Sets the current index of the iterator to the first
  2624.                     nonempty object in the array.
  2625.  
  2626.  
  2627.  
  2628. ===========================================================================
  2629. Association                                                         assoc.h
  2630. ===========================================================================
  2631.  
  2632.                     ┌────────────┐  ╔════════════╗
  2633.                     │   Object   ├──╢Association ║
  2634.                     └────────────┘  ╚════════════╝
  2635.  
  2636.                     The Association class provides a simple mechanism for
  2637.                     associating two objects, known as the value object and
  2638.                     the key object, in one Association type object. These
  2639.                     combined objects are typically stored in a Dictionary
  2640.                     type object, which provides member functions to
  2641.                     retrieve the value when given the key, providing the
  2642.                     basic tools for many data-retrieval applications.
  2643.  
  2644.  
  2645.   Member functions  =======================================================
  2646.  
  2647.  
  2648.        constructor  Association( Object& key, Object& value );
  2649.  
  2650.                     Constructs an association object from the given key and
  2651.                     value objects.
  2652.  
  2653.        constructor  Association( const Association& a );
  2654.  
  2655.                     Copy constructor.
  2656.  
  2657.          hashValue  virtual hashValueType hashValue() const;
  2658.  
  2659.                     Returns the hash value of the association's key. See
  2660.                     HashTable::hashValue for more details.
  2661.  
  2662.                isA  virtual classType isA() const;
  2663.  
  2664.                     Returns associationClass, the Association type ID.
  2665.  
  2666.  
  2667.  
  2668.  
  2669.                                   - 44 -
  2670.  
  2671.  
  2672.                                                                 Association
  2673.  
  2674.  
  2675.  
  2676.      isAssociation  virtual int isAssociation() const;
  2677.  
  2678.                     Returns 1 for association objects (and 0 for other
  2679.                     object types).
  2680.  
  2681.            isEqual  virtual int isEqual( const Object& toObject ) const;
  2682.  
  2683.                     Returns 1 if toObject and the calling association have
  2684.                     equal keys, otherwise returns 0.
  2685.  
  2686.                key  Object& key() const;
  2687.  
  2688.                     Returns the key object of the association.
  2689.  
  2690.             nameOf  virtual char *nameOf() const;
  2691.  
  2692.                     Returns "Association", the Association type ID string.
  2693.  
  2694.            printOn  virtual void printOn( ostream& outputStream ) const;
  2695.  
  2696.   operator << is a  Prints the association on the given output stream.
  2697.  friend of Object.  printOn is really for internal use by the overloaded
  2698.       See page 87.  operator <<.
  2699.  
  2700.              value  Object& value() const;
  2701.  
  2702.                     Returns the value object of the association.
  2703.  
  2704.            Example  =======================================================
  2705.  
  2706.             Source   // File TASSOC.CPP: Illustrates the Association class
  2707.  
  2708.                      #include <string.h>     // For strlen()
  2709.                      #include <strng.h>
  2710.                      #include <assoc.h>
  2711.                      #include <iostream.h>
  2712.  
  2713.                      void identify(Object&);
  2714.  
  2715.                      main()
  2716.                      {
  2717.                          char s1[21], s2[81];
  2718.  
  2719.                          // Read a key
  2720.                          cout << "Enter a key: ";
  2721.                          cin >> s1;
  2722.                          cin.get();          // Eat newline
  2723.  
  2724.  
  2725.  
  2726.  
  2727.                                   - 45 -
  2728.  
  2729.  
  2730. Association
  2731.  
  2732.  
  2733.  
  2734.                          String str1(s1);
  2735.                          identify(str1);
  2736.  
  2737.                          // Read a value
  2738.                          cout << "Enter a value: ";
  2739.                          cin.getline(s2,81);
  2740.                          s2[strlen(s2) - 1] = '\0';
  2741.                          String str2(s2);
  2742.                          identify(str2);
  2743.  
  2744.                          Association a1(str1,str2);
  2745.                          identify(a1);
  2746.                          Association a2 = a1;
  2747.                          identify(a2);
  2748.  
  2749.                          cout << "Equal: " << a1.isEqual(a2) << endl;
  2750.                      }
  2751.  
  2752.                      void identify(Object& o)
  2753.                      {
  2754.                          // Echo an object and its type
  2755.                          cout << "Value: " << o
  2756.                               << ", Object type: " << o.nameOf()
  2757.                               << endl << endl;
  2758.                      }
  2759.  
  2760.             Output   Enter a key: class
  2761.                      Value: class, Object type: String
  2762.  
  2763.                      Enter a value: A group of related objects
  2764.                      Value: A group of related objects, Object type: String
  2765.  
  2766.                      Value:  Association { class, A group of related
  2767.                      objects }
  2768.                      , Object type: Association
  2769.  
  2770.                      Value:  Association { class, A group of related
  2771.                      objects }
  2772.                      , Object type: Association
  2773.  
  2774.                      Equal: 1
  2775.  
  2776.  
  2777.  
  2778.  
  2779.  
  2780.  
  2781.  
  2782.  
  2783.  
  2784.  
  2785.                                   - 46 -
  2786.  
  2787.  
  2788.                                                                         Bag
  2789.  
  2790.  
  2791.  
  2792. ===========================================================================
  2793. Bag                                                                   bag.h
  2794. ===========================================================================
  2795.  
  2796.                     ┌────────────┐  ╔════════════╗  ┌────────────┐
  2797.                     │ Collection ├──╢    Bag     ╟──┤    Set     │
  2798.                     └────────────┘  ╚════════════╝  └────────────┘
  2799.                     A Bag is an unordered collection that may contain more
  2800.                     than one of the same object. Bag also provides the base
  2801.                     class for Set. Unlike Bags, Sets can contain only one
  2802.                     copy of a any given object.
  2803.  
  2804.  
  2805.   Member functions  =======================================================
  2806.  
  2807.  
  2808.                add  virtual void add( Object& toAdd );
  2809.  
  2810.                     Adds the given object at the next available index at
  2811.                     the end of an array. Adding an element beyond the upper
  2812.                     bound leads to an overflow condition. If overflow
  2813.                     occurs and delta is nonzero, the array is expanded (by
  2814.                     sufficient multiples of delta bytes) to accommodate the
  2815.                     addition. If delta is zero, overflow gives an error.
  2816.  
  2817.        constructor  Bag( sizeType bagSize = DEFAULT_BAG_SIZE );
  2818.  
  2819.                     Constructs an empty bag. bagSize represents the initial
  2820.                     number of slots allocated.
  2821.  
  2822.             detach  virtual void detach( Object& toDetach, DeleteType dt =
  2823.                     NoDelete );
  2824.  
  2825.                     See Array::detach.
  2826.  
  2827.         findMember  virtual Object& findMember( Object& toFind ) const;
  2828.  
  2829.                     Returns the given object if found, otherwise returns
  2830.                     NOOBJECT.
  2831.  
  2832.          firstThat  virtual Object& firstThat( condFuncType testFuncPtr,
  2833.                     void *paramList ) const;
  2834.  
  2835.                     See also:   Container::firstThat, Object::firstThat
  2836.  
  2837.              flush  void flush( DeleteType dt = DefDelete );
  2838.  
  2839.  
  2840.  
  2841.  
  2842.  
  2843.                                   - 47 -
  2844.  
  2845.  
  2846. Bag
  2847.  
  2848.  
  2849.  
  2850.                     Removes all the elements from the bag without
  2851.                     destroying the bag. The value of dt determines whether
  2852.                     the elements themselves are destroyed. By default, the
  2853.                     ownership status of the bag determines their fate, as
  2854.                     explained in the detach member function. You can also
  2855.                     set dt to Delete and NoDelete.
  2856.  
  2857.                     See also: detach
  2858.  
  2859.            forEach  void forEach( void ( *actionFuncPtr)(Object& o, void
  2860.                     *), void *args );
  2861.  
  2862.                     See also:   Container::forEach
  2863.  
  2864. getItemsInContainer countType getItemsInContainer() const;
  2865.  
  2866.                     Returns the number of items in the bag.
  2867.  
  2868.          hasMember  virtual int hasMember( const Object& obj ) const;
  2869.  
  2870.                     Returns 1 if the given object is found in the bag,
  2871.                     otherwise returns 0.
  2872.  
  2873.       initIterator  ContainerIterator& initIterator() const;
  2874.  
  2875.                     Creates and returns an iterator for this bag.
  2876.  
  2877.                     See also: ContainerIterator class
  2878.  
  2879.                isA  virtual classType isA() const;
  2880.  
  2881.                     Returns bagClass the Bag type ID.
  2882.  
  2883.            isEmpty  int isEmpty() const;
  2884.  
  2885.                     Returns 1 if a container has no elements; otherwise
  2886.                     returns 0.
  2887.  
  2888.           lastThat  virtual Object& lastThat( condFuncType testFuncPtr,
  2889.                     void *paramList ) const;
  2890.  
  2891.                     Returns a reference to the last object in the container
  2892.                     that satisfies a given condition. You supply a
  2893.                     testFuncPtr that returns true for a certain condition.
  2894.                     You can pass arbitrary arguments via the paramList
  2895.                     argument. NOOBJECT is returned if no object in the
  2896.                     container meets the condition. Note that you are not
  2897.                     involved directly with iterators: firstThat and
  2898.  
  2899.  
  2900.  
  2901.                                   - 48 -
  2902.  
  2903.  
  2904.                                                                         Bag
  2905.  
  2906.  
  2907.  
  2908.                     lastThat create their own internal iterators, so you
  2909.                     can simply treat them as "search" functions.
  2910.  
  2911.                     See also:   firstThat, Object::firstThat,
  2912.                     Container::lastThat
  2913.  
  2914.             nameOf  virtual char *nameOf() const;
  2915.  
  2916.                     Returns "Bag", the Bag type ID string.
  2917.  
  2918.       ownsElements  int ownsElements();
  2919.                     void ownsElements( int del );
  2920.  
  2921.                     See TShouldDelete::ownsElements
  2922.  
  2923.  
  2924.  
  2925. ===========================================================================
  2926. BaseDate                                                            ldate.h
  2927. ===========================================================================
  2928.  
  2929.                     ┌────────────┐  ╔════════════╗  ┌────────────┐
  2930.                     │  Sortable  ├──╢  BaseDate  ╟──┤    Date    │
  2931.                     └────────────┘  ╚════════════╝  └────────────┘
  2932.                     BaseDate is an abstract class derived from Sortable
  2933.                     that provides basic date manipulation functions.
  2934.  
  2935.  
  2936.   Member functions  =======================================================
  2937.  
  2938.  
  2939.        constructor  BaseDate();                                   protected
  2940.  
  2941.                     Creates a BaseDate object with the current system date.
  2942.  
  2943.        constructor  BaseDate( unsigned char M, unsigned char D, unsigned Y
  2944.                     );                                            protected
  2945.  
  2946.                     Creates a BaseDate object with the given month, day,
  2947.                     and year.
  2948.  
  2949.        constructor  BaseDate( const BaseDate& BD );               protected
  2950.  
  2951.                     Copy constructor.
  2952.  
  2953.                Day  unsigned Day() const;
  2954.  
  2955.                     Returns the day of the month.
  2956.  
  2957.  
  2958.  
  2959.                                   - 49 -
  2960.  
  2961.  
  2962. BaseDate
  2963.  
  2964.  
  2965.  
  2966.          hashValue  virtual hashValueType hashValue() const;
  2967.  
  2968.                     Returns the hash value of the date object. See
  2969.                     HashTable::hashValue for more details.
  2970.  
  2971.                isA  virtual classType isA() const = 0;
  2972.  
  2973.                     A pure virtual function to return a classtype ID (to be
  2974.                     defined in  derived classes).
  2975.  
  2976.            isEqual  virtual int isEqual( const Object& testDate ) const;
  2977.  
  2978.                     Returns 1 if the object represents the same date as
  2979.                     testDate. Otherwise returns 0.
  2980.  
  2981.         isLessThan  virtual int isLessThan( const Object& testDate ) const;
  2982.  
  2983.                     Returns 1 if the object precedes testDate on the
  2984.                     calendar.
  2985.  
  2986.              Month  unsigned Month() const;
  2987.  
  2988.                     Returns the month.
  2989.  
  2990.             nameOf  virtual char *nameOf() const = 0;
  2991.  
  2992.                     Pure virtual function to be defined by derived classes
  2993.                     to return their object ID string.
  2994.  
  2995.            printOn  virtual void printOn( ostream& outputStream ) const =
  2996.                     0;
  2997.  
  2998.   operator << is a  Pure virtual function to be defined in derived classes
  2999.  friend of Object.  to print the date object on the given stream. printOn
  3000.       See page 87.  is for internal use by the overloaded operator <<.
  3001.  
  3002.             SetDay  void SetDay( unsigned char D );
  3003.  
  3004.                     Sets the day to D.
  3005.  
  3006.           SetMonth  void SetMonth( unsigned char M );
  3007.  
  3008.                     Sets the month to M.
  3009.  
  3010.            SetYear  void SetYear( unsigned Y );
  3011.  
  3012.                     Sets the year to Y.
  3013.  
  3014.  
  3015.  
  3016.  
  3017.                                   - 50 -
  3018.  
  3019.  
  3020.                                                                    BaseDate
  3021.  
  3022.  
  3023.  
  3024.               Year  unsigned Year() const;
  3025.  
  3026.                     Returns the year.
  3027.  
  3028.  
  3029.  
  3030. ===========================================================================
  3031. BaseTime                                                            ltime.h
  3032. ===========================================================================
  3033.  
  3034.                     ┌────────────┐  ╔════════════╗  ┌────────────┐
  3035.                     │  Sortable  ├──╢  BaseTime  ╟──┤    Time    │
  3036.                     └────────────┘  ╚════════════╝  └────────────┘
  3037.  
  3038.                     BaseTime is an abstract class derived from Sortable
  3039.                     that provides basic time manipulation functions.
  3040.  
  3041.  
  3042.   Member functions  =======================================================
  3043.  
  3044.  
  3045.        constructor  BaseTime();                                   protected
  3046.  
  3047.                     Creates a BaseTime object with the current system time.
  3048.  
  3049.        constructor  BaseTime( const BaseTime& BT );               protected
  3050.  
  3051.                     Copy constructor.
  3052.  
  3053.        constructor  BaseTime( unsigned char H, unsigned char M = 0,
  3054.                               unsigned char S = 0, unsigned char HD = 0
  3055.                               );                                  protected
  3056.  
  3057.                     Creates a BaseTime object with the given hour, minutes,
  3058.                     seconds, and hundredths of seconds.
  3059.  
  3060.          hashValue  virtual hashValueType hashValue() const;
  3061.  
  3062.                     Returns the hash value of the BaseTime object. See
  3063.                     HashTable::hashValue for more details.
  3064.  
  3065.               hour  unsigned hour() const;
  3066.  
  3067.                     Returns the hour.
  3068.  
  3069.         hundredths  unsigned hundredths() const;
  3070.  
  3071.  
  3072.  
  3073.  
  3074.  
  3075.                                   - 51 -
  3076.  
  3077.  
  3078. BaseTime
  3079.  
  3080.  
  3081.  
  3082.                     Returns the hundredths of a second.
  3083.  
  3084.                isA  virtual classType isA() const = 0;
  3085.  
  3086.                     Pure virtual function for a derived class to return its
  3087.                     class ID.
  3088.  
  3089.            isEqual  virtual int isEqual( const Object& testTime ) const;
  3090.  
  3091.                     Returns 1  if this object equals testTime; otherwise
  3092.                     returns 0.
  3093.  
  3094.         isLessThan  virtual int isLessThan( const Object& testTime ) const;
  3095.  
  3096.                     Returns 1  if this object is less than testTime;
  3097.                     otherwise returns 0 .
  3098.  
  3099.             minute  unsigned minute() const;
  3100.  
  3101.                     Returns the minute.
  3102.  
  3103.             nameOf  virtual char *nameOf() const = 0;
  3104.  
  3105.                     Pure virtual function to be defined by derived classes
  3106.                     to return their object ID string.
  3107.  
  3108.            printOn  virtual void printOn( ostream& outStream ) const = 0;
  3109.  
  3110.   operator << is a  Pure virtual function to be defined in derived classes
  3111.  friend of Object.  to print the time object on the given stream. printOn
  3112.       See page 87.  is for internal use by the overloaded operator <<.
  3113.  
  3114.             second  unsigned second() const;
  3115.  
  3116.                     Returns the seconds.
  3117.  
  3118.            setHour  void setHour( unsigned char H );
  3119.  
  3120.                     Sets the hour to H.
  3121.  
  3122.      setHundredths  void setHundredths( unsigned char HD );
  3123.  
  3124.                     Sets the hundredths of a second to HD.
  3125.  
  3126.          setMinute  void  setMinute( unsigned char M );
  3127.  
  3128.                     Sets the minutes.
  3129.  
  3130.  
  3131.  
  3132.  
  3133.                                   - 52 -
  3134.  
  3135.  
  3136.                                                                    BaseTime
  3137.  
  3138.  
  3139.  
  3140.          setSecond  void  setSecond( unsigned char S );
  3141.  
  3142.                     Sets the seconds.
  3143.  
  3144.  
  3145.  
  3146. ===========================================================================
  3147. Btree                                                               btree.h
  3148. ===========================================================================
  3149.  
  3150.                     ┌────────────┐  ╔════════════╗
  3151.                     │ Collection ├──╢   Btree    ║
  3152.                     └────────────┘  ╚════════════╝
  3153.  
  3154.                     The class Btree, derived from Collection, implements
  3155.                     the B-tree, a popular data structure offering efficient
  3156.                     storage and retrieval with large, dynamic volumes of
  3157.                     data. (A detailed account of Turbo C++ development of
  3158.                     B-tree theory is beyond the scope of this manual: see
  3159.                     BTREE.CPP and D. E Knuth's The Art of Computer
  3160.                     Programming, Volume 3, 6.2.3.). Btree makes use of
  3161.                     several auxiliary, noncontainer friend classes: Node,
  3162.                     Item, InnerNode, and LeafNode (the last two being
  3163.                     derived from Node). You can study these in btree.h.
  3164.                     Here, we will just outline the members of the Btree
  3165.                     class, which should suffice for most applications.
  3166.  
  3167.  
  3168.   Member functions  =======================================================
  3169.  
  3170.  
  3171.                add  void add( Object& );
  3172.  
  3173.                     Add the given object to the B-tree.
  3174.  
  3175.        constructor  Btree( int ordern = 3 );
  3176.  
  3177.                     Creates a B-tree of order ordern (default order is 3).
  3178.  
  3179.        decrNofKeys  void decrNofKeys();                           protected
  3180.  
  3181.                     Decrements the itemsInContainer data member
  3182.  
  3183.             detach  void detach( Object& toDetach, DeleteType dt = NoDelete
  3184.                     );
  3185.  
  3186.  
  3187.  
  3188.  
  3189.  
  3190.  
  3191.                                   - 53 -
  3192.  
  3193.  
  3194. Btree
  3195.  
  3196.  
  3197.  
  3198.                     Removes the given object from the B-tree. The fate of
  3199.                     the removed object depends on the argument dt. See
  3200.                     TShouldDelete for details.
  3201.  
  3202.         findMember  virtual Object& findMember( const Object& toFind )
  3203.                     const;
  3204.  
  3205.                     Returns the given object if found, otherwise returns
  3206.                     NOOBJECT.
  3207.  
  3208.              flush  void flush( DeleteType dt = DefDelete );
  3209.  
  3210.                     Flushes (empties) the B-tree. The fate of the removed
  3211.                     objects depends on the argument dt. See TShouldDelete
  3212.                     for details.
  3213.  
  3214.          hasMember  virtual int hasMember( const Object& obj ) const;
  3215.  
  3216.                     Returns 1  if the given object is found in the B-tree,
  3217.                     otherwise returns 0.
  3218.  
  3219.          hashValue  virtual hashValueType hashValue() const;
  3220.  
  3221.                     Returns the hash value of this B-tree. See
  3222.                     HashTable::hashValue for more details.
  3223.  
  3224.              i_add  long i_add( const Object& obj );              protected
  3225.  
  3226.                     Adds the given object to the tree and returns the index
  3227.                     in the tree at which the object was inserted.
  3228.  
  3229.        incrNofKeys  void incrNofKeys();                           protected
  3230.  
  3231.                     Increments the itemsInContainer data member
  3232.  
  3233.       initIterator  virtual ContainerIterator& initIterator() const;
  3234.  
  3235.                     Creates an iterator for this B-tree.
  3236.  
  3237.                     See also: Container::initIterator
  3238.  
  3239.                isA  virtual classType isA() const;
  3240.  
  3241.                     Returns btreeClass, the Btree class ID
  3242.  
  3243.            isEqual  virtual int isEqual( const Object& testObject ) const;
  3244.  
  3245.                     Returns 1  if testObject is the same as this object.
  3246.  
  3247.  
  3248.  
  3249.                                   - 54 -
  3250.  
  3251.  
  3252.                                                                       Btree
  3253.  
  3254.  
  3255.  
  3256.             nameOf  virtual char *nameOf() const;
  3257.  
  3258.                     Returns "Btree", the Btree class ID string
  3259.  
  3260.        operator []  Object& operator[]( long i ) const;
  3261.  
  3262.                     Returns the root at index i
  3263.  
  3264.              order  int order();
  3265.  
  3266.                     Returns the order of the B-tree.
  3267.  
  3268.            printOn  virtual void printOn( ostream& outputStream ) const;
  3269.  
  3270.   operator << is a  Sends the formatted B-tree data to the given output
  3271.  friend of Object.  stream. printOn is for internal use by the overloaded
  3272.       See page 87.  operator <<.
  3273.  
  3274.               rank  long rank( const Object& obj ) const;
  3275.  
  3276.                     Returns the rank of the given object in the B-tree.
  3277.  
  3278.  
  3279.            Friends  =======================================================
  3280.  
  3281.                     Node, InnerNode, and LeafNode are friends of Btree.
  3282.  
  3283.  
  3284.  
  3285. ===========================================================================
  3286. BtreeIterator                                                       btree.h
  3287. ===========================================================================
  3288.  
  3289.                     ┌─────────────────┐  ╔══════════════════╗
  3290.                     │ContainerIterator├──╢  BtreeIterator   ║
  3291.                     └─────────────────┘  ╚══════════════════╝
  3292.  
  3293.                     The class BtreeIterator is derived from
  3294.                     ContainerIterator. Its members follow the same scheme
  3295.                     as those for the other container iterators.
  3296.  
  3297.  
  3298.  
  3299.  
  3300.  
  3301.  
  3302.  
  3303.  
  3304.  
  3305.  
  3306.  
  3307.                                   - 55 -
  3308.  
  3309.  
  3310. BtreeIterator
  3311.  
  3312.  
  3313.  
  3314.   Member functions  =======================================================
  3315.  
  3316.  
  3317.        constructor  BtreeIterator( const Btree& toIterate );
  3318.  
  3319.                     See ContainerIterator constructor
  3320.  
  3321.            current  virtual Object& current();
  3322.  
  3323.                     See ContainerIterator::current
  3324.  
  3325.        operator ++  virtual Object& operator ++();
  3326.                     virtual Object& operator ++( int );
  3327.  
  3328.                     See ContainerIterator::operator ++
  3329.  
  3330.       operator int  virtual operator int();
  3331.  
  3332.                     Conversion operator to test for end of iterator
  3333.                     position.
  3334.  
  3335.            restart  virtual void restart();
  3336.  
  3337.                     See ContainerIterator::restart
  3338.  
  3339.  
  3340.  
  3341.  
  3342.  
  3343.  
  3344.  
  3345.  
  3346.  
  3347.  
  3348.  
  3349.  
  3350.  
  3351.  
  3352.  
  3353.  
  3354.  
  3355.  
  3356.  
  3357.  
  3358.  
  3359.  
  3360.  
  3361.  
  3362.  
  3363.  
  3364.  
  3365.                                   - 56 -
  3366.  
  3367.  
  3368.                                                                  Collection
  3369.  
  3370.  
  3371.  
  3372. ===========================================================================
  3373. Collection                                                        collect.h
  3374. ===========================================================================
  3375.  
  3376.                                                      ┌─────────────┐
  3377.                                                    ┌─┤AbstractArray│
  3378.                                                    │ └─────────────┘
  3379.                                                    │ ┌─────────────┐
  3380.                                                    ├─┤  HashTable  │
  3381.                                                    │ └─────────────┘
  3382.                     ┌────────────┐  ╔════════════╗ │ ┌─────────────┐
  3383.                     │ Container  ├──╢ Collection ╟─┼─┤    List     │
  3384.                     └────────────┘  ╚════════════╝ │ └─────────────┘
  3385.                                                    │ ┌─────────────┐
  3386.                                                    ├─┤ DoubleList  │
  3387.                                                    │ └─────────────┘
  3388.                                                    │ ┌─────────────┐
  3389.                                                    ├─┤    Bag      │
  3390.                                                    │ └─────────────┘
  3391.                                                    │ ┌─────────────┐
  3392.                                                    └─┤    Btree    │
  3393.                                                      └─────────────┘
  3394.  
  3395.                     Collection is an abstract class derived from the
  3396.                     abstract class Container. This means that although
  3397.                     Collection is more specialized than Container, it still
  3398.                     cannot be used directly for creating useful objects but
  3399.                     exists only as a further stepping stone towards usable,
  3400.                     derived instance classes.
  3401.  
  3402.                     Collection inherits five pure virtual functions (flush,
  3403.                     initIterator, isA, nameOf and getItemsInContainer),
  3404.                     that simply await definitions down the road by derived
  3405.                     instance classes.
  3406.  
  3407.                     Collection extends the functionality of Container in
  3408.                     several areas by adding both virtual and pure virtual
  3409.                     member functions. The extra pure virtual functions are
  3410.                     add and detach. Instance classes ultimately derived
  3411.                     from Collection, therefore, will need to provide
  3412.                     appropriate member functions for adding and removing
  3413.                     elements.
  3414.  
  3415.                     The other (non-pure) virtual member functions added by
  3416.                     Collection are destroy, hasMember, and findMember. The
  3417.                     last two provide the key difference between Collection
  3418.                     and Container. A Collection-derived object can
  3419.                     determine if any given object is a member (with
  3420.  
  3421.  
  3422.  
  3423.                                   - 57 -
  3424.  
  3425.  
  3426. Collection
  3427.  
  3428.  
  3429.  
  3430.                     hasMember) and, by using an iterator, can locate a
  3431.                     member object within the collection (with findMember).
  3432.  
  3433.                     The offspring of Collection refine these access methods
  3434.                     in various ways, and add other functions. In most
  3435.                     applications, you will be dealing directly with a
  3436.                     particular derived class of Collection, chosen to match
  3437.                     your needs: sorted and unsorted arrays, hash tables,
  3438.                     bags, sets, dictionaries, and single and double lists.
  3439.                     However, it is useful to have a feel for how these
  3440.                     instance classes build up from abstract classes, and
  3441.                     why it is useful to have intermediate abstract classes.
  3442.  
  3443.  
  3444.   Member functions  =======================================================
  3445.  
  3446.  
  3447.                add  virtual void add( Object& o ) = 0;
  3448.  
  3449.                     Pure virtual function to be defined in derived classes
  3450.                     to add an object to a collection.
  3451.  
  3452.        constructor  Uses the Container base constructor.
  3453.  
  3454.            destroy  void destroy( const Object& o );
  3455.  
  3456.                     Removes an object from a Collection. Whether the object
  3457.                     itself is destroyed or not depends on the ownership
  3458.                     status of the collection. If the collection currently
  3459.                     owns the object, the object will be destroyed,
  3460.                     otherwise the object survives. destroy is implemented
  3461.                     with detach( o, DefDelete );
  3462.  
  3463.                     See also:   TShouldDelete::ownsElements
  3464.  
  3465.             detach  virtual void detach( Object& o, DeleteType dt =
  3466.                     NoDelete) = 0;
  3467.  
  3468.                     Pure virtual function to be defined in derived classes
  3469.                     to remove an object from a collection. The destruction
  3470.                     of the object depends both on the ownership status and
  3471.                     the value (Delete, NoDelete, or DefDelete) passed via
  3472.                     the dt argument.
  3473.  
  3474.                     See also:   destroy, TShouldDelete::ownsElements
  3475.  
  3476.         findMember  virtual Object& findMember( const Object& testObject )
  3477.                     const;
  3478.  
  3479.  
  3480.  
  3481.                                   - 58 -
  3482.  
  3483.  
  3484.                                                                  Collection
  3485.  
  3486.  
  3487.  
  3488.                     Returns the test object if it is in the collection,
  3489.                     otherwise returns NOOBJECT.
  3490.  
  3491.          hasMember  virtual int hasMember( const Object& o ) const;
  3492.  
  3493.                     Returns 1  if the collection contains the given object.
  3494.  
  3495.  
  3496.  
  3497. ===========================================================================
  3498. Container                                                         contain.h
  3499. ===========================================================================
  3500.  
  3501.                                  ┌────────────┐
  3502.                                ┌─┤ Collection │
  3503.                                │ └────────────┘
  3504. ┌────────────┐  ╔════════════╗ │ ┌────────────┐
  3505. │   Object   ├──╢ Container  ╟─┼─┤   Stack    │
  3506. └────────────┘  ╚════════════╝ │ └────────────┘
  3507.                                │ ┌────────────────────┐
  3508.                                ├─┤   PriorityQueue    │
  3509.                                │ └────────────────────┘
  3510.                                │
  3511.                                │ ┌────────────┐ ┌────────────┐ 
  3512.                                └─┤   Deque    ├─┤   Queue    │
  3513.                                  └────────────┘ └────────────┘
  3514.                                  
  3515.  
  3516.                     The abstract class Container, derived directly from
  3517.                     Object, is the base for all the container classes.
  3518.                     Container has a second pure virtual base class (not
  3519.                     shown) called TShouldDelete. Container provides the
  3520.                     following functionality:
  3521.  
  3522.                     1. A container can store objects of other classes,
  3523.                        known as elements or items. (The objects in a
  3524.                        container are sometimes called "members" of the
  3525.                        container, but this usage can lead to ambiguities in
  3526.                        C++.) A container can flush itself by removing all
  3527.                        its elements.
  3528.  
  3529.                     2. A container can determine the number of objects it
  3530.                        holds. Empty containers are allowed.
  3531.  
  3532.                     3. Container is also derived from TShouldDelete
  3533.                        (multiple inheritance), which lets you control the
  3534.                        ownership of a container's elements. By default, a
  3535.                        container owns its elements, meaning that it will
  3536.  
  3537.  
  3538.  
  3539.                                   - 59 -
  3540.  
  3541.  
  3542. Container
  3543.  
  3544.  
  3545.  
  3546.                        destroy them when its destructor is called or when
  3547.                        it is flushed.
  3548.  
  3549.                     4. A container can create external iterators, objects
  3550.                        of type ContainerIterator, which can be used to
  3551.                        traverse the container, element by element. With
  3552.                        external iterators, you need to handle the scanning
  3553.                        of the elements yourself. Other iterators, known as
  3554.                        internal iterators, are generated automatically by
  3555.                        certain member functions. These do their own loop
  3556.                        tests and can perform arbitrary actions on each
  3557.                        element (forEach). Member functions are also
  3558.                        available for scanning the container until a certain
  3559.                        condition is satisfied (firstThat, lastThat).
  3560.  
  3561.                     5. A container can test if it is equal to another
  3562.                        container.
  3563.  
  3564.                     6. A container can display its elements on streams in a
  3565.                        formatted way. A printOn function is provided from
  3566.                        which the usual overloaded << output operator can be
  3567.                        obtained.
  3568.  
  3569.                     Strictly speaking, some of the above member functions
  3570.                     are pure virtual functions that need to be defined in
  3571.                     derived classes. See Collection class for a more
  3572.                     detailed discussion.
  3573.  
  3574.                     Specialized containers are derived to two ways:
  3575.                     directly derived are the classes Stack, PriorityQueue,
  3576.                     and Deque (from which Queue is derived). Derived
  3577.                     indirectly via another abstract class, Collection, are
  3578.                     AbstractArray, HashTable, Bag, Btree, List, and
  3579.                     DoubleList.
  3580.  
  3581.   itemsInContainer  countType itemsInContainer;                   protected
  3582.  
  3583.                     Holds the current number of elements in the container.
  3584.  
  3585.                     See also: getItemsInContainer
  3586.  
  3587.  
  3588.   Member functions  =======================================================
  3589.  
  3590.  
  3591.        constructor  Container();
  3592.  
  3593.                     Creates an empty container.
  3594.  
  3595.  
  3596.  
  3597.                                   - 60 -
  3598.  
  3599.  
  3600.                                                                   Container
  3601.  
  3602.  
  3603.  
  3604.          firstThat  virtual Object& firstThat( condFuncType testFuncPtr,
  3605.                     void *paramList ) const;
  3606.  
  3607.                     Returns a reference to the first object in the
  3608.                     container that satisfies a given condition. You supply
  3609.                     a testFuncPtr that returns true for a certain
  3610.                     condition. You can pass arbitrary arguments via the
  3611.                     paramList argument. NOOBJECT is returned if no object
  3612.                     in the container meets the condition. Note that you are
  3613.                     not involved directly with iterators: firstThat and
  3614.                     lastThat create their own internal iterators, so you
  3615.                     can simply treat them as "search" functions.
  3616.  
  3617.                     See also:   lastThat, Object::firstThat
  3618.  
  3619.              flush  virtual void flush( DeleteType dt = DefDelete ) = 0;
  3620.  
  3621.                     A pure virtual function to be defined in derived
  3622.                     classes. Flushing means removing all the elements from
  3623.                     the container without destroying it. The value of dt
  3624.                     determines whether the elements themselves are
  3625.                     destroyed. By default, the ownership status of the
  3626.                     container determines their fate. You can also set dt to
  3627.                     Delete and NoDelete.
  3628.  
  3629.                     See also: TShouldDelete::ownsElements
  3630.  
  3631.            forEach  virtual void forEach( iterFuncType actionFuncPtr, void
  3632.                     *args );
  3633.  
  3634.                     forEach creates an internal iterator to execute the
  3635.                     given action function for each element in the
  3636.                     container. The args argument lets you pass arbitrary
  3637.                     data to the action function.
  3638.  
  3639. getItemsInContainer virtual countType getItemsInContainer() const = 0;
  3640.  
  3641.                     Pure virtual function to be defined by derived classes
  3642.                     to return the number of elements in a container.
  3643.  
  3644.          hashValue  virtual hashValueType hashValue() const = 0;
  3645.  
  3646.                     A pure virtual function to be defined by derived
  3647.                     classes to return the hash value of an object. See
  3648.                     HashTable::hashValue for more details.
  3649.  
  3650.       initIterator  virtual ContainerIterator& initIterator() const = 0;
  3651.  
  3652.  
  3653.  
  3654.  
  3655.                                   - 61 -
  3656.  
  3657.  
  3658. Container
  3659.  
  3660.  
  3661.  
  3662.                     Pure virtual function to be defined in derived classes
  3663.                     to initialize an external container iterator.
  3664.  
  3665.                isA  virtual classType isA() const = 0;
  3666.  
  3667.                     Pure virtual function to be defined in derived classes
  3668.                     to return their class ID.
  3669.  
  3670.            isEmpty  virtual int isEmpty() const = 0;
  3671.  
  3672.                     Pure virtual function to be defined in derived classes.
  3673.                     Returns 1  if a container has no elements; otherwise
  3674.                     returns 0.
  3675.  
  3676.            isEqual  virtual int isEqual( const Object& testObject ) const;
  3677.  
  3678.                     Returns 1  if the testObject is a container of the same
  3679.                     type and size as this container, and with the same
  3680.                     objects in the same order. Otherwise returns 0.
  3681.  
  3682.           lastThat  virtual Object& lastThat( condFuncType testFuncPtr,
  3683.                     void *paramList ) const;
  3684.  
  3685.                     Returns a reference to the last object in the container
  3686.                     that satisfies a given condition. You supply a
  3687.                     testFuncPtr that returns true for a certain condition.
  3688.                     You can pass arbitrary arguments via the paramList
  3689.                     argument. NOOBJECT is returned if no object in the
  3690.                     container meets the condition. Note that you are not
  3691.                     involved directly with iterators: firstThat and
  3692.                     lastThat create their own internal iterators, so you
  3693.                     can simply treat them as "search" functions.
  3694.  
  3695.                     See also:   firstThat, Object::firstThat
  3696.  
  3697.             nameOf  virtual char *nameOf() const = 0;
  3698.  
  3699.                     Pure virtual function to be defined by derived classes
  3700.                     to return their object type ID string (usually the
  3701.                     unique class name).
  3702.  
  3703.        printHeader  virtual void printHeader( ostream& outputStream )
  3704.                     const;
  3705.  
  3706.                     Sends a standard header for containers to the output
  3707.                     stream (called by printOn).
  3708.  
  3709.                     See also: printOn, printSeparator, printTrailer
  3710.  
  3711.  
  3712.  
  3713.                                   - 62 -
  3714.  
  3715.  
  3716.                                                                   Container
  3717.  
  3718.  
  3719.  
  3720.            printOn  virtual void printOn( ostream& outputStream ) const;
  3721.  
  3722.   operator << is a  Sends a formatted representation of the container to
  3723.  friend of Object.  the given output stream. printOn is for internal use by
  3724.       See page 87.  the overloaded operator <<.
  3725.  
  3726.                     See also: printHeader, printSeparator, printTrailer
  3727.  
  3728.     printSeparator  virtual void printSeparator( ostream& outputStream )
  3729.                     const;
  3730.  
  3731.                     Sends to the output stream a separator (comma) between
  3732.                     elements in a container (called by printOn).
  3733.  
  3734.                     See also: printOn, printHeader, printTrailer
  3735.  
  3736.       printTrailer  virtual void printTrailer( ostream& outputStream )
  3737.                     const;
  3738.  
  3739.                     Sends to the output stream a standard trailer (a
  3740.                     closing brace) for a container (called by printOn).
  3741.  
  3742.                     See also: printOn, printHeader, printSeparator
  3743.  
  3744.  
  3745.            Friends  =======================================================
  3746.  
  3747.                     ContainerIterator is a friend of Container.
  3748.  
  3749.  
  3750.  
  3751.  
  3752.  
  3753.  
  3754.  
  3755.  
  3756.  
  3757.  
  3758.  
  3759.  
  3760.  
  3761.  
  3762.  
  3763.  
  3764.  
  3765.  
  3766.  
  3767.  
  3768.  
  3769.  
  3770.  
  3771.                                   - 63 -
  3772.  
  3773.  
  3774. ContainerIterator
  3775.  
  3776.  
  3777.  
  3778. ===========================================================================
  3779. ContainerIterator                                                 contain.h
  3780. ===========================================================================
  3781.  
  3782.                                           ┌──────────────────┐
  3783.                                         ┌─┤HashTableIterator │
  3784.                                         │ └──────────────────┘
  3785.                     ╔═════════════════╗ │ ┌──────────────────┐
  3786.                     ║ContainerIterator╟─┼─┤   ListIterator   │
  3787.                     ╚═════════════════╝ │ └──────────────────┘
  3788.                                         │ ┌──────────────────┐
  3789.                                         ├─┤DoubleListIterator│
  3790.                                         │ └──────────────────┘
  3791.                                         │ ┌──────────────────┐
  3792.                                         ├─┤  BtreeIterator   │
  3793.                                         │ └──────────────────┘
  3794.                                         │ ┌──────────────────┐
  3795.                                         └─┤  ArrayIterator   │
  3796.                                           └──────────────────┘
  3797.  
  3798.                     ContainerIterator is an abstract class declared as a
  3799.                     friend of Container. Container classes have
  3800.                     initIterator member functions that create
  3801.                     ContainerIterator-derived objects. These provide the
  3802.                     basic mechanisms for traversing the elements in a
  3803.                     container: incrementing through the container;
  3804.                     returning positional information; testing for
  3805.                     conditions, and so on. The member functions for
  3806.                     ContainerIterator are all pure virtual and are defined
  3807.                     in derived classes. See page 11 for more on the
  3808.                     ContainerIterator hierarchy.
  3809.  
  3810.  
  3811.   Member functions  =======================================================
  3812.  
  3813.  
  3814.            current  virtual Object& current() = 0;
  3815.  
  3816.                     Pure virtual function to be defined in derived classes
  3817.                     to return the current element. If the current element
  3818.                     is empty or invalid, NOOBJECT is returned.
  3819.  
  3820.       operator int  virtual operator int() = 0;
  3821.  
  3822.                     Pure virtual function to be defined by derived classes
  3823.                     to provide a conversion operator to test for end of
  3824.                     iteration condition.
  3825.  
  3826.  
  3827.  
  3828.  
  3829.                                   - 64 -
  3830.  
  3831.  
  3832.                                                           ContainerIterator
  3833.  
  3834.  
  3835.  
  3836.        operator ++  virtual Object& operator ++() = 0;
  3837.                     virtual Object& operator ++( int ) = 0;
  3838.  
  3839.                     Advances the iterator one position in the container.
  3840.                     The first version returns the object referred to before
  3841.                     incrementing; the second version returns the object
  3842.                     referred to after incrementing. The int argument is a
  3843.                     dummy used to distinguish the two operators (see the
  3844.                     section on Operator Overloading in the Programmer's
  3845.                     Guide).
  3846.  
  3847.            restart  virtual void restart() = 0;
  3848.  
  3849.                     Pure virtual function to be refined in derived classes
  3850.                     to set the current index of the iterator to the first
  3851.                     nonempty element in the container.
  3852.  
  3853.  
  3854.  
  3855. ===========================================================================
  3856. Date                                                                ldate.h
  3857. ===========================================================================
  3858.  
  3859.                     ┌────────────┐  ╔════════════╗
  3860.                     │  BaseDate  ├──╢    Date    ║
  3861.                     └────────────┘  ╚════════════╝
  3862.                     The Date instance class is a direct descendant of the
  3863.                     abstract class BaseDate, defining a printOn function.
  3864.                     You can vary Date for different national conventions
  3865.                     without disturbing BaseDate.
  3866.  
  3867.  
  3868.   Member functions  =======================================================
  3869.  
  3870.  
  3871.        constructor  Date();
  3872.  
  3873.                     Calls the BaseDate constructor to create a date object
  3874.                     with today's date.
  3875.  
  3876.        constructor  Date( unsigned char M, unsigned char D, unsigned Y );
  3877.  
  3878.                     Calls the BaseDate constructor to create a date object
  3879.                     with the given  date.
  3880.  
  3881.        constructor  Date( const Date& aDate );
  3882.  
  3883.  
  3884.  
  3885.  
  3886.  
  3887.                                   - 65 -
  3888.  
  3889.  
  3890. Date
  3891.  
  3892.  
  3893.  
  3894.                     Copy constructor.
  3895.  
  3896.                isA  virtual classType isA() const;
  3897.  
  3898.                     Returns dateClass, the Date class ID.
  3899.  
  3900.             nameOf  virtual char *nameOf() const;
  3901.  
  3902.                     Returns "Date", the Date class ID string.
  3903.  
  3904.            printOn  virtual void printOn( ostream& outputStream ) const;
  3905.  
  3906.   operator << is a  Sends a formatted date to the given output stream. The
  3907.  friend of Object.  format is full month name, day, year, for example
  3908.       See page 87.  January 1, 1990. printOn is really for internal use by
  3909.                     the overloaded operator <<.
  3910.  
  3911.  
  3912.  
  3913. ===========================================================================
  3914. Deque                                                               deque.h
  3915. ===========================================================================
  3916.  
  3917.                     ┌────────────┐  ╔════════════╗ ┌────────────┐
  3918.                     │ Container  ├──╢   Deque    ╟─┤   Queue    │
  3919.                     └────────────┘  ╚════════════╝ └────────────┘
  3920.  
  3921.                     The instance class Deque (pronounced "deck"), derived
  3922.                     from Container, implements a double-ended queue so it
  3923.                     is one of the sequence classes. Objects can be
  3924.                     examined, inserted, and removed at both the left and
  3925.                     the right ends but nowhere else. You can use the member
  3926.                     functions peekLeft and peekRight to examine the objects
  3927.                     currently at the left and the right ends. putLeft and
  3928.                     putRight insert objects at the ends. The getLeft and
  3929.                     getRight members also access the end objects but detach
  3930.                     them from the deque. The fate of the objects removed
  3931.                     from the deque is determined by the same ownership and
  3932.                     DeleteType considerations discussed in the
  3933.                     TShouldDelete class (recall that TShouldDelete is a
  3934.                     virtual base class for Container). Deque also acts as
  3935.                     the base class for Queue.
  3936.  
  3937.  
  3938.  
  3939.  
  3940.  
  3941.  
  3942.  
  3943.  
  3944.  
  3945.                                   - 66 -
  3946.  
  3947.  
  3948.                                                                       Deque
  3949.  
  3950.  
  3951.  
  3952.            Example  =======================================================
  3953.  
  3954.             Source   #include <deque.h>
  3955.                      #include <strng.h>
  3956.  
  3957.                      main()
  3958.                      {
  3959.                          Deque d;
  3960.                          String *s1 = new String("one");
  3961.                          String *s2 = new String("two");
  3962.                          String *s3 = new String("three");
  3963.                          String *s4 = new String("four");
  3964.  
  3965.                          // Populate the deque
  3966.                          d.putLeft(*s1);
  3967.                          d.putRight(*s2);
  3968.                          d.putLeft(*s3);
  3969.                          d.putRight(*s4);
  3970.  
  3971.                          // Print to cout
  3972.                          cout << "As a container:\n" << d << endl;
  3973.  
  3974.                          // Empty to cout
  3975.                          cout << "As a Deque:\n";
  3976.                          while (!d.isEmpty())
  3977.                          {
  3978.                              cout << d.getLeft() << endl;
  3979.                          }
  3980.  
  3981.                          // Should be empty
  3982.                          cout << "\nShould be empty:\n" << d;
  3983.                      }
  3984.  
  3985.             Output   As a container:
  3986.                      Deque { three,
  3987.                          one,
  3988.                          two,
  3989.                          four }
  3990.  
  3991.                      As a Deque:
  3992.                      three
  3993.                      one
  3994.                      two
  3995.                      four
  3996.  
  3997.                      Should be empty:
  3998.  
  3999.  
  4000.  
  4001.  
  4002.  
  4003.                                   - 67 -
  4004.  
  4005.  
  4006. Deque
  4007.  
  4008.  
  4009.  
  4010.                      Deque { }
  4011.  
  4012.  
  4013.   Member functions  =======================================================
  4014.  
  4015.  
  4016.              flush  virtual void flush( DeleteType dt = DefDefault );
  4017.  
  4018.                     Flushes (empties) the deque without destroying it. The
  4019.                     fate of any objects thus removed depends on the current
  4020.                     ownership status and the value of the dt argument.
  4021.  
  4022.                     See also: TShouldDelete::ownsElements
  4023.  
  4024. getItemsInContainer virtual countType getItemsInContainer() const;
  4025.  
  4026.                     Returns the number of items in the deque.
  4027.  
  4028.            getLeft  Object& getLeft();
  4029.  
  4030.                     Returns the object at the left end and removes it from
  4031.                     the deque. Returns NOOBJECT if the deque is empty.
  4032.  
  4033.                     See also: TShouldDelete class
  4034.  
  4035.           getRight  Object& getRight();
  4036.  
  4037.                     As for getLeft, except that the right end of the deque
  4038.                     is returned.
  4039.  
  4040.                     See also: getLeft
  4041.  
  4042.       initIterator  virtual ContainerIterator& initIterator() const;
  4043.  
  4044.                     Initializes an iterator for the deque.
  4045.  
  4046.                     See also: Container::initIterator
  4047.  
  4048.                isA  virtual classType isA() const;
  4049.  
  4050.                     Returns dequeClass, the Deque class ID.
  4051.  
  4052.            isEmpty  virtual int isEmpty() const;
  4053.  
  4054.                     Returns 1  if a container has no elements; otherwise
  4055.                     returns 0.
  4056.  
  4057.             nameOf  virtual char *nameOf() const;
  4058.  
  4059.  
  4060.  
  4061.                                   - 68 -
  4062.  
  4063.  
  4064.                                                                       Deque
  4065.  
  4066.  
  4067.  
  4068.                     Returns "Deque", the Deque class ID string.
  4069.  
  4070.           peekLeft  Object& peekLeft() const;
  4071.  
  4072.                     Returns the object at the left end (head) of the deque.
  4073.                     The object stays in the deque.
  4074.  
  4075.          peekRight  Object& peekRight()
  4076.  
  4077.                     Returns the object at the right end (tail) of the
  4078.                     deque. The object stays in the deque.
  4079.  
  4080.            putLeft  void putLeft( Object& obj );
  4081.  
  4082.                     Adds (pushes) the given object at the left end (head)
  4083.                     of the deque.
  4084.  
  4085.           putRight  void putRight(Object& obj)
  4086.  
  4087.                     Adds (pushes) the given object at the right end (tail)
  4088.                     of the deque.
  4089.  
  4090.  
  4091.  
  4092. ===========================================================================
  4093. Dictionary                                                           dict.h
  4094. ===========================================================================
  4095.  
  4096.                     ┌────────────┐  ╔════════════╗
  4097.                     │    Set     ├──╢ Dictionary ║
  4098.                     └────────────┘  ╚════════════╝
  4099.                     A dictionary is a special collection of Association
  4100.                     type objects. The instance class Dictionary is derived
  4101.                     from Collection via Bag and Set, implying that no
  4102.                     duplicate association objects are allowed in a
  4103.                     dictionary. Dictionary overrides the add function and
  4104.                     adds a lookup function to the members inherited from
  4105.                     Set. lookup allows you to retrieve the value object of
  4106.                     an association stored in the dictionary if you supply
  4107.                     the key.
  4108.  
  4109.  
  4110.   Member functions  =======================================================
  4111.  
  4112.  
  4113.                add  virtual void add( Object& assoc );
  4114.  
  4115.  
  4116.  
  4117.  
  4118.  
  4119.                                   - 69 -
  4120.  
  4121.  
  4122. Dictionary
  4123.  
  4124.  
  4125.  
  4126.                     Adds the given association (assoc) to the dictionary.
  4127.                     If the given argument is not of type Association, a
  4128.                     runtime error occurs.
  4129.  
  4130.        constructor  Dictionary( unsigned sz = DEFAULT_HASH_TABLE_SIZE );
  4131.  
  4132.                     Invokes the base Set constructor to create an empty
  4133.                     dictionary of size sz.
  4134.  
  4135.                isA  virtual classType isA() const;
  4136.  
  4137.                     Returns dictionaryClass, the Dictionary class ID.
  4138.  
  4139.             lookup  Association& lookup( const Object& toLookUp ) const;
  4140.  
  4141.                     Returns the association matching the toLookUp key. If
  4142.                     no match is found, NOOBJECT is returned.
  4143.  
  4144.             nameOf  virtual char *nameOf() const;
  4145.  
  4146.                     Returns "Dictionary", the Dictionary class ID string.
  4147.  
  4148.  
  4149.  
  4150. ===========================================================================
  4151. DoubleList                                                        dbllist.h
  4152. ===========================================================================
  4153.  
  4154.                     ┌────────────┐  ╔════════════╗
  4155.                     │ Collection ├──╢ DoubleList ║
  4156.                     └────────────┘  ╚════════════╝
  4157.  
  4158.                     The instance class DoubleList, derived from Collection,
  4159.                     implements the classical doubly-linked list data
  4160.                     structure (see D. E Knuth's The Art of Computer
  4161.                     Programming, Volume 1, 2.2.5). Briefly, each node
  4162.                     object of a doubly-linked list has two links, one
  4163.                     pointing to the next node and one pointing to the
  4164.                     previous node. The extreme nodes are called the head
  4165.                     and the tail. As with the Deque class, you can examine,
  4166.                     add, and remove objects at either end of the list.
  4167.  
  4168.  
  4169.  
  4170.  
  4171.  
  4172.  
  4173.  
  4174.  
  4175.  
  4176.  
  4177.                                   - 70 -
  4178.  
  4179.  
  4180.                                                                  DoubleList
  4181.  
  4182.  
  4183.  
  4184.   Member functions  =======================================================
  4185.  
  4186.  
  4187.                add  virtual void add( Object& toAdd );
  4188.  
  4189.                     Add the given object at the beginning of the list.
  4190.  
  4191.          addAtHead  void addAtHead( Object& toAdd );
  4192.  
  4193.                     Adds the given object at the beginning (head) of the
  4194.                     list.
  4195.  
  4196.          addAtTail  void addAtTail( Object& toAdd );
  4197.  
  4198.                     Adds the given object at the end (tail) the list.
  4199.  
  4200.        constructor  DoubleList();
  4201.  
  4202.                     Creates a new, empty doubly-linked list.
  4203.  
  4204.    destroyFromHead  void destroyFromHead( const Object& toDestroy );
  4205.  
  4206.                     Detaches the first occurrence of the given object
  4207.                     encountered by searching from the beginning of the
  4208.                     list. The object is destroyed only if it is owned by
  4209.                     the list.
  4210.  
  4211.    destroyFromTail  void destroyFromTail( const Object& toDestroy );
  4212.  
  4213.                     Detaches the first occurrence of the given object
  4214.                     encountered by searching from the tail of the list
  4215.                     towards the head. The object is destroyed only if it is
  4216.                     owned by the list.
  4217.  
  4218.             detach  virtual void detach( Object& toDetach, DeleteType dt =
  4219.                     NoDelete );
  4220.  
  4221.                     Calls detachFromHead( toDetach, dt);
  4222.  
  4223.     detachFromHead  void detachFromHead( const Object& toDetach, DeleteType
  4224.                     dt = NoDelete );
  4225.  
  4226.                     Removes the first occurrence of the given object
  4227.                     encountered by searching from the beginning of the
  4228.                     list. The dt argument determines if the detached object
  4229.                     is itself destroyed. See TShouldDelete for details.
  4230.  
  4231.  
  4232.  
  4233.  
  4234.  
  4235.                                   - 71 -
  4236.  
  4237.  
  4238. DoubleList
  4239.  
  4240.  
  4241.  
  4242.     detachFromTail  void detachFromTail( const Object& toDetach, DeleteType
  4243.                     dt = NoDelete );
  4244.  
  4245.                     Removes the first occurrence of the object starting at
  4246.                     the tail of the list and scanning towards the head. The
  4247.                     dt argument determines if the detached object is itself
  4248.                     destroyed. See TShouldDelete for details.
  4249.  
  4250.              flush  virtual void flush( DeleteType dt = DefDelete);
  4251.  
  4252.                     Flushes (empties) the list without destroying it. The
  4253.                     fate of the objects thus removed is determined by the
  4254.                     dt argument as explained at TShouldDelete. The default
  4255.                     value of dt means that the removed objects will be
  4256.                     destroyed only if the list owns these objects.
  4257.  
  4258.                     See also: TShouldDelete::ownsElements
  4259.  
  4260.       initIterator  virtual ContainerIterator& initIterator() const;
  4261.  
  4262.                     Creates and returns a forward (from head to tail)
  4263.                     iterator for the list.
  4264.  
  4265.                isA  virtual classType isA() const;
  4266.  
  4267.                     Returns doubleListClass, the DoubleList class ID.
  4268.  
  4269.             nameOf  virtual char *nameOf() const;
  4270.  
  4271.                     Returns "DoubleList", the DoubleList class ID string.
  4272.  
  4273.         peekAtHead  Object& peekAtHead() const;
  4274.  
  4275.                     Returns the object at the head of the list (without
  4276.                     removing it).
  4277.  
  4278.         peekAtTail  Object& peekAtTail() const;
  4279.  
  4280.                     Returns the object at the tail of the list (without
  4281.                     removing it).
  4282.  
  4283.  
  4284.  
  4285.  
  4286.  
  4287.  
  4288.  
  4289.  
  4290.  
  4291.  
  4292.  
  4293.                                   - 72 -
  4294.  
  4295.  
  4296.                                                                  DoubleList
  4297.  
  4298.  
  4299.  
  4300.            Friends  =======================================================
  4301.  
  4302.                     DoubleListIterator is a friend of DoubleList
  4303.  
  4304.  
  4305.  
  4306. ===========================================================================
  4307. DoubleListIterator                                                dbllist.h
  4308. ===========================================================================
  4309.  
  4310.                     ┌─────────────────┐  ╔══════════════════╗
  4311.                     │ContainerIterator├──╢DoubleListIterator║
  4312.                     └─────────────────┘  ╚══════════════════╝
  4313.                     DoubleListIterator, derived from ContainerIterator,
  4314.                     implements the special iterators for traversing
  4315.                     doubly-linked lists in either direction. This class
  4316.                     adds overloading of the pre- and postdecrement operator
  4317.                     - - to allow reverse iteration. For more details on
  4318.                     iterators, see ContainerIterator, and
  4319.                     DoubleList::initIterator.
  4320.  
  4321.  
  4322.   Member functions  =======================================================
  4323.  
  4324.  
  4325.        constructor  DoubleListIterator(const DoubleList& toIterate, int
  4326.                     atHead = 1);
  4327.  
  4328.                     Creates an iterator for the given list. The iterator
  4329.                     will begin at the head of the list if atHead is 1 ,
  4330.                     otherwise it starts at the tail.
  4331.  
  4332.            current  virtual Object& current();
  4333.  
  4334.                     Returns the object at the current index of the
  4335.                     iterator. If the current index exceeds the upper bound,
  4336.                     NOOBJECT is returned.
  4337.  
  4338.        operator ++  virtual Object& operator ++ ( int );
  4339.                     virtual Object& operator ++ ();
  4340.  
  4341.                     See ContainerIterator operator ++
  4342.  
  4343.       operator - -  Object& operator - - ( int );
  4344.                     Object& operator - - ();
  4345.  
  4346.  
  4347.  
  4348.  
  4349.  
  4350.  
  4351.                                   - 73 -
  4352.  
  4353.  
  4354. DoubleListIterator
  4355.  
  4356.  
  4357.  
  4358.                     Moves the iterator back one position in the list. The
  4359.                     object returned is either the current object
  4360.                     (postdecrement) or the object at the new position
  4361.                     (predecrement), or NOOBJECT if no valid object at the
  4362.                     relevant position. The first version gives
  4363.                     postdecrement, the second gives predecrement. The int
  4364.                     argument is a dummy serving only to distinguish the two
  4365.                     operators.
  4366.  
  4367.       operator int  virtual operator int();
  4368.  
  4369.                     Conversion operator to test for the end of an iteration
  4370.                     condition.
  4371.  
  4372.            restart  virtual void restart();
  4373.  
  4374.                     Moves the iterator back to its starting position at the
  4375.                     head of the list.
  4376.  
  4377.                     See also: DoubleListIterator constructor
  4378.  
  4379.  
  4380.  
  4381. ===========================================================================
  4382. Error                                                              object.h
  4383. ===========================================================================
  4384.  
  4385.                     ┌────────────┐  ╔════════════╗
  4386.                     │   Object   ├──╢   Error    ║
  4387.                     └────────────┘  ╚════════════╝
  4388.  
  4389.                     The class Error is a special instance class derived
  4390.                     from Object. There is just one instance of class Error,
  4391.                     namely theErrorObject. Pointing to this global object
  4392.                     is the static object pointer Object::ZERO. NOOBJECT is
  4393.                     defined as  *(Object::ZERO) in object.h. The operator
  4394.                     Object::operator new returns a pointer to
  4395.                     theErrorObject if an attempt to allocate an object
  4396.                     fails. You may test the return value of the new
  4397.                     operator against Object::ZERO to see whether the
  4398.                     allocation failed.
  4399.                     NOOBJECT is rather like a null pointer, but serves the
  4400.                     vital function of occupying empty slots in a container.
  4401.                     For example, when an Array object is created (not to be
  4402.                     confused with a traditional C array), each of its
  4403.                     elements will initially contain NOOBJECT.
  4404.  
  4405.  
  4406.  
  4407.  
  4408.  
  4409.                                   - 74 -
  4410.  
  4411.  
  4412.                                                                       Error
  4413.  
  4414.  
  4415.  
  4416.   Member functions  =======================================================
  4417.  
  4418.  
  4419.             delete  void operator delete(void *);
  4420.  
  4421.                     Invokes a runtime error if an attempt to delete the
  4422.                     Error object is detected.
  4423.  
  4424.                isA  virtual classtype isA() const;
  4425.  
  4426.                     Returns errorClass, the Error class ID.
  4427.  
  4428.            isEqual  virtual int isEqual( const Object& testObject const );
  4429.  
  4430.                     Returns 1 if the test object is the Error object.
  4431.  
  4432.             nameOf  virtual char *nameOf() const;
  4433.  
  4434.                     Returns the Error class ID string.
  4435.  
  4436.            printOn  virtual void printOn(ostream& outputStream ) const;
  4437.  
  4438.   operator << is a  Prints the string "Error\n" on the given stream.
  4439.  friend of Object.  printOn is for internal use by the overloaded operator
  4440.       See page 87.  <<.
  4441.  
  4442.  
  4443.  
  4444. ===========================================================================
  4445. HashTable                                                         hashtbl.h
  4446. ===========================================================================
  4447.  
  4448.                     ┌────────────┐  ╔════════════╗
  4449.                     │ Collection ├──╢ HashTable  ║
  4450.                     └────────────┘  ╚════════════╝
  4451.  
  4452.                     The instance class HashTable provides an implementation
  4453.                     of an unordered collection in which objects are added
  4454.                     and retrieved via a hashing function. A hash table
  4455.                     provides a fixed array with size slots (usually a prime
  4456.                     number), one for each possible hash value modulo size.
  4457.                     A hashing function computes the hash value for each
  4458.                     object (or a key part of that object) to be added, and
  4459.                     this determines the slot to which the new object is
  4460.                     assigned.
  4461.  
  4462.  
  4463.  
  4464.  
  4465.  
  4466.  
  4467.                                   - 75 -
  4468.  
  4469.  
  4470. HashTable
  4471.  
  4472.  
  4473.  
  4474.                     For each containable object of class X, the member
  4475.                     function X::HashValue returns a value (of type
  4476.                     hashValueType) between 0 and 65535, which is as
  4477.                     "unique" as possible. This "raw" hash value is reduced
  4478.                     modulo size. We'll use the term hash value to refer to
  4479.                     this reduced value in the range 0 to size - 1. This
  4480.                     hash value serves as an index into the hash table. The
  4481.                     internal organization of the table is hidden, but it
  4482.                     may help you to consider the slots as pointers to
  4483.                     lists.
  4484.  
  4485.                     It should be clear that if you want to store more than
  4486.                     size objects, the hash value cannot be unique for each
  4487.                     object. So two cases arise when an object is added: if
  4488.                     the slot is empty, a new list is assigned to the slot
  4489.                     and the object is stored in the list; if the slot is
  4490.                     already occupied by an object with the same hash value
  4491.                     (known as a collision), the new object is stored in the
  4492.                     existing list attached to the slot. When it comes to
  4493.                     locating an object, the hashing function computes its
  4494.                     hash value to access the appropriate slot. If the slot
  4495.                     is empty, NOOBJECT is returned, otherwise a
  4496.                     List::findMember call locates the object.
  4497.  
  4498.                     Choosing the best HashValue function and table size is
  4499.                     a delicate compromise between avoiding too many
  4500.                     collisions and taking up too much memory. (Other
  4501.                     hashing techniques are available, but the modulo prime
  4502.                     method is the most common. For more on hash table
  4503.                     theory, see D. E. Knuth's The Art of Computer
  4504.                     Programming, Volume 3, 6.4.). Hashing is widely used by
  4505.                     compilers to maintain symbol tables.
  4506.  
  4507.  
  4508.   Member functions  =======================================================
  4509.  
  4510.  
  4511.                add  virtual void add( Object& objectToAdd );
  4512.  
  4513.                     Adds the given object to the hash table.
  4514.  
  4515.        constructor  HashTable( sizeType aPrime = DEFAULT_HASH_TABLE_SIZE );
  4516.  
  4517.                     Creates an empty table. The aPrime argument is a prime
  4518.                     number used in the hashing function (the default is
  4519.                     defined in resource.h).
  4520.  
  4521.             detach
  4522.  
  4523.  
  4524.  
  4525.                                   - 76 -
  4526.  
  4527.  
  4528.                                                                   HashTable
  4529.  
  4530.  
  4531.  
  4532.                     virtual void detach( Object& objectToDetach, DeleteType
  4533.                     dt = NoDelete );
  4534.  
  4535.                     Removes the given object from the hash table. Whether
  4536.                     the object itself is destroyed or not depends on the dt
  4537.                     argument, as explained in TShouldDelete::ownsElements.
  4538.  
  4539.         findMember  virtual Object& findMember( const Object& testObject )
  4540.                     const;
  4541.  
  4542.                     Returns the target object if found, otherwise returns
  4543.                     NOOBJECT.
  4544.  
  4545.              flush  virtual void flush( DeleteType dt = DefDelete );
  4546.  
  4547.                     Removes all the elements from the table without
  4548.                     destroying it. The value of dt determines whether the
  4549.                     elements themselves are destroyed. By default (dt =
  4550.                     DefDelete), the ownership status of the table
  4551.                     determines the fate of all its elements, as explained
  4552.                     in TShouldDelete::ownsElements. You can set dt to
  4553.                     Delete to force destruction of the flushed elements
  4554.                     regardless of ownership. If dt is set to NoDelete, the
  4555.                     flushed elements will survive regardless of ownership.
  4556.  
  4557.                     See also: TShouldDelete::ownsElements
  4558.  
  4559.          hashValue  virtual hashValueType hashValue() const;
  4560.  
  4561.                     Returns the raw hash value of this table. This must not
  4562.                     be confused with the hash values calculated by the hash
  4563.                     table for each of the objects it stores. When an object
  4564.                     x of class X is added or retrieved from a hash table h,
  4565.                     the raw hash value used is x.hashValue(). The true hash
  4566.                     value (usually modulo size) is obtained from the hash
  4567.                     table object via h.getHashValue( x ). Only classes with
  4568.                     a proper hashValue member function can provide objects
  4569.                     for storage in a hash table. All standard Object-
  4570.                     derived classes in the library have meaningful hashing
  4571.                     functions provided. For example, BaseDate::hashValue
  4572.                     (unless overridden) returns the value YY + MM + DD from
  4573.                     which the (private) member function
  4574.                     HashTable::getHashValue computes a hash value (using
  4575.                     mod size). It is this value that governs the hash
  4576.                     table's add, findMember, and detach operations.
  4577.  
  4578.       initIterator  virtual ContainerIterator& initIterator() const;
  4579.  
  4580.  
  4581.  
  4582.  
  4583.                                   - 77 -
  4584.  
  4585.  
  4586. HashTable
  4587.  
  4588.  
  4589.  
  4590.                     Creates and returns an iterator for the hash table. See
  4591.                     Container::initIterator for more details.
  4592.  
  4593.                isA  virtual classType isA() const;
  4594.  
  4595.                     Returns hashTableClass, the HashTable class ID.
  4596.  
  4597.             nameOf  virtual char *nameOf() const;
  4598.  
  4599.                     Returns "HashTable", the HashTable class ID string.
  4600.  
  4601.  
  4602.            Friends  =======================================================
  4603.  
  4604.                     HashTableIterator is a friend of HashTable
  4605.  
  4606.  
  4607.  
  4608. ===========================================================================
  4609. HashTableIterator                                                 hashtbl.h
  4610. ===========================================================================
  4611.  
  4612.                     ┌─────────────────┐  ╔══════════════════╗
  4613.                     │ContainerIterator├──╢HashTableIterator ║
  4614.                     └─────────────────┘  ╚══════════════════╝
  4615.  
  4616.                     HashTableIterator is an instance class providing
  4617.                     iterator functions for HashTable objects. Since hash
  4618.                     values are stored in an array, hash table iterators use
  4619.                     the array iterator mechanism. See ContainerIterator for
  4620.                     a detailed discussion of iterators.
  4621.  
  4622.  
  4623.   Member functions  =======================================================
  4624.  
  4625.  
  4626.        constructor  HashTableIterator( const Array& toIterate );
  4627.  
  4628.                     See ContainerIterator constructor
  4629.  
  4630.            current  virtual operator Object& current();
  4631.  
  4632.                     See ContainerIterator::current
  4633.  
  4634.       operator int  virtual operator int();
  4635.  
  4636.                     Conversion operator to test for end of iterator
  4637.                     position.
  4638.  
  4639.  
  4640.  
  4641.                                   - 78 -
  4642.  
  4643.  
  4644.                                                           HashTableIterator
  4645.  
  4646.  
  4647.  
  4648.        operator ++  virtual Object& operator ++ ( int );
  4649.                     virtual Object& operator ++ ();
  4650.  
  4651.                     See ContainerIterator::operator ++
  4652.  
  4653.            restart  virtual void restart()
  4654.  
  4655.                     See ContainerIterator::restart
  4656.  
  4657.  
  4658.  
  4659. ===========================================================================
  4660. List                                                                 list.h
  4661. ===========================================================================
  4662.  
  4663.                     ┌────────────┐  ╔════════════╗
  4664.                     │ Collection ├──╢    List    ║
  4665.                     └────────────┘  ╚════════════╝
  4666.  
  4667.                     The instance class List, derived from Collection,
  4668.                     implements a linear, linked list. Lists are unordered
  4669.                     collections in which objects are linked in one
  4670.                     direction only to form a chain. You can usually add
  4671.                     objects only at the start of a list but any object can
  4672.                     be removed from a list. You can traverse a list (from
  4673.                     head to tail) with an iterator to access the objects
  4674.                     sequentially. List has an internal private class
  4675.                     ListElement providing memory management and other
  4676.                     functions for the pairs of pointers (to object and to
  4677.                     next element) that constitute the elements of a List
  4678.                     object. (For more on list theory, see Sedgwick's
  4679.                     Algorithms and Knuth's The Art of Computer Programming,
  4680.                     Volume 1, 2.2).
  4681.  
  4682.   Member functions  =======================================================
  4683.  
  4684.  
  4685.                add  void add( Object& toAdd );
  4686.  
  4687.                     Adds the given object at the head of the list. The
  4688.                     added object becomes the new head.
  4689.  
  4690.        constructor  List();
  4691.  
  4692.                     Creates an empty list.
  4693.  
  4694.             detach
  4695.  
  4696.  
  4697.  
  4698.  
  4699.                                   - 79 -
  4700.  
  4701.  
  4702. List
  4703.  
  4704.  
  4705.  
  4706.                     virtual void detach( Object& toDetach, DeleteType dt =
  4707.                     NoDelete );
  4708.  
  4709.                     Removes the given object from the list. Whether the
  4710.                     object itself is destroyed or not depends on the dt
  4711.                     argument, as explained in TShouldDelete::ownsElements.
  4712.  
  4713.              flush  virtual void flush( DeleteType dt = DefDelete );
  4714.  
  4715.                     Removes all the objects from the list without
  4716.                     destroying it. The value of dt determines whether the
  4717.                     objects themselves are destroyed. By default (dt =
  4718.                     DefDelete), the ownership status of the list determines
  4719.                     the fate of its elements, as explained in
  4720.                     TShouldDelete::ownsElements. You can set dt to Delete
  4721.                     to force destruction of the flushed objects regardless
  4722.                     of ownership. If dt is set to NoDelete, the flushed
  4723.                     objects will survive regardless of ownership.
  4724.  
  4725.                     See also: TShouldDelete::ownsElements
  4726.  
  4727.          hashValue  virtual hashValueType hashValue() const;
  4728.  
  4729.                     Returns the hash value of this list. See
  4730.                     HashTable::hashValue for more details.
  4731.  
  4732.       initIterator  virtual ContainerIterator& initIterator() const;
  4733.  
  4734.                     See Container::initIterator
  4735.  
  4736.                isA  virtual classType isA() const;
  4737.  
  4738.                     Returns listClass the List class ID.
  4739.  
  4740.             nameOf  virtual char *nameOf() const;
  4741.  
  4742.                     Returns "List", the List class ID string.
  4743.  
  4744.           peekHead  Object& peekHead() const;
  4745.  
  4746.                     Returns the object at the head of the list.
  4747.  
  4748.  
  4749.            Friends  =======================================================
  4750.  
  4751.                     ListIterator is a friend of List and ListElement.
  4752.  
  4753.  
  4754.  
  4755.  
  4756.  
  4757.                                   - 80 -
  4758.  
  4759.  
  4760.                                                                ListIterator
  4761.  
  4762.  
  4763.  
  4764. ===========================================================================
  4765. ListIterator                                                         list.h
  4766. ===========================================================================
  4767.  
  4768.                     ┌─────────────────┐  ╔══════════════════╗
  4769.                     │ContainerIterator├──╢   ListIterator   ║
  4770.                     └─────────────────┘  ╚══════════════════╝
  4771.  
  4772.                     ListIterator is an instance class derived from
  4773.                     ContainerIterator providing iterator functions for List
  4774.                     objects. See ContainerIterator for a discussion of
  4775.                     iterators.
  4776.  
  4777.  
  4778.   Member functions  =======================================================
  4779.  
  4780.  
  4781.        constructor  ListIterator( const List& toIterate );
  4782.  
  4783.                     Creates an iterator for the given list. The starting
  4784.                     and current elements are set to the first element of
  4785.                     the list. See ContainerIterator constructor for
  4786.                     details.
  4787.  
  4788.            current  virtual Object& current();
  4789.  
  4790.                     See ContainerIterator::current
  4791.  
  4792.        operator ++  virtual Object& operator ++ ( int );
  4793.                     virtual Object& operator ++ ();
  4794.  
  4795.                     See ContainerIterator::operator ++
  4796.  
  4797.       operator int  virtual operator int();
  4798.  
  4799.                     Conversion operator to test for end of iterator
  4800.                     position.
  4801.  
  4802.  
  4803.            restart  virtual void restart()
  4804.  
  4805.                     See ContainerIterator::restart
  4806.  
  4807.  
  4808.  
  4809.  
  4810.  
  4811.  
  4812.  
  4813.  
  4814.  
  4815.                                   - 81 -
  4816.  
  4817.  
  4818. MemBlocks
  4819.  
  4820.  
  4821.  
  4822. ===========================================================================
  4823. MemBlocks                                                          memmgr.h
  4824. ===========================================================================
  4825.  
  4826.                     ╔════════════╗
  4827.                     ║ MemBlocks  ╟
  4828.                     ╚════════════╝
  4829.  
  4830.                     The classes MemBlocks and MemStack in memmgr.h offer
  4831.                     specialized memory management not only for the
  4832.                     container classes but for other applications. Detailed
  4833.                     knowledge of their operations is not needed for normal
  4834.                     container applications. If you are planning your own
  4835.                     advanced memory management schemes, you should first
  4836.                     study memmgr.h and MEMMGR.CPP.
  4837.  
  4838.                     MemBlocks is a noncontainer, instance class, providing
  4839.                     fixed-block memory allocations. Large, dynamic lists
  4840.                     and trees need to allocate and free their node blocks
  4841.                     as quickly as possible. MemBlocks offers more efficient
  4842.                     memory management than the standard heap manager for
  4843.                     this kind of operation. The MemBlock constructor takes
  4844.                     two arguments: block size and number of blocks. These
  4845.                     determine the size of the internal blocks that are
  4846.                     allocated as needed using the normal run-time library
  4847.                     allocation functions. A free list of blocks is
  4848.                     maintained and the internal blocks are not released
  4849.                     until the MemBlock object is destroyed. The following
  4850.                     example illustrates the use of MemBlocks with a
  4851.                     simplified Node class:
  4852.  
  4853.                      class Node
  4854.                      {
  4855.                        Node *next;
  4856.                        Object *obj;
  4857.                        static MemBlocks memBlocks;
  4858.                        void *operator new( size_t sz ) { return
  4859.                      memBlocks.allocate ( sz); }
  4860.                        void operator delete( void * blk ) { memBlocks.free
  4861.                      ( blk ); }
  4862.                        ...
  4863.                      };
  4864.  
  4865.                     CAUTION: If you derive a class from a class that does
  4866.                     its own memory management as in the  Node example
  4867.                     above, then either the derived class must be the same
  4868.                     size as the base class or you must override the new and
  4869.                     delete operators.
  4870.  
  4871.  
  4872.  
  4873.                                   - 82 -
  4874.  
  4875.  
  4876.                                                                   MemBlocks
  4877.  
  4878.  
  4879.  
  4880.                     See also: MemStack class.
  4881.  
  4882.           allocate  void allocate( size_t sz, unsigned blks = 100 );
  4883.  
  4884.                     Allocates blks blocks each of size sz
  4885.  
  4886.               free  void free( void * ptr );
  4887.  
  4888.                     Frees the memory blocks at ptr.
  4889.  
  4890.  
  4891.  
  4892. ===========================================================================
  4893. MemStack                                                           memmgr.h
  4894. ===========================================================================
  4895.  
  4896.                     ╔════════════╗
  4897.                     ║  MemStack  ║
  4898.                     ╚════════════╝
  4899.  
  4900.                     MemStack is a noncontainer, instance class, providing
  4901.                     fast mark-and-release style memory management. Although
  4902.                     used internally by various container classes, MemStack
  4903.                     is also available for general use. Memory allocations
  4904.                     and deallocations are extremely fast since they
  4905.                     "popped" and "pushed" on a stack of available blocks.
  4906.                     Marking and releasing blocks is handled by objects of a
  4907.                     helper marker class. When a marker is created it
  4908.                     records the current location in the memory stack; when
  4909.                     a marker is destroyed, the stack is returned to its
  4910.                     original state, freeing any allocations made since the
  4911.                     marker was created. For example:
  4912.  
  4913.                      MemStack symbols;
  4914.  
  4915.                      void handleLocals()
  4916.                      {
  4917.                        Marker locals( symbols );       // marks current
  4918.                      state of symbols
  4919.                        Sym *symbol1 = new(symbols)Sym; // add a Sym to the
  4920.                      table
  4921.                        Sym *symbol2 = new(symbols)Sym; // and another
  4922.                      }
  4923.  
  4924.                     When the function exits, the Marker destructor releases
  4925.                     the memory allocated by the new(symbols) calls made in
  4926.                     handleLocal and restores the memory stack.
  4927.  
  4928.  
  4929.  
  4930.  
  4931.                                   - 83 -
  4932.  
  4933.  
  4934. Object
  4935.  
  4936.  
  4937.  
  4938.                     See also: MemBlocks
  4939.  
  4940.  
  4941.  
  4942. ===========================================================================
  4943. Object                                                             object.h
  4944. ===========================================================================
  4945.  
  4946.                                      ┌────────────┐
  4947.                                    ┌─┤   Error    │
  4948.                                    │ └────────────┘
  4949.                     ╔════════════╗ │ ┌────────────┐
  4950.                     ║   Object   ╟─┼─┤  Sortable  │
  4951.                     ╚════════════╝ │ └────────────┘
  4952.                                    │ ┌────────────┐
  4953.                                    ├─┤Association │
  4954.                                    │ └────────────┘
  4955.                                    │ ┌────────────┐
  4956.                                    └─┤ Container  │
  4957.                                      └────────────┘
  4958.  
  4959.                     Object is an abstract class providing the primordial
  4960.                     base for the whole Object-based container hierarchy
  4961.                     (with the exception of the iterator classes). The
  4962.                     member functions provide the basic essentials for all
  4963.                     derived classes and the objects they contain. Object
  4964.                     has four immediate children: Error, Sortable,
  4965.                     Association, and Container.
  4966.  
  4967.  
  4968.        Data member  =======================================================
  4969.  
  4970.  
  4971.               ZERO  static Object *ZERO;
  4972.  
  4973.                     A static pointer to the unique instance of class Error.
  4974.                     ZERO is used to define NOOBJECT.
  4975.  
  4976.                     See also:   Error class
  4977.  
  4978.  
  4979.   Member functions  =======================================================
  4980.  
  4981.  
  4982.       constructors  Object();
  4983.                     Object( Object& obj );
  4984.  
  4985.                     Creates or copies an object.
  4986.  
  4987.  
  4988.  
  4989.                                   - 84 -
  4990.  
  4991.  
  4992.                                                                      Object
  4993.  
  4994.  
  4995.  
  4996.          firstThat  virtual Object& firstThat( condFuncType testFuncPtr,
  4997.                     void *paramList ) const;
  4998.  
  4999.                     Returns *this if the object satisfies the condition
  5000.                     specified by the BOOLEAN testFunc function, otherwise
  5001.                     NOOBJECT is returned. You can pass arbitrary arguments
  5002.                     via the paramList argument. Note that firstThat,
  5003.                     lastThat, and forEach work for all Object-derived
  5004.                     objects, both container and non-container objects,
  5005.                     whether they are in containers or not. With container
  5006.                     objects, you can get iteration through the contained
  5007.                     objects. When used with objects outside containers, the
  5008.                     three functions act only on the calling object, so
  5009.                     firstThat and lastThat are equivalent. condFuncType is
  5010.                     defined in clstypes.h as
  5011.  
  5012.                     #typdef int ( *condFuncType )( const class Object&,
  5013.                     void *);
  5014.  
  5015.                     firstThat calls ( *testFuncPtr )( *this, paramList ).
  5016.                     If 1 is returned, firstThat returns (Object &) *this,
  5017.                     otherwise NOOBJECT is returned.
  5018.  
  5019.                     See also:   Container::firstThat
  5020.  
  5021.            forEach  virtual void forEach( iterFuncType actionFuncPtr, void
  5022.                     *args );
  5023.  
  5024.                     forEach executes the given action function on *this.
  5025.                     The args argument lets you pass arbitrary data to the
  5026.                     action function.
  5027.  
  5028.                     See also:   firstThat
  5029.  
  5030.          hashValue  virtual hashValueType hashValue() const = 0;
  5031.  
  5032.                     A pure virtual function to be defined by derived
  5033.                     classes to return the hash value of an object. See
  5034.                     HashTable::hashValue for more details.
  5035.  
  5036.                isA  virtual classType isA() const = 0;
  5037.  
  5038.                     Pure virtual function for derived classes to return a
  5039.                     class ID.
  5040.  
  5041.      isAssociation  virtual int isAssociation() const;
  5042.  
  5043.  
  5044.  
  5045.  
  5046.  
  5047.                                   - 85 -
  5048.  
  5049.  
  5050. Object
  5051.  
  5052.  
  5053.  
  5054.                     Returns 1  if the calling object is part of an
  5055.                     Association object, otherwise returns 0. Must be
  5056.                     overridden in classes providing associations.
  5057.  
  5058.                     See also: Association class.
  5059.  
  5060.            isEqual  virtual int isEqual( const Object& testObject ) const =
  5061.                     0;
  5062.  
  5063.                     Pure virtual function to be defined in derived classes
  5064.                     to test for equality between testObject and the calling
  5065.                     object (assumed to be of the same type). isEqual is
  5066.                     really for internal use by the operator == which first
  5067.                     applies isA to see if the compared objects are of the
  5068.                     same type. If they are, == then uses isEqual.
  5069.  
  5070.                     See also: operator ==
  5071.  
  5072.        isSorttable  virtual int isSortable() const;
  5073.  
  5074.                     Returns 1  if the calling object can be sorted; that
  5075.                     is, if the class Sortable is an ancestor. Otherwise
  5076.                     returns 0. Object::isSortable returns 0. Sortable
  5077.                     classes must override isSortable to return true.
  5078.  
  5079.                     See also: Sortable class
  5080.  
  5081.           lastThat  virtual Object& lastThat( condFuncType testFuncPtr,
  5082.                     void *paramList ) const;
  5083.  
  5084.                     Returns *this if the object satisfies the condition
  5085.                     specified by the BOOLEAN testFuncPtr function,
  5086.                     otherwise NOOBJECT is returned. You can pass arbitrary
  5087.                     arguments via the paramList argument. Note that
  5088.                     firstThat, lastThat, and forEach work for all Object-
  5089.                     derived objects, both container and non-container
  5090.                     objects, whether they are in containers or not. With
  5091.                     container objects, you get iteration through the
  5092.                     contained objects. When used with objects outside
  5093.                     containers, the three functions act only on the calling
  5094.                     object, so firstThat and lastThat are equivalent.
  5095.  
  5096.                     See also:   firstThat, Container::lastThat
  5097.  
  5098.             nameOf  virtual char *nameOf() const = 0;
  5099.  
  5100.                     Pure virtual function to be defined by derived classes
  5101.                     to return their object ID string.
  5102.  
  5103.  
  5104.  
  5105.                                   - 86 -
  5106.  
  5107.  
  5108.                                                                      Object
  5109.  
  5110.  
  5111.  
  5112.                new  void *operator new( size_t size );
  5113.  
  5114.                     Overrides the C++ operator new. Allocates size bytes
  5115.                     for an object. Returns ZERO if the allocation fails,
  5116.                     otherwise returns a pointer to the new object.
  5117.  
  5118.            printOn  virtual void printOn( ostream& outputStream ) const =
  5119.                     0;
  5120.  
  5121.                     Pure virtual function to be defined in derived classes
  5122.                     to provide formatted output of objects on the given
  5123.                     output stream. printOn is really for internal use by
  5124.                     the overloaded operator <<.
  5125.  
  5126.                     See also: operator <<
  5127.  
  5128.           ptrToRef  static Object ptrToRef( Object *p );
  5129.  
  5130.                     Returns *ZERO is p is 0, else returns *p
  5131.  
  5132.  
  5133.            Friends  =======================================================
  5134.  
  5135.        operator <<  ostream& operator <<( ostream& outputStream, const
  5136.                     Object& anObject );
  5137.  
  5138.                     Uses printOn to send a formatted representation of
  5139.                     anObject to the given output stream. The stream is
  5140.                     returned, allowing the usual chaining of the <<
  5141.                     operator.
  5142.  
  5143.                     operator << is a friend of Object.
  5144.  
  5145.  
  5146.  Related functions  =======================================================
  5147.  
  5148.                     The following overloaded operators are related to
  5149.                     Object but are not member functions:
  5150.  
  5151.        operator ==  int operator ==( const Object& test1, const Object&
  5152.                     test2 );
  5153.  
  5154.                     Returns 1  if the two objects are equal, otherwise
  5155.                     returns 0. Equal means that isA and isEqual each return
  5156.                     the same values for the two objects.
  5157.  
  5158.  
  5159.  
  5160.  
  5161.  
  5162.  
  5163.                                   - 87 -
  5164.  
  5165.  
  5166. Object
  5167.  
  5168.  
  5169.  
  5170.                     Note that for sortable objects (derived from the class
  5171.                     Sortable) there are also overloaded nonmember operators
  5172.                     <, >, <=, and >=.
  5173.  
  5174.                     See also: Object::isA, Object::isEqual, operator !=,
  5175.                     Sortable class.
  5176.  
  5177.        operator !=  int operator !=( const Object& test1, const Object&
  5178.                     test2 );
  5179.  
  5180.                     Returns 1  if the two objects are unequal, otherwise
  5181.                     returns 0. Unequal means that either isA or isEqual
  5182.                     each return the different values for the two objects.
  5183.  
  5184.                     See also: Object::isA, Object::isEqual, operator ==
  5185.  
  5186.  
  5187.  
  5188. ===========================================================================
  5189. PriorityQueue                                                    priortyq.h
  5190. ===========================================================================
  5191.  
  5192.                     ┌────────────┐  ╔════════════════════╗
  5193.                     │ Container  ├──╢   PriorityQueue    ║
  5194.                     └────────────┘  ╚════════════════════╝
  5195.  
  5196.                     The instance class Priority Queue, derived from
  5197.                     Container, implements the traditional priority queue
  5198.                     data structure. The objects in a priority queue must be
  5199.                     sortable (see Sortable class for details). A priority
  5200.                     queue is either a GIFO (greatest-in-first-out) or SIFO
  5201.                     (smallest-in-first-out) container widely used in
  5202.                     scheduling algorithms. The difference really depends on
  5203.                     your ordering definition. In explaining this
  5204.                     implementation, we'll assume a GIFO. You can picture
  5205.                     sortable objects being added at the right, but each
  5206.                     extraction from the left gives the "greatest" object in
  5207.                     the queue. (For applications where you need to extract
  5208.                     the smallest item, you need to adjust your definition
  5209.                     of "less than.") A detailed discussion of priority
  5210.                     queues can be found in Knuth's The Art of Computer
  5211.                     Programming, Volume 3, 5.2.3.
  5212.  
  5213.                     The member function put adds objects to the queue;
  5214.                     peekLeft lets you examine the largest element in the
  5215.                     queue; get removes and returns the largest element; you
  5216.                     can also detach this item with detachLeft without
  5217.  
  5218.  
  5219.  
  5220.  
  5221.                                   - 88 -
  5222.  
  5223.  
  5224.                                                               PriorityQueue
  5225.  
  5226.  
  5227.  
  5228.                     "getting" it. PriorityQueue is implemented internally
  5229.                     using a private Btree object called tree.
  5230.  
  5231.  
  5232.   Member functions  =======================================================
  5233.  
  5234.  
  5235.         detachLeft  void detachLeft( Container::DeleteType dt =
  5236.                     Container::DefDelete );
  5237.  
  5238.                     Removes the smallest object from the priority queue.
  5239.                     Whether this object is destroyed or not depends on the
  5240.                     value of dt as explained in
  5241.                     TShouldDelete::ownsElements.
  5242.  
  5243.              flush  void flush( Container::DeleteType dt =
  5244.                     Container::DefDelete );
  5245.  
  5246.                     Flushes (empties) the priority queue. The fate of the
  5247.                     removes objects depends on the value of dt as explained
  5248.                     in TShouldDelete::ownsElements.
  5249.  
  5250.                get  Object& get();
  5251.  
  5252.                     Detaches the smallest object from the priority queue
  5253.                     and returns it. The detached object is not itself
  5254.                     destroyed.
  5255.  
  5256. getItemsInContainer countType getItemsInContainer() const ;
  5257.  
  5258.                     Returns the number of items in the priority queue.
  5259.  
  5260.          hashValue  virtual hashValueType hashValue() const;
  5261.  
  5262.                     Returns the hash value of the priority queue. See
  5263.                     HashTable::hashValue for more details.
  5264.  
  5265.          hasMember  int hasMember( const Object& obj ) const;
  5266.  
  5267.                     Returns 1 if obj belongs to the priority queue,
  5268.                     otherwise returns 0.
  5269.  
  5270.       initIterator  virtual void ContainerIterator& initIterator() const;
  5271.  
  5272.                     Creates and returns an iterator for this queue.
  5273.  
  5274.                     See also: ContainerIterator
  5275.  
  5276.  
  5277.  
  5278.  
  5279.                                   - 89 -
  5280.  
  5281.  
  5282. PriorityQueue
  5283.  
  5284.  
  5285.  
  5286.                isA  virtual classType isA() const;
  5287.  
  5288.                     Returns priorityQueueClass, the PriorityQueue type ID.
  5289.  
  5290.            isEmpty  int isEmpty();
  5291.  
  5292.                     Returns 1 if the priority queue is empty, otherwise
  5293.                     returns 0.
  5294.  
  5295.             nameOf  virtual char *nameOf() const;
  5296.  
  5297.                     Returns "PriorityQueue", the PriorityQueue type ID
  5298.                     string.
  5299.  
  5300.           peekLeft  Object& peekLeft();
  5301.  
  5302.                     Returns the smallest object in the priority queue
  5303.                     without removing it.
  5304.  
  5305.                put  void put( Object& o );
  5306.  
  5307.                     Add the given object to the priority queue.
  5308.  
  5309.  
  5310.  
  5311. ===========================================================================
  5312. Queue                                                               queue.h
  5313. ===========================================================================
  5314.  
  5315.                     ┌────────┐  ╔════════════╗
  5316.                     │ Deque  ├──╢   Queue    ║
  5317.                     └────────┘  ╚════════════╝
  5318.  
  5319.                     The instance class Queue, derived from Deque,
  5320.                     implements the traditional queue data structure. A
  5321.                     queue is a FIFO (first-in-first-out) container where
  5322.                     objects are inserted at the left (head) and removed
  5323.                     from the right (tail). For a detailed discussion of
  5324.                     queues, see Knuth's The Art of Computer Programming,
  5325.                     Volume 1, 2.2.1.
  5326.  
  5327.                     The member functions put and get insert and remove
  5328.                     objects.
  5329.                     Queue is implemented as a restricted-access version of
  5330.                     Deque.
  5331.  
  5332.  
  5333.  
  5334.  
  5335.  
  5336.  
  5337.                                   - 90 -
  5338.  
  5339.  
  5340.                                                                       Queue
  5341.  
  5342.  
  5343.  
  5344.            Example  =======================================================
  5345.  
  5346.             Source   #include <queue.h>
  5347.                      #include <strng.h>
  5348.                      #include <assoc.h>
  5349.  
  5350.                      main()
  5351.                      {
  5352.                          Queue q;
  5353.                          String *s1 = new String("a string");
  5354.                          String *s2 = new String("another string");
  5355.                          Association *a1 = new Association(*s1,*s2);
  5356.  
  5357.                          // Populate the queue
  5358.                          q.put(*s1);
  5359.                          q.put(*s2);
  5360.                          q.put(*a1);
  5361.  
  5362.                          // Print to cout as a Container
  5363.                          cout << "As a container:\n" << q << endl;
  5364.  
  5365.                          // Empty the queue to cout
  5366.                          cout << "As a queue:\n";
  5367.                          while (!q.isEmpty())
  5368.                          {
  5369.                              cout << q << endl;
  5370.                          }
  5371.                          cout << endl;
  5372.  
  5373.                          // Queue should be empty
  5374.                          cout << "Should be empty:\n" << q;
  5375.                      }
  5376.  
  5377.             Output   As a container:
  5378.                      Queue {  Association { a string, another a string }
  5379.                      ,
  5380.                          another string,
  5381.                          a string }
  5382.  
  5383.                      As a queue:
  5384.                      a string
  5385.                      another string
  5386.                       Association { a string, another string }
  5387.  
  5388.                      Should be empty:
  5389.                      Queue {  }
  5390.  
  5391.  
  5392.  
  5393.  
  5394.  
  5395.                                   - 91 -
  5396.  
  5397.  
  5398. Queue
  5399.  
  5400.  
  5401.  
  5402.   Member functions  =======================================================
  5403.  
  5404.  
  5405.                get  Object& get();
  5406.  
  5407.                     Removes the object from the end (tail) of the queue. By
  5408.                     default the removed object will not be destroyed. If
  5409.                     the queue is empty, NOOBJECT is returned. Otherwise the
  5410.                     removed object is returned.
  5411.  
  5412.                     See also:   TShouldDelete class
  5413.  
  5414.                isA  virtual classType isA() const;
  5415.  
  5416.                     Returns queueClass, the Queue type ID.
  5417.  
  5418.                put  void put( Object& o );
  5419.  
  5420.                     Add an object to (the tail of) a queue.
  5421.  
  5422.  
  5423.  
  5424. ===========================================================================
  5425. Set                                                                   set.h
  5426. ===========================================================================
  5427.  
  5428.                     ┌────────────┐  ╔════════════╗  ┌────────────┐
  5429.                     │    Bag     ├──╢    Set     ╟──┤ Dictionary │
  5430.                     └────────────┘  ╚════════════╝  └────────────┘
  5431.  
  5432.                     The instance class Set is a collection that allows only
  5433.                     one instance of any object. This restriction calls for
  5434.                     a specialized add member function to trap any
  5435.                     duplicates. Apart from this difference, the Set and Bag
  5436.                     classes are essentially the same.
  5437.  
  5438.  
  5439.   Member functions  =======================================================
  5440.  
  5441.  
  5442.                add  virtual void add( Object& objectToAdd );
  5443.  
  5444.                     Adds the given object to the set only if it is not
  5445.                     already a member. If objectToAdd is found in the set,
  5446.                     add does nothing.
  5447.  
  5448.  
  5449.  
  5450.  
  5451.  
  5452.  
  5453.                                   - 92 -
  5454.  
  5455.  
  5456.                                                                         Set
  5457.  
  5458.  
  5459.  
  5460.                     See also: Collection::hasMember
  5461.  
  5462.        constructor  Set( sizeType setSize = DEFAULT_SET_SIZE );
  5463.  
  5464.                     Creates a set with the given size by calling the base
  5465.                     Bag constructor.
  5466.  
  5467.                     See also:   Bag::Bag
  5468.  
  5469.                isA  virtual classType isA() const;
  5470.  
  5471.                     Returns setClass, the Set class ID.
  5472.  
  5473.             nameOf  virtual char *nameOf() const;
  5474.  
  5475.                     Returns "Set", the Set class ID string.
  5476.  
  5477.  
  5478.  
  5479. ===========================================================================
  5480. Sortable                                                         sortable.h
  5481. ===========================================================================
  5482.  
  5483.                                                      ┌────────────┐
  5484.                                                    ┌─┤   String   │
  5485.                                                    │ └────────────┘
  5486.                     ┌────────────┐  ╔════════════╗ │ ┌────────────┐
  5487.                     │   Object   ├──╢  Sortable  ╟─┼─┤  BaseDate  │
  5488.                     └────────────┘  ╚════════════╝ │ └────────────┘
  5489.                                                    │ ┌────────────┐
  5490.                                                    └─┤  BaseTime  │
  5491.                                                      └────────────┘
  5492.  
  5493.                     Sortable is an abstract class derived from Object. You
  5494.                     can use it to build classes of sortable objects.
  5495.                     Objects are said to be sortable when they can be placed
  5496.                     in an order based on some useful and consistent
  5497.                     definition of "less than", "equal", and "greater than."
  5498.                     Any two of these conditions will suffice, in fact,
  5499.                     since the remaining condition can be constructed with
  5500.                     logical operators. Sortable uses the two primitives
  5501.                     "less than" and "equal" via the pure virtual functions
  5502.                     (pure virtual functions) isLessThan and isEqual. Both
  5503.                     of these member functions are applicable only to
  5504.                     objects of the same type (see operators == and < for
  5505.                     more details). The isEqual member function is a pure
  5506.                     virtual function inherited from Object (since unordered
  5507.                     objects also need a test for equality), whereas
  5508.  
  5509.  
  5510.  
  5511.                                   - 93 -
  5512.  
  5513.  
  5514. Sortable
  5515.  
  5516.  
  5517.  
  5518.                     isLessThan is a new pure virtual function for Sortable.
  5519.                     Your derived classes must define these two member
  5520.                     functions to provide an appropriate ordering of their
  5521.                     objects.
  5522.  
  5523.                     Once isLessThan and isEqual are defined, you can use
  5524.                     the overloaded operators  ==, !=, <, <=, >, >= in the
  5525.                     obvious way (see Related Functions section below). The
  5526.                     < operator tests the objects' types first with isA and
  5527.                     returns 0 if the objects are of different types. Then
  5528.                     if the objects are of the same type, the isLessThan
  5529.                     member is called, returning 0 or 1. If your application
  5530.                     calls for the ordering of objects of different types,
  5531.                     you would have to define your own comparison operators.
  5532.  
  5533.                     The elements stored in ordered containers must clearly
  5534.                     be sortable. For example, when adding elements to a
  5535.                     SortedArray object, the add member function must
  5536.                     compare the "size" of the incoming object against that
  5537.                     of the existing elements. Similarly, Btree objects make
  5538.                     use of magnitude for storage and access methods. Note,
  5539.                     however, that an unordered container can hold either
  5540.                     unsortable or sortable objects.
  5541.  
  5542.                     The type of sortable objects available differs between
  5543.                     the Object-based containers and the template-based
  5544.                     containers. In the Object-based hierarchy you must use
  5545.                     objects ultimately derived from Sortable, whereas the
  5546.                     template containers let you store any object or
  5547.                     predefined data type for which == and < is defined. If
  5548.                     you want to store ints in an Object-based container,
  5549.                     for example, you must invent a suitable class:
  5550.  
  5551.                      class Integer : public Sortable
  5552.                      {
  5553.                         int data;
  5554.                         ...
  5555.                      public:
  5556.  
  5557.                         virtual char *nameOf() const { return "Integer"; }
  5558.                         virtual classType isA() const { return
  5559.                      integerClass; }
  5560.                         virtual int isLessThan( const Object& i ) const
  5561.                                 { return data < ((Integer&)i).data; }
  5562.                         ...
  5563.                      }
  5564.  
  5565.  
  5566.  
  5567.  
  5568.  
  5569.                                   - 94 -
  5570.  
  5571.  
  5572.                                                                    Sortable
  5573.  
  5574.  
  5575.  
  5576.                     The Object-based container library already provides
  5577.                     three useful instance classes derived from Sortable:
  5578.                     String, Date, and Time with the natural ordering you
  5579.                     would expect. Remember, though, that you are free to
  5580.                     define your own orderings in derived classes to suit
  5581.                     your application. You must make sure that your
  5582.                     comparisons are logically consistent. For instance, >
  5583.                     must be transitive: A > B and B > C must imply A > C.
  5584.  
  5585.  
  5586.   Member functions  =======================================================
  5587.  
  5588.  
  5589.          hashValue  virtual hashValueType hashValue() const = 0;
  5590.  
  5591.                     A pure virtual function to be defined by derived
  5592.                     classes to return the hash value of a sortable object.
  5593.                     See HashTable::hashValue for more details.
  5594.  
  5595.                isA  virtual classType isA() const = 0;
  5596.  
  5597.                     Pure virtual function to be defined in derived classes
  5598.                     to return their class ID.
  5599.  
  5600.            isEqual  virtual int isEqual( const Object& testObject ) const =
  5601.                     0;
  5602.  
  5603.                     Pure virtual function to be defined in derived classes
  5604.                     to test for equality. Equality means that the calling
  5605.                     object is the same type as testObject and that their
  5606.                     values (as defined by this member function) are equal.
  5607.                     Returns 1 for equality, otherwise 0.
  5608.  
  5609.         isLessThan  virtual int isLessThan( const Object& testObject )
  5610.                     const = 0;
  5611.  
  5612.                     Pure virtual function to be defined in derived classes
  5613.                     to test for "less than." Returns 1 for "less than",
  5614.                     otherwise 0.
  5615.  
  5616.         isSortable  virtual int isSortable() const;
  5617.  
  5618.                     Returns 1 for all objects derived from Sortable
  5619.                     (overrides Object::isSortable).
  5620.  
  5621.             nameOf  virtual char *nameOf() const = 0;
  5622.  
  5623.  
  5624.  
  5625.  
  5626.  
  5627.                                   - 95 -
  5628.  
  5629.  
  5630. Sortable
  5631.  
  5632.  
  5633.  
  5634.                     Pure virtual function to be defined by derived classes
  5635.                     to return their object ID string.
  5636.  
  5637.            printOn  virtual void printOn( ostream& outputStream ) const =
  5638.                     0;
  5639.  
  5640.   operator << is a  Pure virtual function to be defined in derived classes
  5641.  friend of Object.  to output the object on the given stream. printOn is
  5642.       See page 87.  for internal use by the overloaded operator <<.
  5643.  
  5644.  
  5645.  Related functions  =======================================================
  5646.  
  5647.                     The following overloaded operators are related to
  5648.                     Sortable but are not member functions:
  5649.  
  5650.         operator <  int operator <( const Sortable& test1, const Sortable&
  5651.                     test2 );
  5652.  
  5653.                     Returns 1 if the two objects are of the same type X,
  5654.                     and test1 is "less than" test2 (as defined by
  5655.                     X::isLessThan). Otherwise returns 0.
  5656.  
  5657.                     See also: Sortable::isLessThan, Sortable::isA
  5658.  
  5659.        operator <=  int operator <=( const Sortable& test1, const Sortable&
  5660.                     test2 );
  5661.  
  5662.                     As for operator <, but also tests true for equality.
  5663.  
  5664.         operator >  int operator >( const Sortable& test1, const Sortable&
  5665.                     test2 );
  5666.  
  5667.                     Returns 1 if the two objects are of the same type X,
  5668.                     and test1 is not "less than" and not "equal" to test2
  5669.                     (as defined by X::isLessThan and X::isEqual). Otherwise
  5670.                     returns 0.
  5671.  
  5672.        operator >=  int operator >=( const Sortable& test1, const Sortable&
  5673.                     test2 );
  5674.  
  5675.                     As for operator >, but also tests true for equality.
  5676.                     Note that >= returns !( test1<( test2) ), so it returns
  5677.                     1 if test1 and test2 are of different types.
  5678.  
  5679.  
  5680.  
  5681.  
  5682.  
  5683.  
  5684.  
  5685.                                   - 96 -
  5686.  
  5687.  
  5688.                                                                 SortedArray
  5689.  
  5690.  
  5691.  
  5692. ===========================================================================
  5693. SortedArray                                                      sortarry.h
  5694. ===========================================================================
  5695.  
  5696.                     ┌─────────────┐  ╔════════════╗
  5697.                     │AbstractArray├──╢SortedArray ║
  5698.                     └─────────────┘  ╚════════════╝
  5699.  
  5700.                     The instance class SortedArray, derived from
  5701.                     AbstractArray, defines an array that maintains its
  5702.                     elements in ascending order (according to the ordering
  5703.                     defined for the elements). That is, the element at
  5704.                     index n is less than or equal to the element at index n
  5705.                     + 1. Note that the operator <=, used when adding new
  5706.                     elements to the array, must be defined for comparing
  5707.                     any objects in the array. This will be the case for
  5708.                     objects ultimately derived from Sortable (see the
  5709.                     Related Functions section of the Sortable class
  5710.                     reference) as well as for the standard C integral
  5711.                     types.
  5712.  
  5713.                     Array and SortedArray are identical in many areas (they
  5714.                     have the same base, AbstractArray). One difference is
  5715.                     that SortedArray::detach "squeezes" the array to
  5716.                     maintain ascending order, while Array::detach leaves
  5717.                     "holes" in the array.
  5718.  
  5719.  
  5720.  
  5721. ===========================================================================
  5722. Stack                                                               stack.h
  5723. ===========================================================================
  5724.  
  5725.                     ┌────────────┐  ╔════════════╗
  5726.                     │ Container  ├──╢   Stack    ║
  5727.                     └────────────┘  ╚════════════╝
  5728.  
  5729.  
  5730.                     The instance class Stack, derived from Container, is
  5731.                     one of the sequence classes like Queue and Deque. A
  5732.                     stack is a LIFO (last-in-first-out) linear list for
  5733.                     which all insertions (pushes) and removals (pops) take
  5734.                     place at one end (the top or head) of the list (see D.
  5735.                     E Knuth's The Art of Computer Programming, Volume 1,
  5736.                     2.2). In addition to the traditional pop and push
  5737.                     member functions, Stack provides top, a member function
  5738.                     for examining the object at the top of the stack
  5739.                     without affecting the stack's contents. top must be
  5740.  
  5741.  
  5742.  
  5743.                                   - 97 -
  5744.  
  5745.  
  5746. Stack
  5747.  
  5748.  
  5749.  
  5750.                     used with care since it returns a reference to an
  5751.                     object that may be owned by the stack. Destroying the
  5752.                     object returned by top can disrupt the internal
  5753.                     mechanism for storing the stack. The correct way to
  5754.                     dispose of the top element is to use pop followed by
  5755.                     delete. Stack is implemented internally as a List via a
  5756.                     private data member theStack of type List.
  5757.  
  5758.                     See also: Stacks templates and classes
  5759.  
  5760.  
  5761.            Example  =======================================================
  5762.  
  5763.             Source   #include <stack.h>
  5764.                      #include <strng.h>
  5765.                      #include <assoc.h>
  5766.  
  5767.                      main()
  5768.                      {
  5769.                          Stack s;
  5770.                          String *s1 = new String("a string");
  5771.                          String *s2 = new String("another string");
  5772.                          Association *a1 = new Association(*s1,*s2);
  5773.  
  5774.                          s.push(*s1);
  5775.                          s.push(*s2);
  5776.                          s.push(*a1);
  5777.  
  5778.                          // Print the Stack
  5779.                          cout << "As a Container:\n" << s << endl;
  5780.  
  5781.                          // Empty the stack to cout
  5782.                          cout << "As a Stack:\n";
  5783.                          while (!s.isEmpty())
  5784.                          {
  5785.                              Object& obj = s.pop();
  5786.                              cout << obj << endl;
  5787.                              delete &obj;
  5788.                          }
  5789.                      }
  5790.  
  5791.             Output   As a Container:
  5792.                      Stack {  Association { a string, another string }
  5793.                      ,
  5794.                          another string,
  5795.                          a string }
  5796.  
  5797.                      As a Stack:
  5798.  
  5799.  
  5800.  
  5801.                                   - 98 -
  5802.  
  5803.  
  5804.                                                                       Stack
  5805.  
  5806.  
  5807.  
  5808.                       Association { a string, another string }
  5809.  
  5810.                      another string
  5811.                      a string
  5812.  
  5813.  
  5814.   Member functions  =======================================================
  5815.  
  5816.  
  5817.              flush  virtual void flush( DeleteType dt = DefDelete );
  5818.  
  5819.                     Flushes (empties) the stack. The fate of the removed
  5820.                     objects depends on the argument dt. See TShouldDelete
  5821.                     for details.
  5822.  
  5823. getItemsInContainer virtual countType getItemsInContainer() const;
  5824.  
  5825.                     Returns the number of items in the stack.
  5826.  
  5827.       initIterator  virtual ContainerIterator& initIterator() const;
  5828.  
  5829.                     Creates and returns a stack iterator for the stack.
  5830.  
  5831.                     See also: ContainerIterator class
  5832.  
  5833.                isA  virtual classType isA() const;
  5834.  
  5835.                     Returns stackClass, the Stack type ID.
  5836.  
  5837.            isEmpty  virtual int isEmpty() const;
  5838.  
  5839.                     Returns 1 if the stack is empty, otherwise returns 0.
  5840.  
  5841.             nameOf  virtual char *nameOf() const;
  5842.  
  5843.                     Returns "Stack", the Stack type ID string.
  5844.  
  5845.                pop  Object& pop();
  5846.  
  5847.                     Removes the object from the top of the stack and
  5848.                     returns the object. The fate of the popped object is
  5849.                     determined by ownership as explained in TShouldDelete.
  5850.  
  5851.               push  void push( Object& toPush );
  5852.  
  5853.                     Adds (pushes) the object toPush to the top of the
  5854.                     stack.
  5855.  
  5856.  
  5857.  
  5858.  
  5859.                                   - 99 -
  5860.  
  5861.  
  5862. Stack
  5863.  
  5864.  
  5865.  
  5866.                top  Object& top();
  5867.  
  5868.                     Returns but does not remove the object at the top of
  5869.                     the stack.
  5870.  
  5871.  
  5872.  
  5873. ===========================================================================
  5874. String                                                              strng.h
  5875. ===========================================================================
  5876.  
  5877.                     ┌────────────┐  ╔════════════╗
  5878.                     │  Sortable  ├──╢   String   ║
  5879.                     └────────────┘  ╚════════════╝
  5880.  
  5881.                     String is an instance class, derived from Sortable, to
  5882.                     implement null-terminated, character strings. String
  5883.                     objects are ordered in the usual lexicographic way
  5884.                     using strcmp from the standard C string.h. Note that
  5885.                     the String class include file is spelled strng.h. See
  5886.                     Sortable for a discussion on ordered classes.
  5887.  
  5888.  
  5889.   Member functions  =======================================================
  5890.  
  5891.  
  5892.        constructor  String( const char *aPtr = "" );
  5893.  
  5894.                     Constructs a String object from the given C string.
  5895.  
  5896.        constructor  String(const String& sourceString );
  5897.  
  5898.                     Copy constructor.
  5899.  
  5900.          hashValue  virtual hashValueType hashValue() const;
  5901.  
  5902.                     Returns the hash value of this string. See
  5903.                     HashTable::hashValue for more details.
  5904.  
  5905.                isA  virtual classType isA() const;
  5906.  
  5907.                     Returns stringClass, the Stack type ID.
  5908.  
  5909.            isEqual  virtual int isEqual( const Object& testString ) const;
  5910.  
  5911.                     Returns 1 if the calling string is equal to testString,
  5912.                     otherwise returns 0. You can also use the overloaded
  5913.  
  5914.  
  5915.  
  5916.  
  5917.                                   - 100 -
  5918.  
  5919.  
  5920.                                                                      String
  5921.  
  5922.  
  5923.  
  5924.                     operators == and != as explained in the Related
  5925.                     functions section of the Object class.
  5926.  
  5927.         isLessThan  virtual int isLessThan( const Object& testString )
  5928.                     const;
  5929.  
  5930.                     Returns 1  if the calling string lexically precedes
  5931.                     testString, otherwise returns 0. You can also use the
  5932.                     overloaded operators <, <=, >, and >=, as explained in
  5933.                     the Related functions section of the Storable class.
  5934.  
  5935.  
  5936.             nameOf  virtual char *nameOf() const;
  5937.  
  5938.                     Returns the Stack type ID string.
  5939.  
  5940.            printOn  virtual void printOn( ostream& outputString ) const;
  5941.  
  5942.   operator << is a  Prints this string on the given stream. printOn is
  5943.  friend of Object.  really for internal use by the overloaded operator <<.
  5944.       See page 87.
  5945.         operator =  String& operator =( const String& sourceString );
  5946.  
  5947.                     Overloads the assignment operator for string objects.
  5948.  
  5949.    operator char *  operator const char *() const;
  5950.  
  5951.                     Returns a pointer to this string.
  5952.  
  5953.  
  5954.            Example  =======================================================
  5955.  
  5956.             Source   // File TSTRNG.CPP:    Test the String class
  5957.  
  5958.                      #include <strng.h>
  5959.  
  5960.                      void identify(String&);
  5961.  
  5962.                      main()
  5963.                      {
  5964.                          char s1[21], s2[21];
  5965.  
  5966.                          cout << "Enter a string: ";        // Read a
  5967.                      string
  5968.                          cin >> s1;
  5969.                          String str1(s1);
  5970.                          identify(str1);
  5971.  
  5972.  
  5973.  
  5974.  
  5975.                                   - 101 -
  5976.  
  5977.  
  5978. String
  5979.  
  5980.  
  5981.  
  5982.                          cout << "Enter another string: ";    // Read
  5983.                      another
  5984.                          cin >> s2;
  5985.                          String str2(s2);
  5986.                          identify(str2);
  5987.  
  5988.                          // Do some relational tests:
  5989.                          cout << "Equal: " << str1.isEqual(str2) << endl
  5990.                               << "Less than: " << str1.isLessThan(str2) <<
  5991.                      endl;
  5992.  
  5993.                          // String assignment:
  5994.                          str2 = str1;
  5995.                          cout << "After assignment:\n" << "Equal: "
  5996.                               << str1.isEqual(str2);
  5997.                      }
  5998.  
  5999.                      void identify(String& str)
  6000.                      {
  6001.                          // Echo a String's value and type
  6002.                          cout << "Value: " << str
  6003.                               << ", Object type: " << str.nameOf() << endl
  6004.                      << endl;
  6005.                      }
  6006.  
  6007.             Output   Enter a string: hello
  6008.                      Value: hello, Object type: String
  6009.  
  6010.                      Enter another string: goodbye
  6011.                      Value: goodbye, Object type: String
  6012.  
  6013.                      Equal: 0
  6014.                      Less than: 0
  6015.                      After assignment:
  6016.                      Equal: 1
  6017.  
  6018.  
  6019.  
  6020. ===========================================================================
  6021. Time                                                                ltime.h
  6022. ===========================================================================
  6023.  
  6024.                     ┌────────────┐  ╔════════════╗
  6025.                     │  BaseTime  ├──╢    Time    ║
  6026.                     └────────────┘  ╚════════════╝
  6027.  
  6028.                     Time is a sortable instance class derived from
  6029.                     BaseTime. Time adds a printOn member. You can override
  6030.  
  6031.  
  6032.  
  6033.                                   - 102 -
  6034.  
  6035.  
  6036.                                                                        Time
  6037.  
  6038.  
  6039.  
  6040.                     this in derived classes to cope with international
  6041.                     formatting variations.
  6042.  
  6043.  
  6044.   Member functions  =======================================================
  6045.  
  6046.  
  6047.        constructor  Time();
  6048.  
  6049.                     Calls the BaseTime constructor to create a Time object
  6050.                     with the current time.
  6051.  
  6052.                     See also: BaseTime constructor
  6053.  
  6054.        constructor  Time( const Time& T );
  6055.  
  6056.                     Copy constructor.
  6057.  
  6058.        constructor  Time( unsigned char H, unsigned char M = 0, unsigned
  6059.                           char S = 0, unsigned char D = 0 );
  6060.  
  6061.                     Creates a Time object with the given hour, minutes,
  6062.                     seconds, and hundredths of seconds.
  6063.  
  6064.                isA  virtual classType isA() const;
  6065.  
  6066.                     Returns timeClass, the Time class ID.
  6067.  
  6068.             nameOf  virtual char *nameOf() const;
  6069.  
  6070.                     Returns "Time", the Time class ID string.
  6071.  
  6072.            printOn  virtual void printOn( ostream& outputStream ) const;
  6073.  
  6074.   operator << is a  Sends a formatted Time object to the given output
  6075.  friend of Object.  stream. The default format is hh:mm:ss:dd a/pm with
  6076.       See page 87.  nonmilitary hours. printOn is for internal use by the
  6077.                     overloaded operator <<.
  6078.  
  6079.  
  6080.  
  6081.  
  6082.  
  6083.  
  6084.  
  6085.  
  6086.  
  6087.  
  6088.  
  6089.  
  6090.  
  6091.                                   - 103 -
  6092.  
  6093.  
  6094. Timer
  6095.  
  6096.  
  6097.  
  6098. ===========================================================================
  6099. Timer                                                               timer.h
  6100. ===========================================================================
  6101.  
  6102.                     ╔════════════╗
  6103.                     ║   Timer    ╟
  6104.                     ╚════════════╝
  6105.  
  6106.                     Timer is an instance class implementing a stop watch.
  6107.                     You can use Timer objects to time program execution by
  6108.                     calling the member functions start and stop within your
  6109.                     program, and then using time to return the elapsed
  6110.                     time. The reset member function resets the elapsed time
  6111.                     to zero. Successive starts and stops will accumulate
  6112.                     elapsed time until a reset.
  6113.  
  6114.  
  6115.   Member functions  =======================================================
  6116.  
  6117.  
  6118.        constructor  Timer();
  6119.  
  6120.                     Creates a Timer object.
  6121.  
  6122.              reset  void reset();
  6123.  
  6124.                     Clears the elapsed time accumulated from previous
  6125.                     start/stop sequences.
  6126.  
  6127.         resolution  static double resolution();
  6128.  
  6129.                     Determines the timer resolution for all timer objects.
  6130.                     This value is hardware and OS dependent. For example:
  6131.  
  6132.                         if( elapsedTime < timer.resolution() )
  6133.                            cout << "Measured time not meaningful." << endl;
  6134.  
  6135.              start  void start();
  6136.  
  6137.                     Ignored if the timer is running, otherwise starts the
  6138.                     timer. The elapsed times from any previous start/stop
  6139.                     sequences are accumulated until reset is called.
  6140.  
  6141.             status  int status();
  6142.  
  6143.                     Returns 1 if the timer is running, otherwise 0.
  6144.  
  6145.               stop  void stop();
  6146.  
  6147.  
  6148.  
  6149.                                   - 104 -
  6150.  
  6151.  
  6152.                                                                       Timer
  6153.  
  6154.  
  6155.  
  6156.                     Stops the timer. The accumulated elapsed time is
  6157.                     preserved until a reset call.
  6158.  
  6159.               time  double time();
  6160.  
  6161.                     Returns the elapsed time. The precision is given by the
  6162.                     value returned by the member function resolution.
  6163.  
  6164.  
  6165.  
  6166. ===========================================================================
  6167. TShouldDelete                                                      shddel.h
  6168. ===========================================================================
  6169.  
  6170. Figure 3: Class hierarchies in CLASSLIB
  6171.  
  6172.  
  6173.     TShouldDelete───────┬──Association
  6174.                         └──Container
  6175.  
  6176.                     TShouldDelete maintains the ownership state of a
  6177.                     container. The fate of objects that are removed from a
  6178.                     container can be made to depend on whether the
  6179.                     container owns its elements or not. Similarly, when a
  6180.                     container is destroyed, ownership can dictate the fate
  6181.                     of contained objects that are still in scope. As a
  6182.                     virtual base class for Container and Association,
  6183.                     TShouldDelete provides ownership control for all
  6184.                     containers and associations. The member function
  6185.                     ownsElements can be used either to report or to change
  6186.                     the ownership status of a container. delObj is used to
  6187.                     determine if objects in containers or associations
  6188.                     should be deleted or not.
  6189.  
  6190.  
  6191.   Member functions  =======================================================
  6192.  
  6193.  
  6194.        constructor  TShouldDelete( DeleteType dt = Delete );
  6195.  
  6196.                     Creates a TShouldDelete object. By default, containers
  6197.                     and associations own their elements. DeleteType is an
  6198.                     enumeration declared within the class as follows:
  6199.  
  6200.                     enum DeleteType { NoDelete, DefDelete, Delete };
  6201.  
  6202.       ownsElements  int ownsElements();
  6203.                     void ownsElements( int del );
  6204.  
  6205.  
  6206.  
  6207.                                   - 105 -
  6208.  
  6209.  
  6210. TShouldDelete
  6211.  
  6212.  
  6213.  
  6214.                     The first form returns 1 if the container owns its
  6215.                     elements, otherwise it returns 0. The second form
  6216.                     changes the ownership status as follows: if del is 0,
  6217.                     ownership is turned off; otherwise ownership is turned
  6218.                     on.
  6219.  
  6220.             delObj  int delObj( DeleteType dt );
  6221.  
  6222.                     Tests the state of ownership and returns 1 if the
  6223.                     contained objects should be deleted or 0 if the
  6224.                     contained elements should not be deleted. The factors
  6225.                     determining this are (i) the current ownership state
  6226.                     and (ii) the value of dt, as shown in the following
  6227.                     table.
  6228.                     delObj returns 1 if (dt is Delete) or (dt is DefDelete
  6229.                     and the container currently owns its elements). Thus a
  6230.                     dt of NoDelete returns 0 (don't delete) regardless of
  6231.                     ownership; a dt of Delete return 1 (do delete)
  6232.                     regardless of ownership; and a dt of DefDelete returns
  6233.                     1 (do delete) if the elements are owned, but a 0 (don't
  6234.                     delete) if the objects are not owned.
  6235.  
  6236.  
  6237.                     -------------------------------------------------------
  6238.                                       delObj
  6239.                       ownsElements  no    yes
  6240.                     -------------------------------------------------------
  6241.  
  6242.                       NoDelete      no    no
  6243.                       DefDelete     no    yes
  6244.                       Delete        yes   yes
  6245.  
  6246.                     -------------------------------------------------------
  6247.  
  6248.  
  6249.  
  6250.  
  6251.  
  6252.  
  6253.  
  6254.  
  6255.  
  6256.  
  6257.  
  6258.  
  6259.  
  6260.  
  6261.  
  6262.  
  6263.  
  6264.  
  6265.                                   - 106 -
  6266.  
  6267.  
  6268.  
  6269.  
  6270.  
  6271.  
  6272. INDEX
  6273. ___________________________________________________________________________
  6274.  
  6275.  
  6276.  
  6277.  
  6278.  
  6279. A                                      B
  6280. abbreviations                          Bag class 47
  6281.   CLASSLIB names and 19                BaseDate class 49
  6282. abstract classes 4                     BaseTime class 51
  6283. abstract data types                    BI_ prefix
  6284.   BIDS class names 19                    class names 19
  6285.   class library and 13                 BIDS template library 13
  6286. AbstractArray class 37                 Borland International Data
  6287. add                                      Structures (BIDS) 13
  6288.   Array member function 42             Btree class 53
  6289.   Bag member function 47               BtreeIterator class 55
  6290.   Btree member function 53
  6291.   Collection member function 58
  6292.   Dictionary member function 69        C
  6293.   DoubleList member function 71        C prefix
  6294.   HashTable member function 76           class names 19
  6295.   List member function 79              CHECK macro 35
  6296.   Sets member function 92              class templates 17
  6297. addAt                                  classes
  6298.   Array member function 42               abstract vs instance 4
  6299. addAtHead                                arrays
  6300.   DoubleList member function 71            sorted 97
  6301. addAtTail                                collections 12
  6302.   DoubleList member function 71          date and time 65, 102
  6303. ADT                                      debugging modes 35
  6304.   header files 22                        hierarchies 4
  6305. ADT (abstract data types) 13               object-based 6
  6306. Array class 41                             traversing 43
  6307. ArrayInterator                           lists 70
  6308.   AbstractArray friend 40                priority queues 88
  6309. ArrayIterator class 43                   queue 90
  6310. arrays                                   queues
  6311.   classes for 37, 41                       double-ended 66
  6312.   classes for sorted 97                  sequence 12, 66, 90, 97
  6313. arraySize                                  rules for 12
  6314.   AbstractArray member function 38       sortable objects 93
  6315. ascending sort 97                        stack 97
  6316. assertion macros 35                      string 100
  6317. Association class 7, 44                CLASSLIB naming conventions 19
  6318.   example program 34                   Collection class 12, 57
  6319.  
  6320.  
  6321.  
  6322.  
  6323. Index                                                                   107
  6324.  
  6325.  
  6326.  
  6327.  
  6328.  
  6329.  
  6330. collections                              reference section 36
  6331.   ordered 13                           container classes 6, 8, 59
  6332.   random access to 37                    functions of 59
  6333.   unordered 13                         container hierarchy
  6334.     Bag class 47                         object-based 4
  6335.     Dictionary class 69                ContainerIterator class 64
  6336.     DoubleList class 70                  containers and 64
  6337.     HashTable class 75                   hierarchy 11
  6338.     List class 79                      containers
  6339.     Set class 92                         basics 4
  6340. condFuncType definition 84               ContainerIterator class and 64
  6341. constructors                             direct 19
  6342.   AbstractArray member function 38       elements of 59
  6343.   Array member function 42               equality testing 60
  6344.   ArrayIterator member function 43       flushing 10, 59
  6345.   Association member function 44         implementation 14
  6346.   Bag member function 47                 indirect 19
  6347.   Basedate member function 49          current
  6348.   Basetime member function 51            ArrayIterator member function 43
  6349.   Btree member function 53               BtreeIterator member function 56
  6350.   BtreeIterator member function 56       ContainerIterator member function
  6351.   Collection member function 58          64
  6352.   Container member function 60           DoubleListIterator member
  6353.   Date member function 65                function 73
  6354.   Dictionary member function 70          HashTableIterator member function
  6355.   DoubleList member function 71          78
  6356.   DoubleListIterator member              ListIterator member function 81
  6357.   function 73
  6358.   HashTable member function 76
  6359.   HashTableIterator member function    D
  6360.   78                                   Date class 65
  6361.   List member function 79              dates
  6362.   ListIterator member function 81        class 65
  6363.   Object member function 84            Day
  6364.   Sets member function 93                Basedate member function 49
  6365.   String member function 100           __DEBUG macro 35
  6366.   Time member function 103             decrNofKeys
  6367.   Timer member function 104              Btree member function 53
  6368.   TShouldDelete member function 105    delete
  6369. container class library                  Error member function 75
  6370.   directories 31                       delObj
  6371.     examples 34                          TShouldDelete member function 106
  6372.     INCLUDE 32                         delta
  6373.     lib 34                               AbstractArray data member 37
  6374.     source 32                          Deque class 66
  6375.   example programs 34                  destroy
  6376.   memory models and 32                   AbstractArray member function 38
  6377.   project files and 32                   Collection member function 58
  6378.  
  6379.  
  6380.  
  6381.                                   - 108 -
  6382.  
  6383.  
  6384.  
  6385.  
  6386.  
  6387.  
  6388. destroyFromHead                          HashTable member function 77
  6389.   DoubleList member function 71        firstThat
  6390. destroyFromTail                          Bag member function 47
  6391.   DoubleList member function 71          Container member function 60
  6392. detach                                   Object member function 84
  6393.   AbstractArray member function 38     flush
  6394.   Bag member function 47                 Bag member function 47
  6395.   Btree member function 53               Btree member function 54
  6396.   Collection member function 58          Container member function 61
  6397.   DoubleList member function 71          Deque member function 68
  6398.   HashTable member function 76           DoubleList member function 72
  6399.   List member function 79                HashTable member function 77
  6400.   SortedArray member function 97         List member function 80
  6401. detachFromHead                           PriorityQueue member function 89
  6402.   DoubleList member function 71          Stacks member function 99
  6403. detachFromTail                         forEach
  6404.   DoubleList member function 71          Bag member function 48
  6405. detachLeft                               Container member function 61
  6406.   PriorityQueue member function 89       Object member function 85
  6407. Dictionary class 69                    free
  6408.   example program 34                     MemBlocks member function 83
  6409. direct and indirect data structures    fundamental data structure
  6410.   14                                     class templates 17
  6411. directories                            fundamental data structures
  6412.   container class library 31             class library and 13
  6413. DIRECTRY (container class library        Object-based classes 20
  6414.   example program) 34
  6415. DoubleList class 70
  6416. DoubleListIterator class 73            G
  6417.                                        get
  6418.                                          PriorityQueue member function 89
  6419. E                                        Queue member function 92
  6420. elements                               getItemsInContainer
  6421.   ordering definition 19                 Bag member function 48
  6422. Error class 7, 74                        Container member function 61
  6423. examples directory                       Deques member function 68
  6424.   container class library 34             PriorityQueue member function 89
  6425.                                          Stacks member function 99
  6426.                                        getLeft
  6427. F                                        Deque member function 68
  6428. FDS                                    getRight
  6429.   header files 22                        Deque member function 68
  6430. FDS (fundamental data structures)
  6431.   13
  6432. findmember                             H
  6433.   Bag member function 47               hash table
  6434.   Btree member function 54               iterators 78
  6435.   Collection member function 58        HashTable class 75
  6436.  
  6437.  
  6438.  
  6439. Index                                                                   109
  6440.  
  6441.  
  6442.  
  6443.  
  6444.  
  6445.  
  6446. HashTableIterator class 78             instance classes 4
  6447. hashValue                              isA
  6448.   Association member function 44         Array member function 43
  6449.   Basedate member function 49            Association member function 44
  6450.   Basetime member function 51            Bag member function 48
  6451.   Btree member function 54               Basedate member function 50
  6452.   Container member function 61           Basetime member function 52
  6453.   HashTable member function 77           Btree member function 54
  6454.   List member function 80                Container member function 62
  6455.   Object member function 85              Date member function 66
  6456.   PriorityQueue member function 89       Deque member function 68
  6457.   Sortable member function 95            Dictionary member function 70
  6458.   String member function 100             DoubleList member function 72
  6459. hasMember                                Error member function 75
  6460.   Bag member function 48                 HashTable member function 78
  6461.   Btree member function 54               List member function 80
  6462.   Collection member function 59          Object member function 85
  6463.   PriorityQueue member function 89       PriorityQueue member function 89
  6464. hour                                     Queue member function 92
  6465.   Basetime member function 51            Set member function 93
  6466. hundredths                               Sortable member function 95
  6467.   Basetime member function 51            Stack member function 99
  6468.                                          String member function 100
  6469.                                          Time member function 103
  6470. I                                      isAssociation
  6471. i_add                                    Association member function 44
  6472.   Btree member function 54               Object member function 85
  6473. I prefix                               isEmpty
  6474.   class names 19                         Bag member function 48
  6475. Imp suffix                               Container member function 62
  6476.   class names 19                         Deques member function 68
  6477. INCLUDE directory                        PriorityQueue member function 90
  6478.   container class library 32             Stack member function 99
  6479. incrNofKeys                            isEqual
  6480.   Btree member function 54               AbstractArray member function 39
  6481. initIterator                             Association member function 45
  6482.   AbstractArray member function 39       Basedate member function 50
  6483.   Bag member function 48                 Basetime member function 52
  6484.   Btree member function 54               Btree member function 54
  6485.   Container member function 61           Container member function 62
  6486.   Deque member function 68               Error member function 75
  6487.   DoubleList member function 72          Object member function 86
  6488.   HashTable member function 77           Sortable member function 95
  6489.   List member function 80                String member function 100
  6490.   PriorityQueue member function 89     isLessThan
  6491.   Stacks member function 99              Basedate member function 50
  6492. InnerNode                                Basetime member function 52
  6493.   Btree friend class 53                  Sortable member function 95
  6494.  
  6495.  
  6496.  
  6497.                                   - 110 -
  6498.  
  6499.  
  6500.  
  6501.  
  6502.  
  6503.  
  6504.   String member function 101           M
  6505. isSortable                             member functions
  6506.   Object member function 86              virtual
  6507.   Sortable member function 95              pure 4
  6508. Item                                   MemBlocks class 82
  6509.   Btree friend class 53                memory models
  6510. itemsInContainer                         container class library and 32
  6511.   Container data member 60             MemStack class 83
  6512. iterators                              minute
  6513.   DoubleList 73                          Basetime member function 52
  6514.   internal and external 11             Month
  6515. iterFuncType definition 61               Basedate member function 50
  6516.  
  6517.  
  6518. K                                      N
  6519. key                                    nameOf
  6520.   Association class 44                   Arrays member function 43
  6521.   Association member function 45         Association member function 45
  6522.                                          Bag member function 49
  6523.                                          Basedate member function 50
  6524. L                                        Basetime member function 52
  6525. Last-In-First-Out (LIFO) 14              Btree member function 54
  6526. lastElementIndex                         Container member function 62
  6527.   AbstractArray data member 37           Date member function 66
  6528. lastThat                                 Deque member function 68
  6529.   Bag member function 48                 Dictionary member function 70
  6530.   Container member function 62           DoubleList member function 72
  6531.   Object member function 86              Error member function 75
  6532. LeafNode                                 HashTable member function 78
  6533.   Btree friend class 53                  List member function 80
  6534. lib directory                            Object member function 86
  6535.   container class library 34             PriorityQueue member function 90
  6536. List class 79                            Set member function 93
  6537.   iterators 81                           Sortable member function 95
  6538. ListElement class 79                     Stacks member function 99
  6539. ListIterator class 81                    String member function 101
  6540. lists                                    Time member function 103
  6541.   classes for 70                       new
  6542.   linked                                 Object member function 86
  6543.     traversing 81                      Node
  6544. lookup                                   Btree friend 55
  6545.   Dictionary member function 70          Btree friend class 53
  6546. LOOKUP (container class library        non-container classes 6
  6547.   example program) 34
  6548. lowerBound
  6549.   AbstractArray member function 39     O
  6550. lowerbound                             O prefix 21
  6551.   AbstractArray data member 37           class names 19
  6552.  
  6553.  
  6554.  
  6555. Index                                                                   111
  6556.  
  6557.  
  6558.  
  6559.  
  6560.  
  6561.  
  6562. Object class 4, 84                     operator char *
  6563. Object container class library           String member function 101
  6564.   version 3.0 changes to 1             operator int
  6565. objectAt                                 ArrayIterator member function 43
  6566.   AbstractArray member function 39       BtreeIterator member function 56
  6567. objects                                  ContainerIterator member function
  6568.   automatic 11                           64
  6569.   detaching 10                           DoubleListIterator member
  6570.   heap 11                                function 74
  6571.   in containers                          HashTableIterator member function
  6572.     counting 59                          78
  6573.     displaying 60                        ListIterator member function 81
  6574.     iterating 60                       order
  6575.     ownership 59                         Btree member function 55
  6576.   ownership 9                          ordered collections 7, 13
  6577.   sortable 93                          ownsElements 9
  6578. operator <                               Bag member function 49
  6579.   overloaded 96                          TShouldDelete member function 105
  6580. operator =
  6581.   String member function 101
  6582. operator >                             P
  6583.   overloaded 96                        peekAtHead
  6584. operator !=                              DoubleList member function 72
  6585.   overloaded 88                        peekAtTail
  6586. operator ++                              DoubleList member function 72
  6587.   ArrayIterator member function 43     peekHead
  6588.   BtreeIterator member function 56       List member function 80
  6589.   ContainerIterator member function    peekLeft
  6590.   64                                     Deque member function 69
  6591.   DoubleListIterator member              PriorityQueue member function 90
  6592.   function 73                          peekRight
  6593.   HashTableIterator member function      Deque member function 69
  6594.   79                                   pop
  6595.   ListIterator member function 81        Stacks member function 99
  6596. operator <<                            PRECONDITION macro 35
  6597.   Object friends 87                    printContentsOn
  6598. operator <=                              AbstractArray member function 39
  6599.   overloaded 96                        printHeader
  6600. operator ==                              Container member function 62
  6601.   overloaded 87                        printOn
  6602. operator >=                              Association member function 45
  6603.   overloaded 96                          Basedate member function 50
  6604. operator []                              Basetime member function 52
  6605.   AbstractArray member function 39       Btree member function 55
  6606.   Btree member function 55               Container member function 62
  6607. operator - -                             Date member function 66
  6608.   DoubleListIterator member              Error member function 75
  6609.   function 73                            Object member function 87
  6610.  
  6611.  
  6612.  
  6613.                                   - 112 -
  6614.  
  6615.  
  6616.  
  6617.  
  6618.  
  6619.  
  6620.   Sortable member function 96          restart
  6621.   String member function 101             ArrayIterator member function 44
  6622.   Time member function 103               BtreeIterator member function 56
  6623. printSeparator                           ContainerIterator member function
  6624.   Container member function 63           65
  6625. printTrailer                             DoubleListIterator member
  6626.   Container member function 63           function 74
  6627. priority queues 88                       HashTableIterator member function
  6628. PriorityQueue class 88                   79
  6629. project files                            ListIterator member function 81
  6630.   container class libraries and 32     REVERSE (container class library
  6631. ptrAt                                    example program) 34
  6632.   AbstractArray member function 40
  6633. ptrToRef
  6634.   Object member function 87            S
  6635. push                                   S prefix
  6636.   Stacks member function 99              class names 19
  6637. put                                    second
  6638.   PriorityQueue member function 90       Basetime member function 52
  6639.   Queue member function 92             Set class 92
  6640. putLeft                                setData
  6641.   Deque member function 69               AbstractArray member function 40
  6642. putRight                               SetDay
  6643.   Deque member function 69               Basedate member function 50
  6644.                                        setHour
  6645.                                          Basetime member function 52
  6646. Q                                      setHundredths
  6647. Queue class 90                           Basetime member function 52
  6648.   example program 34                   setMinute
  6649. queues 90                                Basetime member function 52
  6650.   double-ended 66                      SetMonth
  6651. QUEUETST (container class library        Basedate member function 50
  6652.   example program) 34                  setSecond
  6653.                                          Basetime member function 52
  6654.                                        SetYear
  6655. R                                        Basedate member function 50
  6656. rank                                   Sortable class 7, 93
  6657.   Btree member function 55               ordered collections 13
  6658. reallocate                             SortedArray class 97
  6659.   AbstractArray member function 40       example program 34
  6660.   MemBlocks member function 83         sorts
  6661. removeEntry                              ascending 97
  6662.   AbstractArray member function 40     source directory
  6663. reset                                    container class library 32
  6664.   Timer member function 104            squeezeEntry
  6665. resolution                               AbstractArray member function 40
  6666.   Timer member function 104            Stack class 97
  6667.                                          example program 34
  6668.  
  6669.  
  6670.  
  6671. Index                                                                   113
  6672.  
  6673.  
  6674.  
  6675.  
  6676.  
  6677.  
  6678. start                                  top
  6679.   Timer member function 104              Stacks member function 99
  6680. status                                 TShouldDelete class 105
  6681.   Timer member function 104
  6682. stdtempl.h 22
  6683. stop                                   U
  6684.   Timer member function 104            unordered collections 13
  6685. String class 100                         Bag class 47
  6686.   example program 34                     Dictionary class 69
  6687. strings                                  DoubleList class 70
  6688.   classes for 100                        HashTable class 75
  6689. STRNGMAX (container class library        List class 79
  6690.   example program) 34                    Set class 92
  6691.                                        upperBound
  6692.                                          AbstractArray member function 40
  6693. T                                      upperbound
  6694. TC prefix 21                             AbstractArray data member 38
  6695.   class names 19
  6696. template-based container library 13
  6697. TEMPLATES                              V
  6698.   conditional compilation 32           value
  6699. Templates                                Association class 44
  6700.   Arrays example 30                      Association member function 45
  6701.   Deques example 30
  6702. templates
  6703.   approach to class library 3, 15      Y
  6704.   container classes and 14             Year
  6705.   instantiating 19                       Basedate member function 50
  6706. time
  6707.   Timer member function 105
  6708. Time class 102                         Z
  6709.   example program 34                   ZERO
  6710. Timer class 104                          Object data member 84
  6711.  
  6712.  
  6713.  
  6714.  
  6715.  
  6716.  
  6717.  
  6718.  
  6719.  
  6720.  
  6721.  
  6722.  
  6723.  
  6724.  
  6725.  
  6726.  
  6727.  
  6728.  
  6729.                                   - 114 -
  6730.  
  6731.