home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cset21v3.zip / INF / DDE4CCL.INF (.txt) < prev    next >
OS/2 Help File  |  1993-10-19  |  372KB  |  13,580 lines

  1.  
  2. ΓòÉΓòÉΓòÉ <hidden> Selection copy ΓòÉΓòÉΓòÉ
  3.  
  4. This function exists for both a flat collection and a tree. 
  5.  
  6. Please select: 
  7.  
  8. o copy if you are using a flat collection. 
  9.  
  10. o copy, copySubtree if you are using a tree. 
  11.  
  12.  
  13. ΓòÉΓòÉΓòÉ <hidden> Selection newCursor ΓòÉΓòÉΓòÉ
  14.  
  15. This function exists for both a flat collection and a tree. 
  16.  
  17. Please select: 
  18.  
  19. o newCursor if you are using a flat collection. 
  20.  
  21. o newCursor if you are using a tree. 
  22.  
  23.  
  24. ΓòÉΓòÉΓòÉ <hidden> Selection replaceAt ΓòÉΓòÉΓòÉ
  25.  
  26. This function exists for both a flat collection and a tree. 
  27.  
  28. Please select: 
  29.  
  30. o replaceAt if you are using a flat collection. 
  31.  
  32. o replaceAt if you are using a tree. 
  33.  
  34.  
  35. ΓòÉΓòÉΓòÉ <hidden> Selection setToFirst ΓòÉΓòÉΓòÉ
  36.  
  37. This function exists for a flat collection, a tree and a cursor. 
  38.  
  39. Please select: 
  40.  
  41. o setToFirst if you are using a flat collection. 
  42.  
  43. o setToFirst if you are using a tree. 
  44.  
  45. o setToFirst if you are using the cursor class. 
  46.  
  47.  
  48. ΓòÉΓòÉΓòÉ <hidden> Selection setToLast ΓòÉΓòÉΓòÉ
  49.  
  50. This function exists for a flat collection, a tree and a cursor. 
  51.  
  52. Please select: 
  53.  
  54. o setToLast if you are using a flat collection. 
  55.  
  56. o setToLast if you are using a tree. 
  57.  
  58. o setToLast if you are using the cursor. 
  59.  
  60.  
  61. ΓòÉΓòÉΓòÉ <hidden> Selection setToNext ΓòÉΓòÉΓòÉ
  62.  
  63. This function exists for a flat collection, a tree and a cursor. 
  64.  
  65. Please select: 
  66.  
  67. o setToNext if you are using a flat collection. 
  68.  
  69. o setToNext if you are using a tree. 
  70.  
  71. o setToNext if you are using the cursor. 
  72.  
  73.  
  74. ΓòÉΓòÉΓòÉ <hidden> Selection setToPrevious ΓòÉΓòÉΓòÉ
  75.  
  76. This function exists for a flat collection, a tree and a cursor. 
  77.  
  78. Please select: 
  79.  
  80. o setToPrevious if you are using a flat collection. 
  81.  
  82. o setToPrevious if you are using a tree. 
  83.  
  84. o setToPrevious if you are using the cursor. 
  85.  
  86.  
  87. ΓòÉΓòÉΓòÉ <hidden> Selection operator = ΓòÉΓòÉΓòÉ
  88.  
  89. This function exists for both a flat collection and a tree. 
  90.  
  91. Please select: 
  92.  
  93. o operator= if you are using a flat collection. 
  94.  
  95. o operator= if you are using a tree. 
  96.  
  97.  
  98. ΓòÉΓòÉΓòÉ <hidden> Selection operator != ΓòÉΓòÉΓòÉ
  99.  
  100. This function exists for both a flat collection and a cursor. 
  101.  
  102. Please select: 
  103.  
  104. o operator!= if you are using a flat collection. 
  105.  
  106. o operator!= if you are using a cursor. 
  107.  
  108.  
  109. ΓòÉΓòÉΓòÉ <hidden> Selection operator == ΓòÉΓòÉΓòÉ
  110.  
  111. This function exists for both a flat collection and a cursor. 
  112.  
  113. Please select: 
  114.  
  115. o operator== if you are using a flat collection. 
  116.  
  117. o operator== if you are using a cursor. 
  118.  
  119.  
  120. ΓòÉΓòÉΓòÉ <hidden> Selection allElementsDo ΓòÉΓòÉΓòÉ
  121.  
  122. For both flat and tree collections, there are multiple versions of the 
  123. allElementsDo function. For an explanation of the differences, see Iterating 
  124. over Collections. 
  125.  
  126. For flat collections: 
  127.  
  128. o With an iteration function see allElementsDo 
  129.  
  130. o With an iterator class see allElementsDo 
  131.  
  132. For tree collections: 
  133.  
  134. o With an iteration function see allElementsDo, allSubtreeElementsDo 
  135.  
  136. o With an iterator class see allElementsDo, allSubtreeElementsDo 
  137.  
  138.  
  139. ΓòÉΓòÉΓòÉ <hidden> Selection allSubtreeElementsDo ΓòÉΓòÉΓòÉ
  140.  
  141. There are multiple versions of the allSubtreeElementsDo function. For an 
  142. explanation of the differences, see Iterating over Collections. 
  143.  
  144. See the following sections: 
  145.  
  146. o With an iteration function see allElementsDo, allSubtreeElementsDo 
  147.  
  148. o With an iterator class see allElementsDo, allSubtreeElementsDo 
  149.  
  150.  
  151. ΓòÉΓòÉΓòÉ <hidden> Selection elementAt ΓòÉΓòÉΓòÉ
  152.  
  153. The elementAt is offered both for a flat collection and a tree: 
  154.  
  155. o For a flat collection see elementAt 
  156.  
  157. o For a tree see elementAt 
  158.  
  159.  
  160. ΓòÉΓòÉΓòÉ <hidden> Selection removeAll ΓòÉΓòÉΓòÉ
  161.  
  162. The removeAll in its normal form (removing all elements) is available for both 
  163. flat and tree collections. For a flat collection you can also specify a 
  164. property function that allows you to specify a property under which an element 
  165. is to be removed: 
  166.  
  167. o For a flat collection see removeAll 
  168.  
  169. o For a flat collection with a property function see removeAll 
  170.  
  171. o For a tree see removeAll, removeSubtree 
  172.  
  173.  
  174. ΓòÉΓòÉΓòÉ 1. How to Use the Online Collection Class Library Guide ΓòÉΓòÉΓòÉ
  175.  
  176. The IBM C/C++ Tools Online Collection Class Library Guide is a guide for C++ 
  177. programmers. It provides information about the Collection Class Library, a set 
  178. of C++ classes that implement commonly used data structures such as stacks, 
  179. heaps and queues. 
  180.  
  181. This document is a reference rather than a tutorial. It assumes you are already 
  182. familiar with C++ programming concepts. 
  183.  
  184. Before you begin to use this information, it would be helpful to understand how 
  185. you can: 
  186.  
  187. o Expand the Contents to see all available topics 
  188. o Obtain additional information for a highlighted word or phrase 
  189. o Use action bar choices 
  190.  
  191. How to Use the Contents 
  192.  
  193. When the Contents window first appears, some topics have a plus (+) sign beside 
  194. them. The plus sign indicates that additional topics are available. 
  195.  
  196. To expand the Contents if you are using a mouse, click on the plus sign. If you 
  197. are using the keyboard, use the Up or Down Arrow key to highlight the topic, 
  198. and press the plus (+) key. To see additional topics for those headings, click 
  199. on the plus sign or highlight that topic and press the plus (+) key. 
  200.  
  201. To view a topic, double-click on the topic (or press the Up or Down Arrow key 
  202. to highlight the topic, and then press the Enter key). 
  203.  
  204. How to Obtain Additional Information 
  205.  
  206. After you select a topic, the information for that topic appears in a window. 
  207. Highlighted words or phrases indicate that additional information is available. 
  208. You will notice that certain words and phrases are highlighted in green 
  209. letters, or in white letters on a black background. These are called hypertext 
  210. terms. If you are using a mouse, double-click on the highlighted word. If you 
  211. are using a keyboard, press the Tab key to move to the highlighted word, and 
  212. then press the Enter key. Additional information then appears in a window. 
  213.  
  214. How to Use Action Bar Choices 
  215.  
  216. Several choices are available for managing information presented in the C/C++ 
  217. Tools Online Standard Class Library Guide. There are three pull-down menus on 
  218. the action bar: the Services menu, the Options menu, and the Help menu. 
  219.  
  220. The actions that are selectable from the Services menu operate on the active 
  221. window currently displayed on the screen. These actions include the following: 
  222.  
  223. Bookmark 
  224.   Allows you to set a placeholder so you can retrieve information of interest 
  225.   to you. 
  226.  
  227.   When you place a bookmark on a topic, it is added to a list of bookmarks you 
  228.   have previously set. You can view the list, and you can remove one or all 
  229.   bookmarks from the list. If you have not set any bookmarks, the list is 
  230.   empty. 
  231.  
  232.   To set a bookmark, do the following: 
  233.  
  234.     1. Select a topic from the Contents. 
  235.     2. When that topic appears, choose the Bookmark option from the Services 
  236.        pull-down. 
  237.     3. If you want to change the name used for the bookmark, type the new name 
  238.        in the field. 
  239.     4. Click on the Place radio button (or press the Up or Down Arrow key to 
  240.        select it). 
  241.     5. Click on OK (or select it and press Enter). The bookmark is then added 
  242.        to the bookmark list. 
  243. Search 
  244.   Allows you to find occurrences of a word or phrase in the current topic, 
  245.   selected topics, or all topics. 
  246.  
  247.   You can specify a word or phrase to be searched. You can also limit the 
  248.   search to a set of topics by first marking the topics in the Contents list. 
  249.  
  250.   To search for a word or phrase in all topics, do the following: 
  251.  
  252.     1. Choose the Search option from the Services pull-down. 
  253.     2. Type the word or words to be searched for. 
  254.     3. Click on All sections (or press the Up or Down Arrow keys to select it). 
  255.     4. Click on Search (or select it and press Enter) to begin the search. 
  256.     5. The list of topics where the word or phrase appears is displayed. 
  257. Print 
  258.   Allows you to print one or more topics. You can also print a set of topics by 
  259.   first marking the topics in the Contents list. 
  260.  
  261.   To print the document Contents list, do the following: 
  262.  
  263.     1. Choose Print from the Services pull-down. 
  264.     2. Click on Contents (or press the Up or Down Arrow key to select it). 
  265.     3. Click on Print (or select it and press Enter). 
  266.     4. The Contents list is printed on your printer. 
  267. Copy 
  268.   Allows you to copy a topic that you are viewing to the System Clipboard or to 
  269.   a file that you can edit. This is particularly useful for copying program 
  270.   samples into the application that you are developing. 
  271.  
  272.   You can copy a topic that you are viewing in two ways: 
  273.  
  274.    o Copy copies the topic that you are viewing into the System Clipboard. If 
  275.      you are using a Presentation Manager* (PM) editor (for example, the 
  276.      Enhanced Editor) that copies or cuts (or both) to the System Clipboard, 
  277.      and pastes to the System Clipboard, you can easily add the copied 
  278.      information to your program source module. 
  279.  
  280.    o Copy to file copies the topic that you are viewing into a temporary file 
  281.      named TEXT.TMP. You can later edit that file by using any editor. TEXT.TMP 
  282.      is placed in the directory where your viewable document resides. 
  283.  
  284.   To copy a topic, do the following: 
  285.  
  286.     1. Expand the Contents list and select a topic. 
  287.     2. When the topic appears, choose Copy to file from the Services pull-down. 
  288.     3. The system puts the text pertaining to that topic into the temporary 
  289.        file TEXT.TMP. 
  290.  
  291. For information on any of the choices in the Services pull-down, highlight the 
  292. choice and press the F1 key. 
  293.  
  294. The actions that are selectable from the Options menu allow you to change the 
  295. way your Contents list is displayed. To expand the Contents and show all levels 
  296. for all topics, choose Expand all from the Options pull-down. You can also 
  297. press the Ctrl and * keys together. 
  298.  
  299. For information on any of the choices in the Options pull-down, highlight the 
  300. choice and press the F1 key. 
  301.  
  302. The actions that are selectable from the Help menu allow you to select 
  303. different types of help information. You can also press the F1 key for help 
  304. information about the Information Presentation Facility (IPF). 
  305.  
  306.  
  307. ΓòÉΓòÉΓòÉ <hidden> Related Information ΓòÉΓòÉΓòÉ
  308.  
  309. o Copyright 
  310. o Edition Notice 
  311. o Notices 
  312. o Trademarks and Service Marks 
  313.  
  314.  
  315. ΓòÉΓòÉΓòÉ 1.1. Copyright ΓòÉΓòÉΓòÉ
  316.  
  317. Copyright International Business Machines Corporation, 1993. All rights 
  318. reserved. 
  319.  
  320. Note to U.S. Government Users - Documentation related to restricted rights - 
  321. Use, duplication, or disclosure is subject to restrictions set forth in GSA ADP 
  322. Schedule Contract with IBM* Corp. 
  323.  
  324.  
  325. ΓòÉΓòÉΓòÉ 1.2. Edition Notice ΓòÉΓòÉΓòÉ
  326.  
  327. Second Edition, November 1993. 
  328.  
  329. This edition applies to Version 2.01 of IBM C/C++ Tools (82G3745, 82G3746, 
  330. 82G3747) and to all subsequent releases and modifications until otherwise 
  331. indicated in new editions.  This publication could include technical 
  332. inaccuracies or typographical errors.  Changes are periodically made to the 
  333. information herein; any such changes will be reported in subsequent revisions. 
  334.  
  335. Requests for publications and for technical information about IBM* products 
  336. should be made to your IBM Authorized Dealer or your IBM Marketing 
  337. Representative. 
  338.  
  339. When you send information to IBM, you grant IBM a nonexclusive right to use or 
  340. distribute the information in any ways it believes appropriate without 
  341. incurring any obligation to you. 
  342.  
  343.  
  344. ΓòÉΓòÉΓòÉ 1.3. Notices ΓòÉΓòÉΓòÉ
  345.  
  346. References in this publication to IBM* products, programs, or services do not 
  347. imply that IBM intends to make these available in all countries in which IBM 
  348. operates. Any reference to an IBM product, program, or service is not intended 
  349. to state or imply that only IBM's product, program, or service may be used. Any 
  350. functionally equivalent product, program, or service that does not infringe any 
  351. of IBM's intellectual property rights may be used instead of the IBM product, 
  352. program, or service. Evaluation and verification of operation in conjunction 
  353. with other products, programs, or services, except those expressly designated 
  354. by IBM, are the user's responsibility. 
  355.  
  356. IBM may have patents or pending patent applications covering subject matter in 
  357. this document. The furnishing of this document does not give you any license to 
  358. these patents. You can send license inquiries, in writing, to the IBM Director 
  359. of Commercial Relations, IBM Corporation, Purchase, NY 10577. 
  360.  
  361. This online information may contain coding examples of programs used in daily 
  362. business operations.  To illustrate them as completely as possible, the 
  363. examples may include the names of individuals, companies, brands, and products. 
  364. Any such names are fictitious and any similarity to the names and addresses 
  365. used by an actual business enterprise is entirely coincidental. 
  366.  
  367.  
  368. ΓòÉΓòÉΓòÉ 1.4. Trademarks and Service Marks ΓòÉΓòÉΓòÉ
  369.  
  370. The following terms, denoted by an asterisk (*) in this publication, are 
  371. trademarks or service marks of IBM* Corporation in the United States or other 
  372. countries: 
  373.  
  374. IBM 
  375. OS/2 
  376. C/C++ Tools 
  377. C Set ++ 
  378.  
  379.  
  380. ΓòÉΓòÉΓòÉ <hidden> IBM Trademark ΓòÉΓòÉΓòÉ
  381.  
  382. Trademark of the IBM Corporation. 
  383.  
  384.  
  385. ΓòÉΓòÉΓòÉ <hidden> Non-IBM Trademarks ΓòÉΓòÉΓòÉ
  386.  
  387. AT&T is a trademark of ATTrue Corporation. 
  388.  
  389.  
  390. ΓòÉΓòÉΓòÉ 2. User's Guide ΓòÉΓòÉΓòÉ
  391.  
  392. This section gives general information about the Collection Classes and defines 
  393. the terms that are used in the rest of the book. It contains the following 
  394. chapters: 
  395.  
  396. Overview of the Collection Classes Provides an overview of the Collection 
  397.                Classes and describes the different kinds of collections. 
  398. Instantiating and Using the Collection Classes Provides an overview of how you 
  399.                can instantiate and use the Collection Classes. 
  400. Element Functions and Key Functions Describes the functions that manipulate 
  401.                elements and keys. 
  402. Tailoring a Collection Implementation Describes how you can customize a 
  403.                collection implementation for your specific requirements. 
  404. Polymorphic Use of Collections Describes the polymorphic use of collection 
  405.                classes. 
  406. Exception Handling Describes the exception-handling facilities of the 
  407.                Collection Classes. Use this chapter to build exception recovery 
  408.                into your applications that use the Collection Classes. 
  409. Implementation Classes and Header Files Lists the implementation classes and 
  410.                their header files. 
  411. Tutorials      Provides information on how to use the tutorials provided with 
  412.                the Collection Classes. These tutorials are exercises that you 
  413.                can follow to learn about the Collection Classes. 
  414. Understanding the Reference Chapters Describes the format of member function 
  415.                descriptions, and the format of the Reference Manual chapters 
  416.                that describe individual abstract data types. 
  417.  
  418.  
  419. ΓòÉΓòÉΓòÉ 2.1. Introduction ΓòÉΓòÉΓòÉ
  420.  
  421. This book describes the Collection Classes, a set of C++ classes included with 
  422. C/C++ Tools, that implement commonly used abstract data types, including: 
  423.  
  424. o Sets 
  425. o Maps 
  426. o Sequences 
  427. o Relations 
  428. o Trees 
  429. o Stacks 
  430. o Bags 
  431. o Queues 
  432. o Priority queues 
  433. o Sorted collections 
  434. o Keyed collections 
  435.  
  436. The Collection Classes do not limit you to a single implementation of the above 
  437. abstract data types. For each type, you can tailor the implementation to the 
  438. specific needs of your application. 
  439.  
  440.  
  441. ΓòÉΓòÉΓòÉ 2.1.1. Who Should Use This Book ΓòÉΓòÉΓòÉ
  442.  
  443. This book is meant for programmers who are skilled in programming in the C++ 
  444. language, who understand the concept of classes, and who have experience with 
  445. using C++ templates. You should use this book if you want to use the Collection 
  446. Classes to implement data structures in your programs. 
  447.  
  448.  
  449. ΓòÉΓòÉΓòÉ 2.1.2. How to Use This Book ΓòÉΓòÉΓòÉ
  450.  
  451. Introduction tells you how to use this book, which is divided into five parts: 
  452.  
  453. o User's Guide, gives general information about the Collection Classes and 
  454.   defines the terms that are used in the rest of the book. Read this part to 
  455.   become familiar with the basic concepts of the collection classes. 
  456.  
  457. o Reference Manual - Flat Collections, describes the flat collections. Its 
  458.   first chapter, Flat Collection Member Functions, describes member functions 
  459.   that are common to all flat collections. Each subsequent chapter describes a 
  460.   particular flat collection class. 
  461.  
  462. o Reference Manual - Tree Classes, describes the tree classes. 
  463.  
  464. o Reference Manual - Auxiliary Classes, describes the auxiliary classes that 
  465.   are associated with each collection class. 
  466.  
  467. o Reference Manual - Abstract Classes, describes the abstract classes.  These 
  468.   classes define the data abstractions for which concrete implementations are 
  469.   provided. 
  470.  
  471.  
  472. ΓòÉΓòÉΓòÉ 2.1.2.1. Fonts Used in This Book ΓòÉΓòÉΓòÉ
  473.  
  474. In this book, C++ code and code fragments, and Collection Classes class and 
  475. member function names, appear in special font. Variables that are not used in 
  476. actual examples, and for which other variable names can be substituted, appear 
  477. in italics. 
  478.  
  479.  
  480. ΓòÉΓòÉΓòÉ 2.1.3. A Note About Examples ΓòÉΓòÉΓòÉ
  481.  
  482. The examples in this book explain how to use the Collection Classes. They are 
  483. coded in a simple style. They do not try to conserve storage, check for errors, 
  484. achieve fast run times, or demonstrate all possible uses of a particular class 
  485. or function. 
  486.  
  487.  
  488. ΓòÉΓòÉΓòÉ 2.1.4. Related Documentation ΓòÉΓòÉΓòÉ
  489.  
  490. You might want to refer to the following publications for additional 
  491. information: 
  492.  
  493. IBM Publications: 
  494.  
  495. IBM C/C++ Tools: C++ Language Reference, S61G-1185, describes the C++ language. 
  496.  
  497. IBM C/C++ Tools: Standard Class Library Reference, S61G-1180, describes the 
  498. Complex, I/O Stream, and Task Libraries. 
  499.  
  500. IBM C/C++ Tools: User Interface Class Library Reference, S61G-1179, describes 
  501. the C++ User Interface classes, a set of C++ classes that can be used to create 
  502. C++ applications with a graphical user interface that conforms to the Common 
  503. User Access (CUA) interface design. 
  504.  
  505. IBM C/C++ Tools: Class Libraries Reference Summary, S61G-1186, lists the member 
  506. functions of the Standard, Collection, and User Interface class libraries. For 
  507. each member function, the declaration is provided and the class the function 
  508. belongs to is indicated. 
  509.  
  510. IBM C/C++ Tools: Programming Guide, S61G-1181, describes the C++ component of 
  511. the common programming interface. 
  512.  
  513. The following is a sample of some non-IBM publications that are generally 
  514. available. It is not an exhaustive list. IBM does not specifically recommend 
  515. any of these books, and other publications may be available in your locality. 
  516.  
  517. o These books contain information about the C++ language: 
  518.  
  519.    The Annotated C++ Reference Manual by Margaret A. Ellis and Bjarne 
  520.    Stroustrup, Addison-Wesley Publishing Company. 
  521.  
  522.    The C++ Programming Language (Second Edition) by Bjarne Stroustrup, 
  523.    Addison-Wesley Publishing Company. 
  524.  
  525.    C++ Primer (Second Edition) by Stanley B. Lippman, Addison-Wesley Publishing 
  526.    Company. 
  527.  
  528. o These books contain explanations of data structures that may help you 
  529.   understand the data structures in the Collection Class Library: 
  530.  
  531.    Data Structures and Algorithms by Aho, Hopcroft and Ullman, Addison-Wesley 
  532.    Publishing Company. 
  533.  
  534.    The Art of Computer Programming, Vol.3: Sorting and Searching, D.E. Knuth, 
  535.    Addison-Wesley Publishing Company. 
  536.  
  537.    C++ Components and Algorithms by Scott Robert Ladd, M&T Publishing Inc. 
  538.  
  539.    A Systematic Catalogue of Reusable Abstract Data Types by Juergen Uhl and 
  540.    Hans Albrecht Schmid, Springer Verlag. 
  541.  
  542.  
  543. ΓòÉΓòÉΓòÉ 2.2. Overview of the Collection Classes ΓòÉΓòÉΓòÉ
  544.  
  545. A C++ collection is an abstract concept that allows you to manipulate objects 
  546. in a group. Collections are used to store and manage elements (or objects ) of 
  547. a user-defined type. Different collections have different internal structures, 
  548. and different access methods for storage and retrieval of objects. 
  549.  
  550. This chapter briefly introduces the classes that make up the Collection 
  551. Classes, and explains some of the key concepts that are used throughout this 
  552. book. 
  553.  
  554. This chapter describes the following topics: 
  555.  
  556. o Benefits of the Collection Classes 
  557. o Types of classes in the Collection Classes 
  558. o Flat collections 
  559. o Trees 
  560. o Auxiliary classes 
  561. o Overall implementation structure of the Collection Classes 
  562. o Class template naming conventions 
  563. o Linking to the Collection Class library 
  564.  
  565.  
  566. ΓòÉΓòÉΓòÉ 2.2.1. Benefits of the Collection Classes ΓòÉΓòÉΓòÉ
  567.  
  568. In addition to implementing the common abstract data types efficiently and 
  569. reliably, the Collection Classes give you the following benefits: 
  570.  
  571. o A framework of properties to help you to decide which abstract data type is 
  572.   appropriate in a given situation. 
  573. o A choice about how the abstract data type you have chosen is implemented by 
  574.   the Collection Classes. 
  575.  
  576. The Collection Classes let you choose the appropriate abstract data type for a 
  577. given situation by providing collection classes that are a complete, 
  578. systematic, and consistent combination of basic properties. These properties, 
  579. which are explained in Flat Collections, help you to select abstract data types 
  580. that are at the appropriate level of abstraction.  In a particular application, 
  581. for example, you may have the choice between using a bag and a key sorted set. 
  582. The properties of these two collections will help you to decide which one is 
  583. more appropriate. 
  584.  
  585. Once you have chosen the appropriate abstract data type, the Collection Classes 
  586. offer you a choice of implementations for it.  Each abstract data type has a 
  587. common interface with all of its possible implementations. It is easy to 
  588. replace one implementation with another for performance reasons or if the 
  589. requirements of your application change. 
  590.  
  591.  
  592. ΓòÉΓòÉΓòÉ 2.2.2. Types of Classes in the Collection Classes ΓòÉΓòÉΓòÉ
  593.  
  594. The classes that make up the Collection Classes are divided into three types: 
  595.  
  596. Flat Collections 
  597.           Flat collections include abstractions like sequence, set, bag, and 
  598.           map. Unlike trees, flat collections have no hierarchy of elements or 
  599.           recursive structure. 
  600.  
  601.           See Flat Collections for more information on flat collections and 
  602.           their properties. 
  603. Trees 
  604.           Trees are recursive collections of nodes, where each node holds an 
  605.           element and has a given number of nodes as children. 
  606.  
  607.           See Trees for more details on trees. 
  608. Auxiliary Classes 
  609.           The auxiliary classes include classes for cursors, iterators, and 
  610.           simple and managed pointers. 
  611.  
  612.           Cursors and iterators give you convenient methods for accessing the 
  613.           elements stored in the collections. See Cursors for more details on 
  614.           cursor classes.  See Iteration Using Iterators for more details on 
  615.           iterator classes. 
  616.  
  617.           The pointer classes provide the means to store in collections a 
  618.           pointer to an object instead of the object itself. The managed 
  619.           pointer class offers this object management together with automatic 
  620.           storage management. See Values and Objects and Automatic Storage 
  621.           Management for more details on pointer classes. 
  622.  
  623.  
  624. ΓòÉΓòÉΓòÉ 2.2.3. Flat Collections ΓòÉΓòÉΓòÉ
  625.  
  626. Four basic properties are used to differentiate between different flat 
  627. collections: 
  628.  
  629. Ordering 
  630.           Whether a next or previous relationship exists between elements. 
  631. Access by key 
  632.           Whether a part of the element (a key) is relevant for accessing an 
  633.           element in the collection.  When keys are used, they are compared 
  634.           using relational operators. 
  635. Equality for elements 
  636.           Whether equality is defined for the element. 
  637. Uniqueness of entries 
  638.           Whether any given element or key is unique, or whether multiple 
  639.           occurrences of the same element or key are allowed. 
  640.  
  641. Combination of Flat Collection Properties shows the flat collection that 
  642. results from each combination of properties. For example, map appears in the 
  643. unique, unordered column for the key, element equality row.  This means that a 
  644. Map is unordered, each element is unique, keys are defined, and element 
  645. equality is defined.  The figure contains NA where no flat collection 
  646. corresponds to the combination of properties.  For example, the NA in the first 
  647. two rows of the rightmost column indicates that an ordered collection that is 
  648. sequential instead of sorted and offers access by key is not available. There 
  649. are no flat collections that have all of the following properties: 
  650.  
  651. o The collection is ordered. 
  652. o The collection is sequential. 
  653. o The collection allows an element to appear more than once. 
  654. o Keys are defined for elements in the collection. 
  655.  
  656. The rationale for not implementing collections with these combinations of 
  657. properties is that there is no reason to choose them over another collection 
  658. that is already available.  Consider the case mentioned above of an ordered 
  659. collection that is sequential and offers access by key. Access by key would 
  660. only have advantages if the elements are stored in a position depending on 
  661. their key. Because they are not, there is no flat collection with key access 
  662. that maintains a sequential order. 
  663.  
  664. Combination of Flat Collection Properties 
  665.  
  666. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  667. Γöé         Γöé  Unordered   Γöé     Ordered      Γöé
  668. Γöé         Γöé         Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  669. Γöé         Γöé         Γöé   Sorted    ΓöéSequen- Γöé
  670. Γöé         Γöé         Γöé         Γöétial   Γöé
  671. Γöé         Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  672. Γöé         Γöé Unique ΓöéMultipleΓöé Unique ΓöéMultipleΓöéMultipleΓöé
  673. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  674. Γöé     ΓöéElement Γöé  Map  ΓöéRelationΓöé Sorted Γöé Sorted Γöé  NA  Γöé
  675. Γöé     ΓöéEqualityΓöé     Γöé     Γöé  Map  ΓöéRelationΓöé     Γöé
  676. Γöé  Key  ΓöéΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  677. Γöé     Γöé  No  Γöé     Γöé     Γöé  Key  Γöé  Key  Γöé     Γöé
  678. Γöé     ΓöéElement ΓöéKey Set ΓöéKey Bag Γöé Sorted Γöé Sorted Γöé  NA  Γöé
  679. Γöé     ΓöéEqualityΓöé     Γöé     Γöé  Set  Γöé  Bag  Γöé     Γöé
  680. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  681. Γöé     ΓöéElement Γöé  Set  Γöé  Bag  Γöé Sorted Γöé Sorted ΓöéEqualityΓöé
  682. Γöé     ΓöéEqualityΓöé     Γöé     Γöé  Set  Γöé  Bag  ΓöéSequenceΓöé
  683. Γöé  No   ΓöéΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  684. Γöé  Key  Γöé  No  Γöé     Γöé     Γöé     Γöé     Γöé     Γöé
  685. Γöé     ΓöéElement Γöé  NA   Γöé  Heap  Γöé  NA  Γöé  NA  ΓöéSequenceΓöé
  686. Γöé     ΓöéEqualityΓöé     Γöé     Γöé     Γöé     Γöé     Γöé
  687. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  688.  
  689.  
  690. ΓòÉΓòÉΓòÉ 2.2.3.1. Ordering of Collection Elements ΓòÉΓòÉΓòÉ
  691.  
  692. The elements of a flat collection class can be ordered in three ways: 
  693.  
  694. o Unordered collections have elements that are not ordered. 
  695. o Sorted collections have their elements sorted by an ordering relation defined 
  696.   for the element type.  For example, integers can be sorted in ascending 
  697.   order, and strings can be ordered alphabetically.  The ordering relation is 
  698.   determined by the instantiations for the collection class. 
  699. o Sequential collections have their ordering determined by an explicit 
  700.   qualifier to the add function, for example, addAtPosition. 
  701.  
  702. A particular element in a sorted collection can be accessed quickly by using 
  703. the ordering relation to determine its position. Unordered collections can also 
  704. be implemented to allow fast access to the elements, by using, for example, a 
  705. hash table or a sorted representation.  The Collection Classes provide a fast 
  706. locate function that uses this structure for unordered and sorted collections. 
  707. Even though unordered collections are often implemented by sorting the 
  708. elements, do not assume that all unordered collections are implemented in this 
  709. way. If your program requires this assumption to be true, use a sorted 
  710. collection instead. 
  711.  
  712. For each flat collection, the Collection Classes provide both unordered and 
  713. sorted abstractions.  For example, the Collection Classes support both a set 
  714. and a sorted set. The ordering property is independent of the other properties 
  715. of flat collections: you have the choice of making a given flat collection 
  716. unordered or sorted regardless of the choices that you make for the other 
  717. properties. 
  718.  
  719.  
  720. ΓòÉΓòÉΓòÉ 2.2.3.2. Access by Key ΓòÉΓòÉΓòÉ
  721.  
  722. A given flat collection can have a key defined for its elements.  A key is 
  723. usually a data member of the element but it can also be calculated from the 
  724. data members of the element by some arbitrary function. Keys let you: 
  725.  
  726. o Organize the elements in a collection 
  727. o Access a particular element in a collection 
  728.  
  729. For collections that have a key defined, an equality relation must be defined 
  730. for the key type.  Thus, a collection with a key is said to have key equality. 
  731.  
  732.  
  733. ΓòÉΓòÉΓòÉ 2.2.3.3. Equality for Keys and Elements ΓòÉΓòÉΓòÉ
  734.  
  735. A flat collection can have an equality relation defined for its elements. This 
  736. relation is based on the element as a whole, not just on one or more of its 
  737. data members (for example, the key). For two elements to be equal, all data 
  738. members of both elements must be equal. The equality relation is needed for 
  739. functions such as those that locate or remove a given element. A flat 
  740. collection that has an equality relation has element equality. 
  741.  
  742. The equality relation for keys may be different than the equality relation for 
  743. elements. Consider, for example, a task control block that has a priority and a 
  744. task identifier that defines equality for tasks.  You could choose to implement 
  745. a task collection as unordered with the task ID as key, or as sorted with the 
  746. priority as key.  In the first case, you have fast access through the task ID 
  747. but not through the priority; in the second case, you have fast access through 
  748. the priority but not through the task ID.  The ordering relation on the 
  749. priority key in the second case does not yield a task equality, because two 
  750. tasks can have equal priorities without being the same. 
  751.  
  752. Functions like locateElementWithKey (see Flat Collection Member Functions) use 
  753. the equality relation on keys to locate elements within a collection. A 
  754. collection that defines key equality may also define element equality. 
  755. Functions that are based on equality (such as locate) are only provided for 
  756. collections that define element equality.  Collections that define neither key 
  757. equality nor element equality, such as heaps and sequences, provide no 
  758. functions for locating elements by their values or testing for containment. 
  759. Elements can be added and retrieved from such collections by iteration.  For 
  760. sequences, elements can also be added and retrieved by position. 
  761.  
  762. A sorted collection must define either key equality or element equality. A 
  763. sorted collection that does not have a key defined must have an ordering 
  764. relation defined for the element type.  This relation implicitly defines 
  765. element equality. 
  766.  
  767. Keys can be used to access a particular element in a collection. The 
  768. alternative to defining equality of elements as equality of their keys (in the 
  769. task control block example: defining task equality as equality of the task ID) 
  770. and then locating collection entries by providing an equal element, causes 
  771. performance problems when the element is large or difficult to construct 
  772. compared to the key alone. Consider the two alternatives in the following 
  773. example. Note that the Task type defined in these examples is not related to 
  774. the Task Library described in the Standard Class Library Reference. 
  775.  
  776.   // First solution
  777.   TaskId const& key (Task const& t) {return t.id;}
  778.   KeySet < Task, int > tasks;
  779.   // ...
  780.   tasks.locateElementWithKey (1);
  781.   // Second solution
  782.   Boolean operator== (Task const& t1, Task const& t2)
  783.   {return t1.id == t2.id;}
  784.   Set < Task > tasks;
  785.   // ...
  786.   Task t1;
  787.   t1.id = 1;
  788.   tasks.locate (t1);
  789.  
  790. The first solution is superior, if task construction (Task t1) requires a 
  791. significant proportion of the total system resources used by the program. 
  792.  
  793. The Collection Classes provide sorted and unsorted versions of maps and 
  794. relations, for which both key and element equality must be defined. These 
  795. collections are similar to key set and key bag, except that they define 
  796. functions based on element equality, namely union and intersection. The add 
  797. function behaves differently toward maps and relations than towards key set and 
  798. key bag. 
  799.  
  800.  
  801. ΓòÉΓòÉΓòÉ 2.2.3.4. Uniqueness of Entries ΓòÉΓòÉΓòÉ
  802.  
  803. The terms unique and multiple relate to the key, in the case of collections 
  804. with a key. For collections with no key, unique and multiple relate to the 
  805. element. 
  806.  
  807. In some flat collections, such as map, key set, and set, no two elements are 
  808. the same or have the same key. Such collections are called unique collections. 
  809. Other collections, including relation, key bag, bag, and heap, can have two 
  810. equal elements or elements with the same key.  Such collections are called 
  811. multiple collections. 
  812.  
  813. For those multiple collections with key that have an element equality (relation 
  814. and sorted relation), elements are always unique while keys can occur multiple 
  815. times. In other words, if element equality is defined for a multiple collection 
  816. with key, element equality is tested for before inserting a new element. 
  817.  
  818. A unique collection with no keys and no element equality is not provided 
  819. because a containment function cannot be defined for such a collection. A 
  820. containment function determines whether a collection contains a given element. 
  821.  
  822. The behavior during element insertion (add, ...) distinguishes unique and 
  823. multiple collections. In unique collections, the add function does not add an 
  824. element that is equal to an element that is already in the collection. In 
  825. multiple collections, the add function does add the elements. 
  826.  
  827. The add function has two general properties: 
  828.  
  829. o All elements that are contained in the collection before an element is added 
  830.   are still contained in the collection after the element is added. 
  831. o The element that is added will be contained in the collection after it is 
  832.   added. 
  833.  
  834. Operations that contradict these properties are not valid.  You cannot add an 
  835. element to a map or sorted map that has the same key as an element that is 
  836. already contained in the collection, but is not equal to this element (as a 
  837. whole).  In the case of a map and sorted map, an exception is thrown.  Note 
  838. that both map and sorted map are unique collections. The functions 
  839. locateOrAddElementWithKey and addOrReplaceElementWithKey specify what happens 
  840. if you try to add an element to a collection that already contains an element 
  841. with the same key. 
  842.  
  843. Behavior of add for Unique and Multiple Collections shows the result of adding 
  844. a series of four elements to a map, a relation, a key set, and a key bag. The 
  845. first row shows what each collection looks like after the element <a,1> is 
  846. added to each collection.  Each following row shows what the collections look 
  847. like after the element in the leftmost column is added to each. 
  848.  
  849. The elements are pairs of a character and an integer. The character in the pair 
  850. is the key.  An element equality relation, if defined, holds between two 
  851. elements if both the character and the integer in each pair are equal. 
  852.  
  853. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  854. Γöé      ΓöéMap or   ΓöéRelation orΓöéKey Set or ΓöéKey Bag orΓöé
  855. Γöé  add   ΓöéSorted Map ΓöéSorted   ΓöéKey Sorted ΓöéKey SortedΓöé
  856. Γöé      Γöé      ΓöéRelation  ΓöéSet     ΓöéBag    Γöé
  857. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  858. Γöé  <a,1>  Γöé  <a,1>   Γöé  <a,1>   Γöé  <a,1>   Γöé  <a,1>  Γöé
  859. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  860. Γöé  <b,1>  Γöé  <a,1>,  Γöé  <a,1>,  Γöé  <a,1>,  Γöé  <a,1>,  Γöé
  861. Γöé      Γöé  <b,1>   Γöé  <b,1>   Γöé  <b,1>   Γöé  <b,1>  Γöé
  862. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  863. Γöé  <a,1>  Γöé  <a,1>,  Γöé  <a,1>,  Γöé  <a,1>,  Γöé  <a,1>,  Γöé
  864. Γöé      Γöé  <b,1>   Γöé  <b,1>   Γöé  <b,1>   Γöé  <b,1>,  Γöé
  865. Γöé      Γöé      Γöé      Γöé      Γöé  <a,1>  Γöé
  866. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  867. Γöé  <a,2>  ΓöéException: Γöé  <a,1>,  Γöé  <a,1>,  Γöé  <a,1>,  Γöé
  868. Γöé      ΓöéKeyAlready-Γöé  <b,1>,  Γöé  <b,1>   Γöé  <b,1>,  Γöé
  869. Γöé      ΓöéExists   Γöé  <a,2>   Γöé      Γöé  <a,1>,  Γöé
  870. Γöé      Γöé      Γöé      Γöé      Γöé  <a,2>  Γöé
  871. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  872.  
  873. Behavior of add for Unique and Multiple Collections 
  874.  
  875.  
  876. ΓòÉΓòÉΓòÉ 2.2.4. Restricted Access ΓòÉΓòÉΓòÉ
  877.  
  878. Flat collections with restricted access have a restricted set of functions that 
  879. can be applied to them, that is, only a subset of the functions listed in Flat 
  880. Collection Functions can be applied. Examples of such flat collections are 
  881. stack and priority queue. 
  882.  
  883. You may want to restrict the set of functions for reasons such as: 
  884.  
  885.  1. You can simplify the interface to the collection. 
  886.  2. The normal rules for restricted flat collections apply, so certain 
  887.     assumptions can be made when validating and inspecting the code. A stack, 
  888.     for example, does not allow the removal of any element except the top one. 
  889.  3. You can create new implementation options. 
  890.  
  891. The Collection Classes provide the following flat collections with restricted 
  892. access: 
  893.  
  894. o Stack, deque, and queue, which are all based on sequence 
  895. o Priority queue, which is based on key sorted bag 
  896. See Reference Manual - Flat Collections for descriptions of collections with 
  897. restricted access. These descriptions are alphabetically merged with 
  898. descriptions for other collections. You can use Properties for Collections with 
  899. Restricted Access to select the appropriate flat collection with restricted 
  900. access for a given set of properties. 
  901.  
  902. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  903. Γöé      Properties for Collections with Restricted Access          Γöé
  904. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  905. Γöé ADD      Γöé REMOVE     Γöé SORTED (WITH KEY)   Γöé UNSORTED (NO KEY)   Γöé
  906. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  907. Γöé According to  Γöé First     Γöé Priority queue     Γöé N/A          Γöé
  908. Γöé key      Γöé        Γöé            Γöé            Γöé
  909. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  910. Γöé Last      Γöé Last      Γöé N/A          Γöé Stack         Γöé
  911. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  912. Γöé Last      Γöé First     Γöé N/A          Γöé Queue         Γöé
  913. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  914. Γöé First or last Γöé First or last Γöé N/A          Γöé Deque         Γöé
  915. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  916.  
  917.  
  918. ΓòÉΓòÉΓòÉ 2.2.5. Trees ΓòÉΓòÉΓòÉ
  919.  
  920. Trees can be described either as structures where the elements have a hierarchy 
  921. or as a special form of recursive structures.  Recursively a tree can be 
  922. described as a node (parent) with pointers to other nodes (children).  Every 
  923. node has a fixed number of pointers, which are set to null at initialization 
  924. time.  Insertion of a new node involves setting a pointer in the parent so that 
  925. it points to the inserted child. The Structure of N-ary Trees illustrates the 
  926. structure of an n-ary tree. 
  927.  
  928. The Structure of N-ary Trees 
  929.  
  930. Similarly, you can obtain tree-like or recursive structures by implementing the 
  931. array of children of a node as a flat collection of nodes. This will give you 
  932. different functionality for the children, for example the ability to locate a 
  933. child with a given value. 
  934.  
  935.  
  936. ΓòÉΓòÉΓòÉ 2.2.6. Auxiliary Classes ΓòÉΓòÉΓòÉ
  937.  
  938. To use the collection classes, you also need a cursor and an iterator class. 
  939. These are described in Cursors and Iteration Using Iterators. 
  940.  
  941. The Pointer and Managed Pointer Classes allow you to manage objects, and they 
  942. enable automatic storage management. Values and Objects and Automatic Storage 
  943. Management explain the concepts and usage in detail. 
  944.  
  945.  
  946. ΓòÉΓòÉΓòÉ 2.2.7. The Overall Implementation Structure ΓòÉΓòÉΓòÉ
  947.  
  948. To achieve maximum runtime efficiency and ease of use, the Collection Classes 
  949. combine the common features of object-oriented techniques, such as class 
  950. hierarchies, polymorphism and late binding, with an efficient class structure 
  951. that uses advanced optimization techniques. This section gives a brief overview 
  952. of the library structure that is shown in Overall Library Structure.  A more 
  953. detailed explanation of the particular concepts is found in subsequent 
  954. sections. 
  955.  
  956. You need not understand the entire implementation structure to begin using the 
  957. collections in their basic forms. The following is a list of the implementation 
  958. strategies offered by the Collection Classes, in order of increasing 
  959. complexity: 
  960.  
  961. Use the defaults 
  962.           Default implementations are provided for every collection. If you do 
  963.           not want to be concerned with choosing an implementation for an 
  964.           abstract data type, you can use the default classes provided by the 
  965.           Collection Classes. In chapters on particular collections, the 
  966.           default implementation is the first implementation in the "Class 
  967.           Implementation Variants" table for that chapter, if a table is 
  968.           present.  If no table is present, the default implementation is 
  969.           stated in the chapter's "Class Implementation Variants" section. 
  970. Use variants 
  971.           If you want to choose a particular implementation variant for a 
  972.           collection, you can use variant classes to replace the default 
  973.           implementation.  See Tailoring a Collection Implementation for 
  974.           details on how to use the variant classes. 
  975. Use polymorphism 
  976.           If you want to have a more generalized collection class than those 
  977.           offered by the concrete classes, you can take advantage of 
  978.           polymorphism. For example, when working with a set, instead of using 
  979.           the concrete class ISetOnAVLKeySortedSet, you can use the abstract 
  980.           class IASet or, for more generic behavior, the abstract class 
  981.           IAEqualityCollection. Abstract classes, which are accessed using 
  982.           reference classes let you program to a more generalized interface, 
  983.           without necessarily knowing what abstract data types (collections), 
  984.           your code will operate on. You can leave the implementation details 
  985.           for later. 
  986.  
  987. The following figure illustrates the relationships between the categories of 
  988. classes for the collection set. Each class falls within one of five categories: 
  989. default, concrete, typeless implementation, abstract, and reference classes. 
  990. Arrows indicate a relationship between classes.  Text beside each arrow 
  991. indicates the relationship between the two classes. The relationships are: 
  992.  
  993. o Based on 
  994. o Partially instantiates 
  995. o Is a 
  996. o Uses 
  997.  
  998. In this figure, you will notice certain naming conventions. For information on 
  999. naming conventions, see Class Template Naming Conventions. 
  1000.  
  1001. Overall Library Structure 
  1002.  
  1003. The following sections describe the categories of classes in the Collection 
  1004. Classes. 
  1005.  
  1006.  
  1007. ΓòÉΓòÉΓòÉ 2.2.7.1. Default Classes ΓòÉΓòÉΓòÉ
  1008.  
  1009. The default classes provide the easiest way to use the collection classes.  Two 
  1010. default classes are provided for each abstract data type: 
  1011.  
  1012. o A class that is instantiated only with the element type, and possibly the key 
  1013.   type. ISet is an example of this type of default class. 
  1014. o A class that takes element-specific functions. IGSet is an example of this 
  1015.   type of default class. See Using Element Operation Classes for information on 
  1016.   element-specific functions. 
  1017.  
  1018.  
  1019. ΓòÉΓòÉΓòÉ 2.2.7.2. Abstract Classes ΓòÉΓòÉΓòÉ
  1020.  
  1021. The classes in the Collection Classes are all related through the hierarchy of 
  1022. abstract classes shown in The Abstract Class Hierarchy. The leaves of the 
  1023. abstract class hierarchy (that is, those classes that have no derived classes 
  1024. within abstract class hierarchy tree) define the collection for which concrete 
  1025. implementations are provided. The arrows in the figure represent an is a 
  1026. relationship.  For example, a set is an equality collection which is a 
  1027. collection. The library names of abstract classes start with IA. 
  1028.  
  1029. Note:  The Abstract Class Hierarchy does not show the N-ary Tree class nor the 
  1030. flat collections with restricted access because thess classes are not derived 
  1031. from the abstract class IACollection. 
  1032.  
  1033. The Abstract Class Hierarchy 
  1034.  
  1035.  
  1036. ΓòÉΓòÉΓòÉ 2.2.8. Class Template Naming Conventions ΓòÉΓòÉΓòÉ
  1037.  
  1038. All class templates begin with an uppercase I. Class template naming 
  1039. conventions shows the naming conventions used to distinguish between different 
  1040. types of class templates, given a default class template of ISet. Underscored 
  1041. letters in each class template name are those that indicate the stated 
  1042. convention: 
  1043.  
  1044. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1045. Γöé CLASS NAME     Γöé MEANING OF LETTERS                Γöé
  1046. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1047. Γöé "ISet"       Γöé Default class template              Γöé
  1048. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1049. Γöé "IGSet"       Γöé Default generic class template.  The element   Γöé
  1050. Γöé           Γöé operations class can be specified as template   Γöé
  1051. Γöé           Γöé argument.                     Γöé
  1052. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1053. Γöé ISetOn...      Γöé Variant class template              Γöé
  1054. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1055. Γöé IWSetOn...     Γöé Typed implementation based on another typed    Γöé
  1056. Γöé           Γöé implementation.  You can think of the "W" as a  Γöé
  1057. Γöé           Γöé shorthand for "wrapping another implementation  Γöé
  1058. Γöé           Γöé with a new interface."              Γöé
  1059. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1060. Γöé IASet        Γöé Abstract class template              Γöé
  1061. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1062. Γöé IRSet        Γöé Reference class template             Γöé
  1063. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1064. Table 2. Class template naming conventions
  1065.  
  1066.  
  1067. ΓòÉΓòÉΓòÉ 2.2.8.1. Concrete Classes ΓòÉΓòÉΓòÉ
  1068.  
  1069. Each abstract data type can be instantiated by one of several concrete classes. 
  1070. Sets, for example, may be implemented as key sorted sets or as hash tables. 
  1071. Key sorted sets may be implemented as sequences. Concrete classes are grouped 
  1072. according to the abstract data type that they implement.  All of the concrete 
  1073. classes for an abstract data type have the same interface. This guide refers to 
  1074. the concrete class templates that are not default class template as variant 
  1075. class templates. 
  1076.  
  1077.  
  1078. ΓòÉΓòÉΓòÉ 2.2.8.2. Reference Classes ΓòÉΓòÉΓòÉ
  1079.  
  1080. To avoid the overhead of virtual function calls, the Collection Classes do not 
  1081. allow concrete classes to be derived directly from abstract classes. The 
  1082. compiler can usually optimize function calls when it knows the exact type of 
  1083. the object, but because collections are mostly passed by reference, such an 
  1084. optimization is not possible with the collection classes. If you do not want to 
  1085. take advantage of polymorphism, you do not have to deal with the overhead of 
  1086. virtual function calls. 
  1087.  
  1088. Abstract and concrete classes are linked through reference classes. These 
  1089. classes are derived from the abstract classes, and implement the member 
  1090. functions using one of the corresponding concrete classes. Names of reference 
  1091. classes start with IR. See Polymorphic Use of Collections for more details on 
  1092. the use of polymorphism in the Collection Classes. 
  1093.  
  1094.  
  1095. ΓòÉΓòÉΓòÉ 2.2.8.3. Typed and Typeless Implementation Classes ΓòÉΓòÉΓòÉ
  1096.  
  1097. Typed implementation classes implement the concrete classes. They provide an 
  1098. interface that is specific to a given element type; this type-interface enables 
  1099. the C++ compiler to verify, for example, that an integer cannot be added to a 
  1100. set of strings. 
  1101.  
  1102. Typed implementation classes may be basic or based on another implementation. 
  1103. Basic classes have names that start with I or IG. Based-on classes have names 
  1104. that start with IW. For further details see The Based-On Concept. 
  1105.  
  1106. Typeless implementation classes are used for handling the problem of 
  1107. unnecessary code expansion.  Giving member functions a return type of void* is 
  1108. a simple way to avoid this problem. The collection classes, however, use 
  1109. functions that return specific types.  The implementation classes provide an 
  1110. untyped (void*) interface that the concrete class implementations use. 
  1111. Programmers never use the implementation classes directly. 
  1112.  
  1113.  
  1114. ΓòÉΓòÉΓòÉ 2.2.9. Linking to the Collection Class Library ΓòÉΓòÉΓòÉ
  1115.  
  1116. You must specify the following library names when compiling or linking programs 
  1117. that use the Collection Class Library: 
  1118.  
  1119. o DDE4CC.LIB - for static linking 
  1120. o DDE4CCI.LIB - for dynamic linking. 
  1121.  
  1122.  
  1123. ΓòÉΓòÉΓòÉ 2.3. Instantiating and Using the Collection Classes ΓòÉΓòÉΓòÉ
  1124.  
  1125. This chapter describes how to instantiate and use collection classes. The 
  1126. following topics are described in this chapter: 
  1127.  
  1128. o Instantiation and object definition 
  1129. o Bounded and unbounded collections 
  1130. o Adding, removing, and replacing elements 
  1131. o Cursors 
  1132. o Iterating over collections 
  1133. o Copying and referencing collections 
  1134.  
  1135. To use a collection class, you normally follow these three steps: 
  1136.  
  1137.  1. Instantiate a collection class template and provide arguments for the 
  1138.     formal template arguments 
  1139.  
  1140.  2. Define one or more objects of this instantiated class, possibly providing 
  1141.     constructor arguments 
  1142.  
  1143.  3. Apply functions to these objects. 
  1144.  
  1145.  
  1146. ΓòÉΓòÉΓòÉ 2.3.1. Instantiation and Object Definition ΓòÉΓòÉΓòÉ
  1147.  
  1148. This section describes instantiation for the default implementation. For a 
  1149. given class, such as ISet, and a given element type, such as Task, the 
  1150. instantiation for a new class that represents sets of tasks could look like 
  1151. this: 
  1152.  
  1153.    class Task { /* ... */ };
  1154.    typedef ISet < Task > TaskSet;
  1155.  
  1156. The instantiation could also look like this: 
  1157.  
  1158.    class TaskSet : public ISet < Task > {
  1159.    public:
  1160.       TaskSet (INumber n = 100) : ISet < Task > (n) {}
  1161.    }
  1162.  
  1163. The second form defines a new class called TaskSet that has a constructor that 
  1164. takes a single argument. The definition of the constructor is necessary if 
  1165. TaskSets with different estimates for the number of elements will be created. 
  1166. C++ language rules determine that TaskSet does not inherit the constructor of 
  1167. ISet < Task >. 
  1168.  
  1169. You can now define TaskSet objects toBeDone, pending, and delayed as follows: 
  1170.  
  1171.    TaskSet toBeDone, pending, delayed;
  1172.  
  1173. You can also define the objects without introducing a new type name (TaskSet): 
  1174.  
  1175.    ISet < Task > toBeDone, pending, delayed;
  1176.  
  1177. However, you should begin by explicitly defining a named class, such as 
  1178. TaskSet, that uses the default implementation. It is then easier to replace the 
  1179. default implementation with a better implementation later on. See Tailoring a 
  1180. Collection Implementation for more details on replacing default 
  1181. implementations. 
  1182.  
  1183. Note:  The Task element type used in the above example is not related to the 
  1184. C++ Task Library described in Standard Class Library Reference. 
  1185.  
  1186.  
  1187. ΓòÉΓòÉΓòÉ 2.3.2. Bounded and Unbounded Collections ΓòÉΓòÉΓòÉ
  1188.  
  1189. A bounded collection limits the number of elements it can contain. There are no 
  1190. bounded collections in the Collection Class Library. The concept of bounded 
  1191. collections is provided so that you can create your own bounded collection 
  1192. implementations. 
  1193.  
  1194. When a bounded collection contains the maximum number of elements (its bound), 
  1195. the collection is said to be full. This condition can be tested by the function 
  1196. isFull. If elements are added to a full collection, the exception 
  1197. IFullException is thrown.  This behavior is useful for collections that are to 
  1198. have their storage allocated completely on the runtime stack. 
  1199.  
  1200. You can determine the maximum number of elements in a bounded collection by 
  1201. calling the function maxNumberOfElements. You can only call this function if 
  1202. the collection is bounded. You can determine whether a collection is bounded by 
  1203. calling the function isBounded. 
  1204.  
  1205. In the current implementation of the Collection Class Library, all collections 
  1206. are unbounded. The functions isBounded and isFull always return False. The 
  1207. function maxNumberOfElements throws the exception INotBoundedException. 
  1208.  
  1209.  
  1210. ΓòÉΓòÉΓòÉ 2.3.3. Adding, Removing, and Replacing Elements ΓòÉΓòÉΓòÉ
  1211.  
  1212. You can perform three operations to modify a collection: 
  1213.  
  1214. o Adding elements.  Use the add function and its variants. 
  1215. o Removing elements.  Use the remove function and its variants. 
  1216. o Replacing elements.  Use the replace function and its variants. 
  1217.  
  1218.  
  1219. ΓòÉΓòÉΓòÉ 2.3.3.1. Adding Elements ΓòÉΓòÉΓòÉ
  1220.  
  1221. The function add places the element identified by its argument into the 
  1222. collection. add behaves differently depending on the properties of the 
  1223. collection: 
  1224.  
  1225. o In unique collections, an element is not added if it is already contained in 
  1226.   the collection. 
  1227. o In sorted collections, an element is added according to the ordering relation 
  1228.   of the collection. 
  1229. o In sequential collections, an element is added to the end of the collection. 
  1230.  
  1231. In general, you can copy one collection to another collection that is initially 
  1232. empty by iterating through the elements of the first collection and calling add 
  1233. with each element as an argument. In particular, for a sequential collection, 
  1234. add must add the element last, because iteration iterates from the first toward 
  1235. the last element. 
  1236.  
  1237. For sequential collections, elements can be added at a given position using add 
  1238. functions other than add, such as addAtPosition, addAsFirst, and addAsNext. 
  1239. Elements after and including the given position are shifted. Positions can be 
  1240. specified by a number, where counting starts with 1 for the first element, by 
  1241. using the addAtPosition function. Positions can also be specified relative to 
  1242. another element by using the addAsNext or addAsPrevious functions, or relative 
  1243. to the collection as a whole by using the addAsFirst or addAsLast functions. 
  1244.  
  1245.  
  1246. ΓòÉΓòÉΓòÉ 2.3.3.2. Removing Elements ΓòÉΓòÉΓòÉ
  1247.  
  1248. In the Collection Classes, you can remove an element that is pointed to by a 
  1249. given cursor, by using the removeAt function. All other removal functions 
  1250. operate on the model of first generating a cursor that refers to the desired 
  1251. position and then removing the element to which the cursor refers. There is an 
  1252. important difference between element values and element occurrences. An element 
  1253. value may, for nonunique collections, occur more than once. The basic remove 
  1254. function always removes only one occurrence of an element. 
  1255.  
  1256. For collections with keys or element equality, removal functions remove one or 
  1257. all occurrences of a given key or element. These functions include remove, 
  1258. removeElementWithKey, removeAllOccurrences, and removeAllElementsWithKey. 
  1259. Ordered collections provide functions for removing an element at a given 
  1260. numbered position. Ordered collections also allow you to remove the first or 
  1261. last elements of a collection using the removeFirst or removeLast functions. 
  1262.  
  1263. After an element has been added or removed, all cursors of the collection 
  1264. become undefined. Therefore, removing all elements with a given property from a 
  1265. collection cannot be done efficiently using cursors. After you have removed one 
  1266. element with the property, the entire collection would have to be searched for 
  1267. the next element with the property.  If you want to remove all of the elements 
  1268. in a collection that have a given property, you should use the function 
  1269. removeAll and provide a predicate function as its argument. This predicate 
  1270. function has an element as argument and returns a Boolean value.  The Boolean 
  1271. result tells whether the element will be removed. 
  1272.  
  1273. Sometimes you may want to pass more information to the predicate function.  You 
  1274. can use an additional argument of type void*.  The pointer then can be used to 
  1275. access a structure containing further information. 
  1276.  
  1277. The following example removes all even elements from an integer collection: 
  1278.  
  1279.   Boolean isEven (int const& i, void*)
  1280.   { return i % 2 == 0;
  1281.   }
  1282.   // ...
  1283.     intSet.removeAll (isEven);
  1284.  
  1285. In the above example function isEven, the additional argument of type void* was 
  1286. not used.  See the last example under Iteration Using Iterators for information 
  1287. on how to use the additional argument. 
  1288.  
  1289.  
  1290. ΓòÉΓòÉΓòÉ 2.3.3.3. Replacing Elements ΓòÉΓòÉΓòÉ
  1291.  
  1292. It is possible to modify collections by replacing the value of an element 
  1293. occurrence. Adding and removing elements usually changes the internal structure 
  1294. of the collection.  Replacing an element leaves the internal structure 
  1295. unchanged.  If an element of a collection is replaced, the cursors in the 
  1296. collection do not become undefined. 
  1297.  
  1298. For collections that are organized according to element properties, such as an 
  1299. ordering relation or a hash function, the replace function must not change this 
  1300. element property. For key collections, the new key must be equal to the key 
  1301. that is replaced. For nonkey collections with element equality, the new element 
  1302. must be equal to the old element as defined by the element equality relation. 
  1303. The key or element value that must be preserved is called the positioning 
  1304. property of the element in the given collection type. 
  1305.  
  1306. Sequential collections and heaps do not have a positioning property. Element 
  1307. values in sequences and heaps can be changed freely. Replacing element values 
  1308. involves copying the whole value. If only a small part of the element is to be 
  1309. changed, it is more efficient to use the elementAt access function described in 
  1310. Using Cursors for Locating and Accessing Elements. The replaceAt function 
  1311. checks the validity of the positioning property as a precondition. (See 
  1312. Exception Handling for more details on preconditions.) When you use the 
  1313. elementAt function to replace part of the element value, this check is not 
  1314. performed. 
  1315.  
  1316.  
  1317. ΓòÉΓòÉΓòÉ 2.3.4. Cursors ΓòÉΓòÉΓòÉ
  1318.  
  1319. A cursor is a reference to an element in a collection. If the position of the 
  1320. element changes, the cursor is invalidated. This occurs because the cursor 
  1321. refers only to the position of the element and not to the element itself. 
  1322.  
  1323. A cursor is always associated with a collection. The collection is specified 
  1324. when the cursor is created, and cannot be changed. Each collection function 
  1325. that takes a cursor argument has a precondition that the cursor actually belong 
  1326. to the collection. Simple functions, such as advancing the cursor, are also 
  1327. functions of the cursor itself. For example: 
  1328.  
  1329. Set::Cursor cursor(collection);
  1330. cursor.setToNext();
  1331.  
  1332. is the same as: 
  1333.  
  1334. collection.setToNext(cursor);
  1335.  
  1336. Cursors and iteration by cursors can be used with any collection. With cursors 
  1337. the Collection Classes provide: 
  1338.  
  1339. o An iteration scheme that is simpler than using iterators. (see Iteration 
  1340.   Using Iterators.) 
  1341. o The ability to define functions that return cursors. Such functions can give 
  1342.   you fast access to an element if it exists, or indicate the non-existence of 
  1343.   an element by returning an invalid cursor. 
  1344.  
  1345.  
  1346. ΓòÉΓòÉΓòÉ 2.3.4.1. Cursors in Linked and Tabular Implementations ΓòÉΓòÉΓòÉ
  1347.  
  1348. Cursors are only temporarily defined.  As soon as elements are added to or 
  1349. removed from the collection, existing cursors become undefined. This leads to 
  1350. one of the three following situations: 
  1351.  
  1352.  1. The cursor is invalidated (isValid will return False). 
  1353.  2. The cursor remains valid and points to an element of the collection; 
  1354.     however, it may point to a different element than before. 
  1355.  3. The cursor remains valid but no longer points to an element of the 
  1356.     collection. 
  1357.  
  1358. Do not use an undefined cursor as an argument to a function that requires that 
  1359. the cursor point to an element of the collection. 
  1360.  
  1361. Cursors can be implemented as C++ pointers (to nodes that carry the elements) 
  1362. in linked implementations or as indices to an array in tabular implementations. 
  1363. A linked implementation is accessed using pointer chains, while a tabular 
  1364. implementation is accessed using indices into arrays. 
  1365.  
  1366. If an element is added or removed from a collection that has a tabular 
  1367. implementation, the other elements may be shifted.  A cursor that is defined 
  1368. for this collection may no longer refer to the same element after elements have 
  1369. been shifted. For this reason, if you want to be able to choose between a 
  1370. linked or tabular implementation for a particular collection, you should not 
  1371. use a cursor after elements have been added to or removed from the collection. 
  1372.  
  1373. One of the properties of linked implementations is that elements are not 
  1374. shifted. If you exploit this property, the cursors might still be used. You 
  1375. should document the decision to use a linked implementation so that: 
  1376.  
  1377. o All those who use the collection class know whether the implementation is 
  1378.   linked. 
  1379.  
  1380. o All those who tailor the collection class only choose appropriate 
  1381.   implementations.  See Tailoring a Collection Implementation for more details 
  1382.   on tailoring. 
  1383.  
  1384.  
  1385. ΓòÉΓòÉΓòÉ 2.3.4.2. Cursor Implementations ΓòÉΓòÉΓòÉ
  1386.  
  1387. Different collection implementations use different cursor classes. For example: 
  1388.  
  1389. o Linked implementations use pointers to nodes. 
  1390. o Array implementations use numeric indices. 
  1391. o Hash tables use an index into the hash table and a pointer to the node in the 
  1392.   collision list. 
  1393. o Bags use the key set cursor and a count for equal elements. 
  1394.  
  1395. Each concrete collection class, such as ISet<int>, has an inner definition of a 
  1396. class Cursor that can be accessed as ISet<int>::Cursor. 
  1397.  
  1398. Because abstract classes also declare functions on cursors, there is a base 
  1399. class ICursor for these specific cursor classes. To allow the creation of 
  1400. specific cursors for all kinds of collections, every abstract class has a 
  1401. virtual member function newCursor. newCursor creates an appropriate cursor for 
  1402. the given collection object. 
  1403.  
  1404.  
  1405. ΓòÉΓòÉΓòÉ 2.3.4.3. Using Cursors for Locating and Accessing Elements ΓòÉΓòÉΓòÉ
  1406.  
  1407. Cursors provide a basic mechanism for accessing elements of objects of 
  1408. collection classes. All other access mechanisms begin with finding an 
  1409. appropriate cursor and then accessing the element using this cursor. The member 
  1410. function elementAt lets you access an element using a cursor. 
  1411.  
  1412. elementAt returns a reference to an element, thereby avoiding copying the 
  1413. elements. Suppose that an element had a size of 20 KBytes and you want to 
  1414. access a 2-byte data member of that element.  If you use elementAt to return a 
  1415. reference to this element, you avoid having to copy the entire element to a 
  1416. local variable. 
  1417.  
  1418. There are several other functions, such as firstElement or elementWithKey that 
  1419. return a reference to an element. They can be thought of as first executing a 
  1420. corresponding cursor function, such as setToFirst or locateElementWithKey, and 
  1421. then accessing the element using the cursor. 
  1422.  
  1423. You must determine if the element exists before accessing it. If its existence 
  1424. is not known from the context, it must first be checked. To save the extra 
  1425. effort of locating the desired element twice (once for checking whether it 
  1426. exists and then for actually retrieving its reference), use the cursor that is 
  1427. returned by the locate function for fast element access: 
  1428.  
  1429.   if (locateElementWithKey (key, cursor)) {
  1430.     // ...
  1431.     elementAt (cursor);
  1432.     // ...
  1433.     }
  1434.  
  1435. The elementAt function can also be used to replace the value of the referenced 
  1436. element.  You must ensure that the positioning property of the element is not 
  1437. changed with respect to the given collection.  See Adding, Removing, and 
  1438. Replacing Elements for more details. 
  1439.  
  1440. There are two versions of elementAt: 
  1441.  
  1442.       Element const& elementAt (ICursor const&) const;
  1443.       Element&       elementAt (ICursor const&);
  1444.  
  1445. The first version of elementAt guarantees that no elements in the collection 
  1446. can be changed by this function. 
  1447.  
  1448.  
  1449. ΓòÉΓòÉΓòÉ 2.3.5. Iterating over Collections ΓòÉΓòÉΓòÉ
  1450.  
  1451. Iterating over all or some elements of a collection is a common operation. The 
  1452. Collection Classes provide two methods of iteration: 
  1453.  
  1454. o By cursors 
  1455. o By iterators or iteration functions 
  1456.  
  1457. Ordered (including sorted) collections have a well-defined ordering of their 
  1458. elements, while unordered collections have no defined order in which the 
  1459. elements are visited in an iteration. However, each element is visited exactly 
  1460. once. 
  1461.  
  1462. You cannot add or remove elements from a collection while you are iterating 
  1463. over a collection, or all elements may not be visited once. You cannot use any 
  1464. of the iterations described in this section if you want to remove all of the 
  1465. elements of a collection that have a certain property. Use the function 
  1466. removeAll (described in Flat Collection Member Functions), using a predicate 
  1467. function as argument. See Removing Elements for details on removing elements. 
  1468.  
  1469.  
  1470. ΓòÉΓòÉΓòÉ 2.3.5.1. Iteration Using Cursors ΓòÉΓòÉΓòÉ
  1471.  
  1472. Cursor iteration can be done with a for loop.  Consider the following example: 
  1473.  
  1474.   ISet<int> collection;
  1475.   ISet<int>::Cursor current (collection);
  1476.   for (current.setToFirst (); current.isValid ();
  1477.        current.setToNext ())
  1478.   {
  1479.   // ...
  1480.   collection.elementAt (current) ;
  1481.   // ...
  1482.   }
  1483. ISet<int>::Cursor is the class Cursor that is defined within the class 
  1484. ISet<int>. This is referred to as a nested class. current is the name of the 
  1485. cursor object.  Its constructor takes collection as argument. 
  1486.  
  1487. The Collection Classes define a macro forCursor that lets you write a cursor 
  1488. iteration even more elegantly: 
  1489.  
  1490. #define forCursor(c)         \
  1491.      for ((c).setToFirst();  \
  1492.           (c).isValid();     \
  1493.           (c).setToNext())
  1494.  
  1495.   // collection and current are the same as before.
  1496.  
  1497.   forCursor(current)
  1498.   {
  1499.   // ...
  1500.   collection.elementAt (current)
  1501.   // ...
  1502.   }
  1503.  
  1504. If the element is used read-only, a function of the cursor can be used instead 
  1505. of elementAt(current): 
  1506.  
  1507.   // collection and current are the same as before.
  1508.   // current's construction associated it to collection.
  1509.  
  1510.   forCursor(current)
  1511.   {
  1512.   // ...
  1513.   current.element ()
  1514.   //...
  1515.   }
  1516.  
  1517. Note:  You should remove multiple elements from a collection using the 
  1518. removeAll function, with a predicate function as an argument.  See Adding, 
  1519. Removing, and Replacing Elements for further details. 
  1520.  
  1521.  
  1522. ΓòÉΓòÉΓòÉ 2.3.5.2. Iteration Using Iterators ΓòÉΓòÉΓòÉ
  1523.  
  1524. Cursor iteration has two possible drawbacks: 
  1525.  
  1526. o For unordered collections, the explicit notion of an (arbitrary) ordering may 
  1527.   be undesirable for stylistic reasons. 
  1528. o Iteration in an arbitrary order might be done more efficiently using 
  1529.   something other than cursors. For example, with tree representations, a 
  1530.   recursive descent iteration may be faster than the cursor navigation, even 
  1531.   though the time for extra function calls must be considered. 
  1532.  
  1533. The Collection Classes provides the allElementsDo function that addresses both 
  1534. drawbacks by calling a function that is applied to all elements. The function 
  1535. returns a Boolean value that tells whether the iteration should be continued or 
  1536. not. For ordered collections, the function is applied in this order. Otherwise 
  1537. the order is unspecified. 
  1538.  
  1539. The function that is applied in each iteration step can be given in two ways: 
  1540.  
  1541. o As a C++ function 
  1542. o As an object of an iterator class. 
  1543.  
  1544. The advantage of applying the function as an object of an iterator class is 
  1545. that additional arguments that are needed by the iteration function can be 
  1546. better encapsulated. The C++ function accepts an additional argument for the 
  1547. same purpose. 
  1548.  
  1549. For both these possibilities (the C++ function and the object of an iterator 
  1550. class), an additional distinction is made whether the function leaves the 
  1551. element constant or not. This means that four definitions of the function 
  1552. allElementsDo are offered by every collection. The following example shows the 
  1553. definition of allElementsDo for ISet: 
  1554.  
  1555. template < class Element, ... >
  1556. class ISet {
  1557.   // ...
  1558.                    // Iteration applying a C++ function:
  1559. Boolean allElementsDo (Boolean (*function)(Element&, void*),
  1560.                     void* additionalArgument = 0);
  1561. Boolean allElementsDo (Boolean (*function)(Element const&, void*),
  1562.                     void* additionalArgument = 0) const;
  1563.  
  1564.                    // Iteration applying an iterator object:
  1565. Boolean allElementsDo (IIterator < Element > &);
  1566. Boolean allElementsDo (IConstantIterator < Element > &) const ;
  1567. }
  1568.  
  1569. If you use an object of an iterator class, this class must offer an applyTo 
  1570. function. It also must be derived from the abstract base class IIterator or 
  1571. IConstantIterator.  These abstract iterator base classes are defined in the 
  1572. following way: 
  1573.  
  1574.    template < class Element >
  1575.    class IIterator {
  1576.    public:
  1577.      virtual Boolean applyTo (Element&) = 0;
  1578.    };
  1579.  
  1580.    template < class Element >
  1581.    class IConstantIterator {
  1582.    public:
  1583.      virtual Boolean applyTo (Element const&) = 0;
  1584.    };
  1585.  
  1586. Additional arguments that are needed for the iteration can, for example, be 
  1587. passed as arguments to the constructor of the derived iterator class.  You can 
  1588. define the function with the given argument and return types. For additional 
  1589. arguments, you may have to define a separate class or structure. 
  1590.  
  1591. The following example shows the use of iterators.  The example adds all 
  1592. integers in a bag using two methods: by iterating the applied function as an 
  1593. object of an iterator class, or as a function. 
  1594.  
  1595. // sumup.C  - An example of using Iterators
  1596.    #include <ibag.h>
  1597.    #include <iostream.h>
  1598.  
  1599.    typedef IBag < int > IntBag;
  1600.  
  1601.    class SumIterator : public IConstantIterator < int > {
  1602.      int ivSum;
  1603.    public:
  1604.      SumIterator () : ivSum (0) {}
  1605.      Boolean applyTo (int const& i) {
  1606.        ivSum += i;
  1607.        return True;
  1608.      }
  1609.      int sum () { return ivSum; }
  1610.    };
  1611.  
  1612.    int sumUsingIteratorObject (IntBag const& bag) {
  1613.      SumIterator sumUp;
  1614.      bag.allElementsDo (sumUp);
  1615.      return sumUp.sum ();
  1616.    }
  1617.  
  1618.    Boolean sumUpFunction (int const& i, void* sum) {
  1619.      *(int*)sum += i;
  1620.      return True;
  1621.    };
  1622.  
  1623.    int sumUsingIteratorFunction (IntBag const& bag) {
  1624.      int sum = 0;
  1625.      bag.allElementsDo (sumUpFunction, &sum);
  1626.      return sum;
  1627.    }
  1628.  
  1629. int main (int argc, char* argv[])  {
  1630.      IntBag intbag;
  1631.      for (int cnt=1; cnt < argc; cnt++)
  1632.         intbag.add(atoi(argv[cnt]));
  1633.      cout << "Sum obtained using an Iterator Object = "
  1634.           <<  sumUsingIteratorObject(intbag)  << "\n";
  1635.      cout << "Sum obtained using an Iterator Function = "
  1636.           <<  sumUsingIteratorFunction(intbag)  << "\n";
  1637.      return 0;
  1638.      }
  1639.  
  1640.  
  1641. ΓòÉΓòÉΓòÉ 2.3.6. Copying and Referencing Collections ΓòÉΓòÉΓòÉ
  1642.  
  1643. The Collection Classes implement no structure sharing between different 
  1644. collection objects. The assignment operator and the copy constructor for 
  1645. collections are defined to copy all elements of the given collection into the 
  1646. assigned or constructed collection. You should remember this if you are using 
  1647. collection types as arguments to functions. If the argument type is not a 
  1648. reference or pointer type, the collection is passed by value, and changes made 
  1649. to the collection within the function do not affect the collection in the 
  1650. calling function. 
  1651.  
  1652. If you want a function to modify a collection, you should pass the collection 
  1653. as a reference: 
  1654.  
  1655.    void removePrimes (ISet < int > set) { /* ... */ }  // wrong
  1656.    void removePrimes (ISet < int >& set) { /* ... */ } // right
  1657.  
  1658. For the sake of efficiency you should avoid having a collection type as the 
  1659. return type of a function: 
  1660.  
  1661.    ISet < int > f () {
  1662.       ISet < int > result;
  1663.       // ...
  1664.       return result;
  1665.    }
  1666.    // ...
  1667.    intSet = f ();   // inefficient
  1668.  
  1669. In this program intSet becomes a reference argument to the assignment 
  1670. operation, which would again copy the set. A better approach is: 
  1671.  
  1672.    void f (ISet < int > &result) { /* ... */ }
  1673.       // ...
  1674.    f (intSet);
  1675.  
  1676.  
  1677. ΓòÉΓòÉΓòÉ 2.4. Element Functions and Key Functions ΓòÉΓòÉΓòÉ
  1678.  
  1679. This chapter describes the functions that are required by member functions of 
  1680. the collection classes to manipulate elements and keys. The following topics 
  1681. are discussed: 
  1682.  
  1683. o Element Functions and Key Functions 
  1684. o Using standard operators to provide element and key functions 
  1685. o Using separate functions 
  1686. o Using element operation classes 
  1687. o Functions for derived element classes. 
  1688. o Values and managed objects 
  1689.  
  1690.  
  1691. ΓòÉΓòÉΓòÉ 2.4.1. Introduction to Element Functions and Key Functions ΓòÉΓòÉΓòÉ
  1692.  
  1693. The member functions of the collection classes call other functions to 
  1694. manipulate elements and keys.  These functions are called element functions and 
  1695. key functions, respectively. 
  1696.  
  1697. Member functions of the collection classes may, for example, use the element's 
  1698. assignment or copy constructors for adding an element, or may use the element's 
  1699. equality operator for locating an element in the collection. In addition, 
  1700. collection class functions use memory management functions for the allocation 
  1701. and deallocation of dynamically created internal objects (nodes). 
  1702.  
  1703. The element functions that may be required by the Collection Classes are: 
  1704.  
  1705. o Default and copy constructor 
  1706. o Destructor 
  1707. o Assignment 
  1708. o Equality test 
  1709. o Ordering relation 
  1710. o Key access 
  1711. o Hash function 
  1712.  
  1713. The key functions that may be required by the Collection Classes are: 
  1714.  
  1715. o Equality test 
  1716. o Ordering relation 
  1717. o Hash function 
  1718.  
  1719. The memory management functions that may be required by the Collection Classes 
  1720. are: 
  1721.  
  1722. o Allocation 
  1723. o Deallocation 
  1724. The lists above are the superset of all element functions and key functions 
  1725. that a collection class may ever require.  For example, a collection without 
  1726. keys does not require a key function and a collection without element equality 
  1727. does not require an equality test.  Element functions and key functions 
  1728. required for a certain collection are listed with the description of each 
  1729. collection in the reference parts of this manual. 
  1730.  
  1731. Where possible, these functions are already defined by the Collection Classes. 
  1732. Default memory management functions are provided for usage with any element and 
  1733. key type. For the standard C++ data types int and char*, defaults are offered 
  1734. for all element and key functions. For all other element and key types you must 
  1735. provide these functions. 
  1736.  
  1737. There are three different methods of providing element functions and key 
  1738. functions, each of which offers a different level of flexibility and tailoring. 
  1739. The methods are: 
  1740.  
  1741.  1. Using member functions 
  1742.  2. Using separate functions in the global name space 
  1743.  3. Using element operation classes. 
  1744.  
  1745. The second and third methods can also be used to replace the default memory 
  1746. management functions for some of the collections. 
  1747.  
  1748.  
  1749. ΓòÉΓòÉΓòÉ 2.4.2. Using Member Functions to Provide Element and Key Functions ΓòÉΓòÉΓòÉ
  1750.  
  1751. The easiest way to provide the required element or key functions is to use the 
  1752. member functions. For assignment, equality, and ordering relation, operator=, 
  1753. operator==, and operator< are used, respectively. 
  1754.  
  1755. You must define these functions using member functions: 
  1756.  
  1757. o Constructors 
  1758. o Destructors. 
  1759.  
  1760. You cannot define these functions using member functions: 
  1761.  
  1762. o Functions for key access 
  1763. o Functions for hashing 
  1764. o Functions for memory management. 
  1765.  
  1766. Except for assignment, you must define member functions of a class as const. 
  1767. You will get a compile-time error if you do not include const in these 
  1768. definitions. 
  1769.  
  1770. The following example shows how member functions must be defined as const: 
  1771.  
  1772.    class Element
  1773.    {
  1774.    public:
  1775.       Element&      operator=  (Element const&);
  1776.       Boolean       operator== (Element const&) const;
  1777.       Boolean       operator<  (Element const&) const;
  1778.    };
  1779.  
  1780. The result type of the assignment operator is irrelevant to the Collection 
  1781. Classes. The result type of equality and ordering relation must be compatible 
  1782. with type Boolean. For some element functions, if they are not defined in any 
  1783. of the three methods, the compiler will generate default element member 
  1784. functions according to C++ language rules. 
  1785.  
  1786.  
  1787. ΓòÉΓòÉΓòÉ 2.4.3. Using Separate Functions ΓòÉΓòÉΓòÉ
  1788.  
  1789. You can use separate functions to provide the required element and key 
  1790. functions. Use separate functions when, in instantiating the collection class, 
  1791. you have no control over the element class, and the element class does not 
  1792. define the appropriate functions. You can also use separate functions to 
  1793. provide key access and hash function. 
  1794.  
  1795. The following shows what the declarations for these separate functions must 
  1796. look like: 
  1797.  
  1798.    void          assign  (Element&, Element const&);
  1799.  
  1800.    Boolean       equal   (Element const&, Element const&);
  1801.    long          compare (Element const&, Element const&);
  1802.    Key const&    key     (Element const&);
  1803.    unsigned long hash    (Element const&, unsigned long);
  1804.    Boolean       equal   (Key const&, Key const&);
  1805.    long          compare (Key const&, Key const&);
  1806.    unsigned long hash    (Key const&, unsigned long);
  1807.  
  1808. You can also use separate functions for the standard memory management 
  1809. functions, as defined by the C++ language: 
  1810.  
  1811.    void*         operator new (size_t);
  1812.    void          operator delete (void*);
  1813.  
  1814. The compare function must return a value that is less than, equal to, or 
  1815. greater than zero, depending on whether the first argument is less than, equal 
  1816. to, or greater than the second argument. The hash function must return a value 
  1817. that is less than the second argument; this may, for example, be achieved by 
  1818. computing the remainder (operator%) with the second argument. The hash function 
  1819. should evenly distribute over the range between zero and the second argument. 
  1820. For equal elements or keys the hash element must yield equal results. 
  1821.  
  1822. For assign, equal, and compare, template functions are defined that will be 
  1823. instantiated unless otherwise defined. The default for assign uses the 
  1824. assignment operator, the default for equal uses the equality operator, and the 
  1825. default for compare uses two comparisons with operator<.  It is therefore 
  1826. advisable to define your own compare function if the given element type has a 
  1827. more efficient implementation available.  Such definitions are already provided 
  1828. for integer types using operator- and for char* using strcmp.  By default, the 
  1829. standard memory management functions are used. 
  1830.  
  1831. The following example demonstrates the use of a separate function for the 
  1832. definition of the key access. The element class is Task, its member data TaskId 
  1833. are the key, and its member function id is used to access the key: 
  1834.  
  1835.    typedef unsigned long TaskId;
  1836.    typedef int Priority;
  1837.    class Task
  1838.    { TaskId ivId;
  1839.       Priority ivPriority;
  1840.    public:
  1841.       TaskId   id ()  const { return ivId; }
  1842.       Priority priority () { return ivPriority; }
  1843.     // ...
  1844.    };
  1845.    // ...
  1846.    TaskId key (Task const& t)    // key access
  1847.    { return t.id (); }
  1848.    // ...
  1849.    IKeySet <Task, TaskId> runningTasks;
  1850.  
  1851.  
  1852. ΓòÉΓòÉΓòÉ 2.4.4. Using Element Operation Classes ΓòÉΓòÉΓòÉ
  1853.  
  1854. For each collection, there is one class template that takes a template argument 
  1855. ElementOps. ElementOps is itself a template class that defines all required 
  1856. element/key operations. By default, a standard class template is used that 
  1857. defines these operations by the corresponding element and key functions. For 
  1858. example, these are the definitions of the class templates ILinkedSequence and 
  1859. IGLinkedSequence: 
  1860.  
  1861. template < class Element, class ElementOps >
  1862. class IGLinkedSequence { /* ... */ };
  1863.  
  1864. template < class Element >
  1865. class ILinkedSequence :
  1866.   public IGLinkedSequence < Element, IStdOps < Element > > {
  1867.           /* ... */ };
  1868.  
  1869. The advantage of passing the arguments by an extra class instead of passing 
  1870. them as function pointers is that the class solution allows inlining. 
  1871. Collection classes with the operation class argument have names that begin with 
  1872. IG. IGSequence is an example of a collection class with the operation class 
  1873. argument. You can define such classes and pass them to the IG templates. Use 
  1874. this method in cases where, for two instantiations of collections with the same 
  1875. element or key type, two different key or hash functions are used. 
  1876.  
  1877. The following is a skeleton for operation classes. The keyOps member must only 
  1878. be present for key collections: 
  1879.  
  1880.    class ...Ops
  1881.    { void*         allocate     (size_t);
  1882.      void          deallocate   (void*);
  1883.      void          assign       (Element&, Element const&);
  1884.  
  1885.      Boolean       equal        (Element const&, Element const&);
  1886.      long          compare      (Element const&, Element const&);
  1887.      Key const&    key          (Element const&);
  1888.      unsigned long hash         (Element const&, unsigned long);
  1889.  
  1890.      class KeyOps
  1891.      { Boolean       equal        (Key const&, Key const&);
  1892.        long          compare      (Key const&, Key const&);
  1893.        unsigned long hash         (Key const&, unsigned long);
  1894.      } keyOps;
  1895.    };
  1896.  
  1897. You can inherit from the following class templates when you define your own 
  1898. operation classes. Templates with argument type T may be used for both the 
  1899. element and the key type. 
  1900.  
  1901.    class IStdMemOps
  1902.    { void* allocate (size_t);
  1903.       void deallocate (void*);
  1904.    };
  1905.  
  1906.    template < class T >
  1907.    class IStdAsOps
  1908.    {
  1909.       void assign (T&, T const&);
  1910.    };
  1911.  
  1912.    template < class T >
  1913.    class IStdEqOps
  1914.    {
  1915.       Boolean equal (T const&, T const&);
  1916.    };
  1917.  
  1918.    template < class T >
  1919.    class IStdCmpOps
  1920.    {
  1921.       long compare (T const&, T const&);
  1922.    };
  1923.  
  1924.    template < class Element, class Key >
  1925.    class IStdKeyOps
  1926.    {
  1927.       Key const& key (Element const&);
  1928.    };
  1929.  
  1930.    template < class T >
  1931.    class IStdHshOps
  1932.    {
  1933.       unsigned long hash (T const&, unsigned long);
  1934.    };
  1935.  
  1936. To define an operation class, use the predefined templates for standard 
  1937. functions, and define the specific functions individually. Consider, for 
  1938. example, tasks that have an identifier and a priority. The identifier might 
  1939. serve as the key in a collection that keeps track of all active tasks, while 
  1940. the priority might be used for implementing priority controlled task queues. 
  1941. Because the key function is already defined to yield the task identifier, the 
  1942. priority queue has to be instantiated in the following way: 
  1943.  
  1944.    class TaskPrioOps : public IStdMemOps,
  1945.                        public IStdAsOps < Task >
  1946.    {
  1947.    public:
  1948.       Priority key (Task const& t)  { return t.priority (); }
  1949.       IStdCmpOps < Priority > keyOps;
  1950.    };
  1951.    // ...
  1952.    IGPriorityQueue < Task, Priority, TaskPrioOps >
  1953.           taskPriorityQueue;
  1954.  
  1955. The functions that are required for a particular collection class depend not 
  1956. only on the abstract class but also on the concrete implementation choice. If 
  1957. you choose a set to be implemented through a hash table, the elements require a 
  1958. hash function. If you choose a (sorted) AVL tree implementation, elements need 
  1959. a comparison function. Even the default implementations may require more 
  1960. functions to be provided than would be necessary for the collection interface. 
  1961. Each chapter that describes a particular collection defines which functions 
  1962. must be provided for keys and elements for each implementation of that 
  1963. collection. 
  1964.  
  1965.  
  1966. ΓòÉΓòÉΓòÉ 2.4.5. Values and Objects ΓòÉΓòÉΓòÉ
  1967.  
  1968. In C++, variables and function arguments have their values copied when they are 
  1969. assigned. This copying can decrease a program's efficiency, especially when the 
  1970. objects are large. Therefore it is common to use pointers or references for 
  1971. common object semantics. This use includes copying a pointer or reference to 
  1972. the object and enabling polymorphic applications through virtual functions. 
  1973. Pointers to elements can be used as collection element types in such cases. 
  1974. References are not allowed as collection element types. For KeySets, this 
  1975. procedure is illustrated in the following example: (Note that the key function 
  1976. is defined with argument type Task*.) 
  1977.  
  1978.   class Task {
  1979.   Task id () const;
  1980.   Priority priority () const;
  1981.   };
  1982.   TaskId const& key (Task* const& t) { return t->ivId; }
  1983.   IKeySet < Task*, Taskid > tasks;
  1984.  
  1985. If you have already defined the key function for type Task, you may find it 
  1986. inconvenient to add the extra definition of a pointer to Task, using 
  1987. dereferencing. For collections with element equality, the inconvenience is even 
  1988. greater. Instantiating the collection template with the element pointer type 
  1989. will result in applying pointer comparison for the elements. In general, this 
  1990. result is not intended. Equality and ordering relation could also be provided 
  1991. for Task*. The compiler would not produce an error if these functions were 
  1992. missing, as it would for the key function, but would instantiate the default 
  1993. templates. In the following example, adding, locating, and other functions are 
  1994. based on pointer equality and ordering, and not on the equality defined for the 
  1995. Task type. 
  1996.  
  1997.   class Task
  1998.   { TaskId ivId;
  1999.     //...
  2000.     Boolean operator== (Task const& t)
  2001.     { return ivId == t.ivId; }
  2002.   };
  2003.   ISet < Task* > tasks;  // equality refers to pointers
  2004.  
  2005. For the handling of pointers to elements, the Collection Classes offer a class 
  2006. template IPtr, which is instantiated with the element type. Objects of this 
  2007. class automatically apply all element functions, except for assignment, to the 
  2008. referenced object. IPtr objects are constructed (or converted) from an element 
  2009. pointer. The C++ dereferencing operators * and -> are defined, for IPtr, to 
  2010. refer to the referenced objects. 
  2011.  
  2012.   typedef IPtr < Task > TaskPtr;
  2013.   ISet < TaskPtr > taskSet;
  2014.   Task* t = new Task;
  2015.   TaskPtr t1 (t);
  2016.   taskSet.add (t1);
  2017.   //...
  2018.   taskSet.elementAt (cursor)->priority();
  2019.   //...
  2020.   taskSet.remove (t1);
  2021.   delete t;
  2022.  
  2023. The dynamically created elements are not automatically deleted when they are 
  2024. removed from the collection. 
  2025.  
  2026. Note:  The IPtr class will not work with standard data types such as int, long, 
  2027. and char. 
  2028.  
  2029.  
  2030. ΓòÉΓòÉΓòÉ 2.4.5.1. Automatic Storage Management ΓòÉΓòÉΓòÉ
  2031.  
  2032. The class IMgPtr implements a managed pointer class, which is a pointer class 
  2033. as defined in Values and Objects, together with automatic storage management 
  2034. for the referenced element. Automatic storage management is implemented by 
  2035. counting the managed pointers that reference an object. The object is 
  2036. automatically deleted when no more managed pointers refer to it. Its proper 
  2037. behavior requires that the pointer to the element from which the managed 
  2038. pointer is initially constructed is no longer used. For example: 
  2039.  
  2040.   typedef IMgPtr < Task > TaskPtr;
  2041.   ISet < TaskPtr > tasks;
  2042.   TaskPtr t1 (new Task);
  2043.   tasks.add (t1);
  2044.   // ...
  2045.   tasks.remove (t1);
  2046.  
  2047. In the example, the allocated task will automatically be deleted by the remove 
  2048. function unless it is referenced through another TaskPtr. 
  2049.  
  2050. Automatic storage management is particularly useful when functions return 
  2051. pointers or references to objects that they have created (dynamically 
  2052. allocated), and the last user of the object is responsible for cleaning up. The 
  2053. class IMgPtr can also be used for this purpose. 
  2054.  
  2055. Note:  The IMgPtr class will not work with standard data types such as int, 
  2056. long, and char 
  2057.  
  2058.  
  2059. ΓòÉΓòÉΓòÉ 2.4.6. Functions for Derived Element Classes ΓòÉΓòÉΓòÉ
  2060.  
  2061. One of the C++ language rules states that function template instantiations are 
  2062. considered before conversions. Because the Collection Classes define default 
  2063. templates for element functions, functions such as equal or compare, defined 
  2064. for a class, will not be considered for that class's derived classes; the 
  2065. default template functions will be instantiated instead: 
  2066.  
  2067.   class A
  2068.   { /* ... */ };
  2069.   long compare (A const&, A const&);
  2070.   class B : public A
  2071.   { /* ... */ };
  2072.   ISortedSet < B > BSet;
  2073.  
  2074. The example will instantiate the default compare function for class B which 
  2075. uses the operator< of B, if defined. Otherwise, a compilation error occurs, 
  2076. because a member function operator< is not found for class B. You must define 
  2077. standard functions such as equal or compare for the actual element type to 
  2078. prevent the template instantiation of those functions. 
  2079.  
  2080. The classes IPtr and IMgPtr (see Values and Objects) use an extra indirection 
  2081. to ensure that an instantiation such as ISet<IPtr<Task>> uses the correct 
  2082. functions.  This indirection is usually transparent but you must consider it 
  2083. when you derive classes from the IPtr class.  The standard operation classes 
  2084. first apply a function elementForOps to the element before they apply the 
  2085. corresponding non-member (equal, ...) function. By default, a corresponding 
  2086. template function is instantiated for elementForOps which yields the identity. 
  2087. For IPtr (and similar classes) this function is defined to yield the referenced 
  2088. element instead.  If a class derived from IPtr<E> is used as collection element 
  2089. type, the default template functions must be instantiated before a conversion 
  2090. will be considered.  A derived class must therefore explicitly redefine the 
  2091. elementForOps function, as shown in the following example: 
  2092.  
  2093.   class TaskPtr : public IPtr < Task >  {
  2094.      friend Task& elementForOps ( TaskPtr & t ) {
  2095.         return ( Task & ) elementForOps ( t ); }
  2096.      friend Task const & elementForOps ( TaskPtr const & t ) {
  2097.         return ( Task const & ) elementForOps ( t ); }
  2098.   };
  2099.   ISet < TaskPtr > taskSet;
  2100.  
  2101.  
  2102. ΓòÉΓòÉΓòÉ 2.5. Tailoring a Collection Implementation ΓòÉΓòÉΓòÉ
  2103.  
  2104. This chapter describes how to tailor a collection implementation for your 
  2105. specific applications.  It describes the based-on concept and predefined 
  2106. implementation variants. 
  2107.  
  2108. The following topics are discussed: 
  2109.  
  2110. o Introduction to tailoring 
  2111. o Replacing the default implementation 
  2112. o The based-on concept 
  2113. o Provided implementation variants 
  2114.  
  2115.  
  2116. ΓòÉΓòÉΓòÉ 2.5.1. Introduction ΓòÉΓòÉΓòÉ
  2117.  
  2118. When you are developing a program that uses a collection, you should begin by 
  2119. using the default implementation and go on to a final tuning phase where you 
  2120. choose implementations according to the actual requirements of your 
  2121. application. You can determine these requirements by profiling or by using 
  2122. other measurement tools. This section describes how to choose between a variety 
  2123. of implementations provided by the Collection Classes as well as how to create 
  2124. your own implementation classes. 
  2125.  
  2126. As described in The Overall Implementation Structure, each abstract data type 
  2127. has several possible implementations. Some of these implementations are basic; 
  2128. that is, the collection class is implemented directly as a concrete class. 
  2129. These basic implementations include: 
  2130.  
  2131. o AVL trees 
  2132. o Hash tables 
  2133. o Linked sequences 
  2134. o Tabular sequences. 
  2135.  
  2136. Other implementations, including bags, are based on other collection classes. 
  2137. The based-on concept provides a systematic framework for choosing the most 
  2138. appropriate implementations. It is also useful for extending the Collection 
  2139. Classes with other basic implementations, such as specific kinds of search 
  2140. trees, and for using these implementations as the basis for other data 
  2141. abstractions such as sets, maps, and bags. 
  2142.  
  2143.  
  2144. ΓòÉΓòÉΓòÉ 2.5.2. Replacing the Default Implementation ΓòÉΓòÉΓòÉ
  2145.  
  2146. You can easily replace the default implementation with another implementation. 
  2147. Suppose that you have a key set class called MyType that has been defined with 
  2148. the default implementation IKeySet.  The definition of this class would look 
  2149. like this: 
  2150.  
  2151.    typedef IKeySet < Element, Key > MyType;
  2152.  
  2153. If you want to replace the default implementation, which uses an AVL tree, with 
  2154. a hash table implementation, you can replace the above implementation with the 
  2155. following definition: 
  2156.  
  2157.    typedef IHashKeySet < Element, Key > MyType;
  2158.  
  2159. Implementation variants are predefined for basic implementations, like 
  2160. IHashKeySet, as well as for based-on implementations, like ISetOnHashKeySet. 
  2161.  
  2162.  
  2163. ΓòÉΓòÉΓòÉ 2.5.3. The Based-On Concept ΓòÉΓòÉΓòÉ
  2164.  
  2165. The Collection Classes achieve a high degree of implementation flexibility by 
  2166. basing several collection class implementations on other abstract classes, 
  2167. rather than by implementing them directly through a concrete implementation 
  2168. variant of the class. This design feature results in an implementation path 
  2169. rather than the selection of an implementation in a single step. The Collection 
  2170. Classes contain type definitions for the most common implementation paths; they 
  2171. are described in the corresponding sections of the Reference Manual. See 
  2172. Possible Implementation Paths for an illustration of implementation paths. The 
  2173. figure is explained in Provided Implementation Variants. 
  2174.  
  2175. The element functions that are needed by a particular implementation depend on 
  2176. all collection class templates that participate in the implementation.  While 
  2177. ISet requires at least element equality to be defined, an AVL tree 
  2178. implementation of this set also requires the element type to provide a 
  2179. comparison function. A hash table implementation requires the element type to 
  2180. have an additional hash function. The required element functions for all 
  2181. predefined implementation variants are listed in the chapters for individual 
  2182. collection types in the Reference Manual. 
  2183.  
  2184. For a concrete implementation, such as a Set based on a KeySorted Set that is 
  2185. in turn based on a Tabular Sequence, these class templates have to be plugged 
  2186. together. The plug mechanism requires class templates to be used as template 
  2187. arguments. Because C++ does not allow class templates as template arguments, 
  2188. the Collection Classes implement the plug mechanism using macros. Two macros 
  2189. are provided: 
  2190.  
  2191. o One for defining a template with an additional operation class argument, for 
  2192.   example IDefineGSetOnGKeySortedSet. See Using Element Operation Classes. 
  2193. o One for defining a template with only the element type, or the element and 
  2194.   key types, as arguments, for example IDefineCollectionWithOps and 
  2195.   IDefineKeyCollectionWithOps. 
  2196.  
  2197. The second macro needs, as an element operation class, an argument as is 
  2198. described in section Using Element Operation Classes. Standard operation class 
  2199. templates are predefined that can be used for this purpose. Their names are 
  2200. systematically derived from the operations they define. The name structure is: 
  2201.  
  2202. I<elem-ops>[K<key-ops>]Ops
  2203.  
  2204. where <elem-ops> and <key-ops> are a sequence of letters: E for equality, C for 
  2205. comparison, and H for hashing. IEKEHOps, for example, is an operation template 
  2206. providing, besides the basic memory management and element assignment 
  2207. operations, element equality, key equality, and hashing on keys. 
  2208.  
  2209. For the following example, assume you have a specific form of a sorted tree 
  2210. called IGMySortedTree, which is a new implementation for a KeySorted Set. It 
  2211. must exactly implement the interface provided for a KeySortedSet: 
  2212.  
  2213. o It must have three template arguments, the element type, the key type, and an 
  2214.   element operations class. 
  2215. o It must implement all of the member functions defined for KeySortedSet 
  2216.  
  2217. A set implementation IGMySet which is based on this new sorted tree is defined 
  2218. like this: 
  2219.  
  2220.   IDefineGSetOnGKeySortedSet (IGMySortedTree, IGMySet)
  2221.  
  2222. IGMySet is defined as a template with the element type and an element operation 
  2223. class as arguments. A template which only takes the element type as argument 
  2224. and which uses the standard element operations for equality and comparison is 
  2225. then defined like this: 
  2226.  
  2227.   IDefineCollectionWithOps (IGMySet, IECOps, IMySet)
  2228.  
  2229. This expands to the code shown below. The expansion is not intended to give you 
  2230. an in-depth understanding of how the mechanism works internally. It merely 
  2231. illustrates the value of the macros. 
  2232.  
  2233.    template < class Element, class ElementOps >
  2234.    class IGMySet :
  2235.    IWSetOnKeySortedSet
  2236.       < Element, ElementOps,
  2237.         IGMySortedTree
  2238.           < Element, Element,
  2239.             IOpsWithKey < Element, ElementOps > > >
  2240.    { /* ... constructor redefinition ... */ };
  2241.    template < class Element >
  2242.    class IMySet : public IGMySet < Element, IECOps < Element > >
  2243.    { /* ... constructor redefinition ... */ };
  2244.  
  2245.  
  2246. ΓòÉΓòÉΓòÉ 2.5.4. Provided Implementation Variants ΓòÉΓòÉΓòÉ
  2247.  
  2248. Possible Implementation Paths lists the basic and based-on implementations 
  2249. provided by the library. The upper left corner of each cell contains the name 
  2250. of the (abstract) collection class; basic implementations are written in bold 
  2251. letters, while based-on implementations are described by arrows starting from 
  2252. the class that they implement and ending in the (abstract) class on which they 
  2253. are based. An implementation choice for a given class must use either a basic 
  2254. implementation for this class or follow a based-on implementation path that 
  2255. ultimately leads to a basic implementation.  The nonbold arrow denote the 
  2256. shortcuts to the basic implementations. 
  2257.  
  2258. Take the example of the Bag abstraction.  The Bag is not implemented directly. 
  2259. It can only be based on the KeySet abstraction, which itself is either 
  2260. implemented directly with a HashTable or can be based on the KeySorted Set. 
  2261. The KeySorted Set is either directly implemented as Avl Tree or B* Tree or can 
  2262. be based on the Sequence abstraction.  The Sequence is implemented directly as 
  2263. a linked or tabular undiluted or tabular diluted data structure, into which 
  2264. elements are inserted. The insertions preserve the sorting order. 
  2265.  
  2266. Possible Implementation Paths 
  2267.  
  2268. The following table lists the based-on implementations of Collection Classes 
  2269. and the header files that provide the IDefine... macros. Usually, you do not 
  2270. need to use the IDefine... macros. You can use them, however, to define your 
  2271. own implementation variant for a collection class and to integerate it into the 
  2272. scheme of implementation paths shown in Possible Implementation Paths. 
  2273.  
  2274. Macro Name                            Header File
  2275.  
  2276. IDefineGBagOnGKeySet                  ibagks.h
  2277. IDefineGBagOnGKeySortedSet            ibagkss.h
  2278. IDefineGDequeOnSequence               ideqseq.h
  2279. IDefineGEqualitySequenceOnGSequence   iesseq.h
  2280. IDefineGHeapOnGSequence               iheapseq.h
  2281. IDefineGKeySetOnGKeySortedSet         ikskss.h
  2282. IDefineGKeySortedBagOnGSequence       iksbseq.h
  2283. IDefineGKeySortedSetOnGSequence       ikssseq.h
  2284. IDefineGMapOnGKeySet                  imapks.h
  2285. IDefineGMapOnGKeySortedSet            imapkss.h
  2286. IDefineGPriorityQueueOnGKeySortedBag  ipquksb.h
  2287. IDefineGQueueOnSequence               iqueseq.h
  2288. IDefineGRelationOnGKeyBag             imapks.h
  2289. IDefineGSetOnGKeySet                  isetks.h
  2290. IDefineGSetOnGKeySortedSet            isetkss.h
  2291. IDefineGSortedBagOnGKeySortedSet      isbkss.h
  2292. IDefineGSortedMapOnGKeySortedSet      ismkss.h
  2293. IDefineGSortedRelationOnGKeySortedBag isrksb.h
  2294. IDefineGSortedSetOnGKeySortedSet      isskss.h
  2295. IDefineGStackOnSequence               istkseq.h
  2296.  
  2297.  
  2298. ΓòÉΓòÉΓòÉ 2.6. Polymorphic Use of Collections ΓòÉΓòÉΓòÉ
  2299.  
  2300. This chapter describes how you can use polymorphism in the Collection Classes. 
  2301. The following topics are discussed: 
  2302.  
  2303. o Introduction to polymorphism 
  2304. o Using reference classes. 
  2305.  
  2306.  
  2307. ΓòÉΓòÉΓòÉ 2.6.1. Introduction to Polymorphism ΓòÉΓòÉΓòÉ
  2308.  
  2309. Polymorphism allows you to take an abstract view of an object or function 
  2310. argument and use any concrete objects or arguments that are derived from this 
  2311. abstract view. The collection properties defined in Flat Collections define 
  2312. such abstract views. They are represented in the form of the class hierarchy in 
  2313. The Abstract Class Hierarchy. 
  2314.  
  2315. Polymorphic use of collections differs from polymorphism of the element type. 
  2316. Element polymorphism means that you can use the collections with any elements 
  2317. that provide basic operations like assignment and equality; this kind of 
  2318. polymorphism is implemented by the use of the C++ template concept. This 
  2319. chapter, however, deals with the polymorphic use of collections which means 
  2320. that a function may specify an abstract collection type for its argument, like 
  2321. IACollection, and then accept any concrete collections given as its actual 
  2322. argument. 
  2323.  
  2324. Each abstract class is defined by its functions and their behavior. The most 
  2325. abstract view of a collection is a container without any ordering or any 
  2326. specific element or key properties. Elements can be added to a collection, and 
  2327. a collection can be iterated over. A polymorphic function on collections might 
  2328. be to print all elements; such a function is given as an example in Using 
  2329. Reference Classes. 
  2330.  
  2331. Collections whose elements define equality or key equality provide, in addition 
  2332. to the common collection functions, functions for retrieving element 
  2333. occurrences by a given element or key value. Ordered collections provide the 
  2334. notion of a well-defined ordering of the element occurrences, either by an 
  2335. element ordering relation or by explicit positioning of elements within a 
  2336. sequence. They define operations for positional element access. Sorted 
  2337. collections provide no further functions, but define a more specific behavior, 
  2338. namely that the elements or their keys are sorted. 
  2339.  
  2340. These properties are combined through multiple inheritance: the abstract 
  2341. collection class IEqualitySortedCollection, for example, combines the abstract 
  2342. concepts of element equality and of being sorted, which implies being ordered. 
  2343. If a polymorphic function uses this class as its argument type, the arguments 
  2344. will be sorted, and the function can use functions like contains that are only 
  2345. defined for collections with element equality. 
  2346.  
  2347. Class libraries often make use of polymorphism to implement their functions. 
  2348. For equality collections, for example, a common union operator could be 
  2349. implemented that could be used for all concrete implementations of equality 
  2350. collections. For performance reasons, the Collection Classes do not make use of 
  2351. this mechanism. 
  2352.  
  2353.  
  2354. ΓòÉΓòÉΓòÉ 2.6.2. Using Reference Classes ΓòÉΓòÉΓòÉ
  2355.  
  2356. For performance reasons explained in The Overall Implementation Structure, 
  2357. concrete collection classes are not directly derived from abstract classes. 
  2358. Instead, you must use an indirection that "couples" a concrete collection with 
  2359. an abstract class. For each leaf in the collection class hierarchy, IASet, for 
  2360. example, there is an indirection class template called IRSet (see Overall 
  2361. Library Structure). It takes as template arguments the element type and, for 
  2362. key collections, the key type and a concrete collection class that has been 
  2363. instantiated with this element and key type. Instances of this indirection 
  2364. class refer to instances of the concrete collection class. (The R in IRSet 
  2365. stands for reference). The IR classes are derived from the corresponding 
  2366. abstract IA classes and are therefore part of the C++ class hierarchy. 
  2367. Instances of this class can be used wherever an instance (pointer or reference) 
  2368. of an abstract base class is required. 
  2369.  
  2370. The following example defines a universal printer class that accepts an 
  2371. arbitrary collection of tasks and prints their IDs. The elements are printed in 
  2372. the iteration order that is defined for the given collection. The concrete key 
  2373. set running cannot be used as an argument to the printer directly, because 
  2374. IKeySet is not derived from the abstract collection classes. The reference 
  2375. class IRKeySet is used for this purpose. It is instantiated with the element 
  2376. and key type, and with the concrete collection class TaskSet. An instance of 
  2377. this class refRunning is defined by providing running as a constructor 
  2378. argument. refRunning can finally be used as argument to the universal printer. 
  2379.  
  2380.   class TaskPrinter {
  2381.   public:
  2382.     print (IACollection < Task* > const& tasks)
  2383.     { cout << "ID     ..."
  2384.       ICursor *cursor = tasks.newCursor ();
  2385.       cout << "{ ";
  2386.       forCursor (*cursor)
  2387.         cout << cursor->element ()->id() << ' ';
  2388.       cout << "}\n";
  2389.     }
  2390.   };
  2391.   // ...
  2392.   typedef IKeySet < Task*, TaskId > TaskSet;
  2393.   TaskSet running;
  2394.   // ...
  2395.   IRKeySet < Task*, TaskId, TaskSet > refRunning (running);
  2396.   TaskPrinter.print (refRunning);
  2397.  
  2398.  
  2399. ΓòÉΓòÉΓòÉ 2.7. Exception Handling ΓòÉΓòÉΓòÉ
  2400.  
  2401. This chapter describes the exception-handling facilities provided by member 
  2402. functions of the Collection Classes. This chapter includes the following 
  2403. topics: 
  2404.  
  2405. o Introduction to exception handling 
  2406. o Preconditions and defined behavior 
  2407. o Levels of exception checking 
  2408. o List of Collection Classes exceptions 
  2409. o The hierarchy of exceptions 
  2410.  
  2411.  
  2412. ΓòÉΓòÉΓòÉ 2.7.1. Introduction to Exception Handling ΓòÉΓòÉΓòÉ
  2413.  
  2414. The C++ exception-handling facilities allow a program to recover from an 
  2415. exception.  An exception is a user, logic, or system error that is detected by 
  2416. a function that does not itself deal with the error, but passes the error to a 
  2417. handling function.  Exceptions can result from two major sources: 
  2418.  
  2419. o The violation of a precondition 
  2420. o The occurrence of an internal system failure or system restriction. 
  2421.  
  2422. In this chapter, two kinds of functions are discussed. A called function is a 
  2423. Collection Classes function that may throw an exception. A calling function is 
  2424. a function that calls a Collection Classes function. The calling function may 
  2425. be a Collection Classes function or a function you have defined. 
  2426.  
  2427.  
  2428. ΓòÉΓòÉΓòÉ 2.7.1.1. Exceptions Caused by Violated Preconditions ΓòÉΓòÉΓòÉ
  2429.  
  2430. A precondition of a called function is a condition that the function requires 
  2431. to be true when it is called. The calling function must assure that this 
  2432. condition holds. The called function implementation may assume that the 
  2433. condition holds without further checking it. If a precondition does not hold, 
  2434. the called function's behavior is undefined. 
  2435.  
  2436. If you want to make your programs more robust and to locate errors in the test 
  2437. phase, the functions your program calls should check to ensure that their 
  2438. preconditions hold. The Collection Class Library enables this checking to be 
  2439. enabled through macro definitions. Because this checking often requires 
  2440. significant overhead, it is turned off by default, and you need only use it 
  2441. while you are testing the system and verifying that preconditions are always 
  2442. met. 
  2443.  
  2444. A call to a function that violates the function's preconditions has two 
  2445. possible results: 
  2446.  
  2447. o If the called function checks its preconditions, the function will throw an 
  2448.   exception. 
  2449. o If the function does not check its preconditions, the behavior of the 
  2450.   function is undefined. 
  2451.  
  2452.  
  2453. ΓòÉΓòÉΓòÉ 2.7.1.2. Exceptions Caused by System Failures and Restrictions ΓòÉΓòÉΓòÉ
  2454.  
  2455. System failures and restrictions are different from precondition violations. 
  2456. You cannot usually anticipate them, and you have no opportunity to verify that 
  2457. such situations, for example storage overflow, will not occur. These exceptions 
  2458. need to be checked for, and an exception should be thrown if they occur. 
  2459.  
  2460.  
  2461. ΓòÉΓòÉΓòÉ 2.7.2. Precondition and Defined Behavior ΓòÉΓòÉΓòÉ
  2462.  
  2463. Exceptions are not generally used to change the flow of control of a program 
  2464. under normal circumstances. An example of using exceptions under normal 
  2465. circumstances is a function that iterates through a collection, and exits from 
  2466. the iteration by checking for the exception that is thrown when an invalid 
  2467. cursor is used to access elements.  When the iteration is complete, the cursor 
  2468. will no longer be valid, and this exception will be thrown.  This is not a good 
  2469. programming practice. A function should explicitly test for the cursor being 
  2470. valid. To make this possible, a function must efficiently test this condition 
  2471. (isValid, for the cursor example). 
  2472.  
  2473. There are situations where the test for a condition can be done more 
  2474. efficiently in combination with performing the actual function. In such cases, 
  2475. it is appropriate, for performance reasons, to make the situation regular (that 
  2476. is, not exceptional) and return the condition as a Boolean result.  Consider a 
  2477. function that first tests whether an element exists with a given key, and then 
  2478. accesses it if it exits: 
  2479.  
  2480.    if (c.containsElementWithKey (key)) {
  2481.      // ...
  2482.      /* ... */ c.elementWithKey (key) /* ... */ // inefficient
  2483.      // ...
  2484.    } else {
  2485.      // ...
  2486.    }
  2487.  
  2488. This solution is inefficient because the element is located twice, once to 
  2489. determine if it is in the collection and once to access it. Consider the 
  2490. following example: 
  2491.  
  2492.    try {
  2493.      // ...
  2494.      /* ... */ c.elementWithKey (key) /* ... */
  2495.                                       // bad: exception expected
  2496.      // ...
  2497.    } catch (INotContainsKeyException) {
  2498.      // ...
  2499.    }
  2500.  
  2501. This solution is undesirable because an exception is used to change the flow of 
  2502. control of the program. The correct solution is to obtain a cursor together 
  2503. with the containment test, and then to use the cursor for a fast element 
  2504. access: 
  2505.  
  2506.    if (c.locateElementWithKey (key, cursor)) {
  2507.      // ...
  2508.      /* ... */ elementAt (cursor) /* ... */   // most efficient
  2509.      // ...
  2510.    } else {
  2511.      //...
  2512.    }
  2513.  
  2514.  
  2515. ΓòÉΓòÉΓòÉ 2.7.3. Levels of Exception Checking ΓòÉΓòÉΓòÉ
  2516.  
  2517. Some preconditions are more difficult to check than others.  Consider the 
  2518. following possible preconditions: 
  2519.  
  2520.  1. A cursor for a linked collection implementation still points to an element 
  2521.     of a given collection. 
  2522.  2. A collection is not empty. 
  2523.  
  2524. It may be less efficient to check the first precondition in the production 
  2525. version of a program than to check the second precondition. 
  2526.  
  2527. The Collection Classes provide three levels of precondition checking.  They are 
  2528. selected by the following macro variable definitions (use, for example, compile 
  2529. flag -DINO_CHECKS): 
  2530.  
  2531. INO_CHECKS       Check for memory overflow. Other checks may be eliminated to 
  2532.                  improve performance. 
  2533. Default          Perform all precondition checks, except the check that a 
  2534.                  cursor actually points to an element of the collection. 
  2535. IALL_CHECKS      Perform all precondition checks, including the (costly) check 
  2536.                  that a cursor actually points to an element of the collection. 
  2537.                  This extra check can only fail for undefined cursors. 
  2538.  
  2539.  
  2540. ΓòÉΓòÉΓòÉ 2.7.4. List of Exceptions ΓòÉΓòÉΓòÉ
  2541.  
  2542. The Collection Classes define the following exceptions: 
  2543.  
  2544. IChildAlreadyExistsException 
  2545.           Occurs when you try to add a child to a tree using addAsChild at a 
  2546.           position that already contains a child. 
  2547. ICursorInvalidException 
  2548.           Two cursor properties may lead to the ICursorInvalidException: 
  2549.  
  2550.    o Every time a cursor is created, you must specify the collection that it 
  2551.      belongs to.  If a function takes a cursor as an argument (such as add, 
  2552.      setToFirst, and locate), the function can only be applied to the 
  2553.      collection that the cursor belongs to.  If the function is applied to 
  2554.      another collection, the ICursorInvalidException results. 
  2555.  
  2556.    o If a function takes a cursor as an input argument (such as elementAt, 
  2557.      removeAt, and replaceAt), the cursor must be valid. A cursor is valid if 
  2558.      it actually refers to some element contained in the collection.  You can 
  2559.      use the isValid function to determine if a cursor is valid. 
  2560. IEmptyException 
  2561.           Occurs when a function tries to access an element of an empty 
  2562.           collection. Functions that might cause this exception include 
  2563.           firstElement and removeFirstElement. 
  2564. IFullException 
  2565.           Occurs when a function tries to add an element to a bounded 
  2566.           collection that is already full.  Functions that might cause this 
  2567.           exception include add and addAsFirst. 
  2568. IIdenticalCollectionException 
  2569.           Occurs when the function addAllFrom is called with the source 
  2570.           collection being the same as the target collection. 
  2571. IInvalidReplacementException 
  2572.           Occurs when, during a replaceAt function, the replacing element has 
  2573.           different positioning properties (see Replacing Elements) than the 
  2574.           positioning properties of the element to be replaced. 
  2575. IKeyAlreadyExistsException 
  2576.           Occurs when a function attempts to add an element to a map or sorted 
  2577.           map that already has a different element with the same key. 
  2578.           Functions that might cause this exception include add and addAllFrom. 
  2579. INotBoundedException 
  2580.           Occurs when the function maxNumberOfElements is applied to a 
  2581.           collection that is not bounded. 
  2582. INotContainsKeyException 
  2583.           Occurs when the function elementWithKey is applied to a collection 
  2584.           that does not contain an element with the specified key. 
  2585. IOutOfMemory 
  2586.           Occurs when a function cannot obtain the space that it requires. 
  2587.           This exception is not the result of a precondition violation. 
  2588.           Functions that add an element to a collection, including add and 
  2589.           addAsFirst, can cause this exception. 
  2590. IPositionInvalidException 
  2591.           Occurs when a function specifies a position that is not valid in a 
  2592.           collection.  The functions that might cause this exception include 
  2593.           elementAtPosition, removeAtPosition, and setToPosition. 
  2594. IRootAlreadyExistsException 
  2595.           Occurs when the function addAsRoot is called for a tree that already 
  2596.           has a root. 
  2597.  
  2598.  
  2599. ΓòÉΓòÉΓòÉ 2.7.5. The Hierarchy of Exceptions ΓòÉΓòÉΓòÉ
  2600.  
  2601. In the Collection Classes, all exceptions are derived from IException. It 
  2602. provides common functions to access information about an exception that has 
  2603. occurred. 
  2604.  
  2605. The direct subclasses of IException used in the Collection Classes are 
  2606. IPreconditionViolation and IResourceExhausted.  The following figure shows the 
  2607. hierarchy of exceptions: 
  2608.  
  2609. IException
  2610.  .
  2611.  .
  2612.  Γöé
  2613.  Γö£ΓöÇΓöÇ IPreconditionViolation
  2614.  .   .
  2615.  .   .
  2616.  Γöé   Γö£ΓöÇΓöÇ IChildAlreadyExistsException
  2617.  Γöé   Γö£ΓöÇΓöÇ ICursorInvalidException
  2618.  Γöé   Γö£ΓöÇΓöÇ IEmptyException
  2619.  Γöé   Γö£ΓöÇΓöÇ IFullException
  2620.  Γöé   Γö£ΓöÇΓöÇ IIdenticalCollectionException
  2621.  Γöé   Γö£ΓöÇΓöÇ InvalidReplacementException
  2622.  Γöé   Γö£ΓöÇΓöÇ IKeyAlreadyExistsException
  2623.  Γöé   Γö£ΓöÇΓöÇ INotBoundedException
  2624.  Γöé   Γö£ΓöÇΓöÇ INotContainsKeyException
  2625.  Γöé   Γö£ΓöÇΓöÇ IPositionInvalidException
  2626.  Γöé   ΓööΓöÇΓöÇ IRootAlreadyExistsException
  2627.  .
  2628.  .
  2629.  Γöé
  2630.  ΓöéΓöÇΓöÇ IResourceExhausted
  2631.  Γöé   .
  2632.  Γöé   Γö£ΓöÇΓöÇ IOutOfMemory
  2633.  .   .
  2634.  .   .
  2635.  
  2636. Hierarchy of Exceptions 
  2637.  
  2638.  
  2639. ΓòÉΓòÉΓòÉ 2.8. Implementation Classes and Header Files ΓòÉΓòÉΓòÉ
  2640.  
  2641. Use this chapter to determine what header files to include in your program when 
  2642. you use a particular implementation class. 
  2643.  
  2644. The following table lists the concrete classes provided by the Collection 
  2645. Classes and their implementations. The first mentioned implementation for each 
  2646. abstract class is the default. Default implementations for an abstract class 
  2647. are not indented in the table, while variant implementations are indented. The 
  2648. default implementation is defined as a template with the given name and can be 
  2649. accessed through the header files specified for each abstract class.  The name 
  2650. of the corresponding template with additional operation class argument begins 
  2651. with IG instead of I.  For example, template classes IMap and IGMap are defined 
  2652. in the header file imap.h as based on KeySortedSet. Information about the 
  2653. implementation classes, their names and their header files is only necessary 
  2654. for selecting alternative implementations as described in section The Based-On 
  2655. Concept. 
  2656.  
  2657. Class Name          Header File  Description
  2658.  
  2659. IBag                ibag.h       Based on AVL KeySortedSet
  2660.    IWBagOnKSSet     ibagkss.h    Based on KeySortedSet
  2661. IEqualitySequence   ieqseq.h     Based on LinkedSequence
  2662.    IWEqSeqOnSeq     iesseq.h     Based on Sequence
  2663. IKeyBag             ikeybag.h    Hash table for KeyBag
  2664.    IHashKeyBag      ihshkb.h     Hash table for KeyBag (basic)
  2665. IKeySet             ikeyset.h    Based on AVL KeySortedSet
  2666.    IWKeySetOnKSSet  ikskss.h     Based on KeySortedSet
  2667.    IHashKeySet      ihshks.h     Hash table for KeySet (basic)
  2668. IKeySortedBag       iksbag.h     Based on LinkedSequence
  2669.    IWKSBagOnSeq     iksbseq.h    Based on Sequence
  2670. IKeySortedSet       iksset.h     AVL tree for KeySortedSet
  2671.    IAvlKeySortedSet iavlkss.h    AVL tree for KeySortedSet (basic)
  2672. IMap                imap.h       Based on AVL KeySortedSet
  2673.    IWMapOnKSSet     imapkss.h    Based on KeySortedSet
  2674.    IWMapOnKeySet    imapks.h     Based on KeySet
  2675. IRelation           irel.h       Based on Hash table KeyBag
  2676.    IWRelOnKeyBag    imapks.h     Based on KeyBag
  2677. ISequence           iseq.h       Linked sequence
  2678.    ILinkedSequence  ilnseq.h     Linked sequence (basic)
  2679.    ITabularSequence itbseq.h     Tabular sequence (basic)
  2680.    IDilutedSequence itdseq.h     Tabular diluted sequence (basic)
  2681. ISet                iset.h       Based on AVL KeySortedSet
  2682.    IWSetOnKSSet     isetkss.h    Based on KeySortedSet
  2683.    IWSetOnKeySet    isetks.h     Based on KeySet
  2684. ISortedBag          isrtbag.h    Based on AVL KeySortedSet
  2685.    IWSrtBagOnKSSet  isbkss.h     Based on KeySortedSet
  2686. ISortedMap          isrtmap.h    Based on AVL KeySortedSet
  2687.    IWSrtMapOnKSSet  ismkss.h     Based on KeySortedSet
  2688. ISortedRelation     isrtrel.h    Based on KeySortedBag
  2689.                                        on LinkedSequence
  2690.    IWSrtRelOnKSBag  isrksb.h     Based on KeySortedBag
  2691. ISortedSet          isrtset.h    Based on AVL KeySortedSet
  2692.    IWSSetOnKSSet    isskss.h     Based on KeySortedSet
  2693. ITabularTree        itbtree.h    Tabular tree
  2694. IWDequeOnSeq        ideqseq.h    Based on Sequence
  2695. IWPQueOnKSBag       ipquksb.h    Based on KeySortedBag
  2696. IWQueueOnSeq        iqueseq.h    Based on Sequence
  2697. IWStackOnSeq        istkseq.h    Based on Sequence
  2698.  
  2699.  
  2700. ΓòÉΓòÉΓòÉ 2.9. Tutorials ΓòÉΓòÉΓòÉ
  2701.  
  2702. The tutorials provided with the IBM Class Library: Collection Classes can help 
  2703. you to learn the concepts of the Collection Classes. They are presented in the 
  2704. same order as the topics in Part 1 of this book. You should be familiar with 
  2705. the information in the first three chapters of this book before beginning the 
  2706. tutorials. 
  2707.  
  2708. The following topics are discussed: 
  2709.  
  2710. o Tutorials for using the default classes 
  2711. o Tutorials that make more advanced use of the classes 
  2712. o Source files for the tutorials 
  2713. o Examples 
  2714.  
  2715.  
  2716. ΓòÉΓòÉΓòÉ 2.9.1. Using the Default Classes ΓòÉΓòÉΓòÉ
  2717.  
  2718. When you are learning to use a particular collection, you should first use the 
  2719. default class of that collection, so that you can gain a fundamental 
  2720. understanding of the collection before you approach the implementation variants 
  2721. of the collection. 
  2722.  
  2723. You need to understand the topics covered in the following sections in order to 
  2724. successfully complete the tutorials: 
  2725.  
  2726. Tutorial 1     Use of default implementations (Instantiation and Object 
  2727.                Definition) 
  2728. Tutorial 2     Adding, removing and replacing elements in a collection (Adding, 
  2729.                Removing, and Replacing Elements) 
  2730. Tutorial 3     Use of a cursor, locating and accessing elements, and the use of 
  2731.                iterators (Cursors, Using Cursors for Locating and Accessing 
  2732.                Elements, Iterating over Collections) 
  2733. Tutorial 4     Use of exceptions (Exception Handling). 
  2734.  
  2735. After completing the above tutorials, you should be acquainted with the basic 
  2736. features of the Collection Classes. For a more thorough understanding of the 
  2737. Collection Classes, use the tutorials described in Advanced Use. 
  2738.  
  2739.  
  2740. ΓòÉΓòÉΓòÉ 2.9.2. Advanced Use ΓòÉΓòÉΓòÉ
  2741.  
  2742. If you want to understand more advanced uses of the classes, use tutorials 5 
  2743. and 6. You need to understand the topics covered in the following sections in 
  2744. order to successfully complete the tutorials: 
  2745.  
  2746. Tutorial 5     Exchanging implementation variants (Tailoring a Collection 
  2747.                Implementation) 
  2748. Tutorial 6     Using abstract base classes to write polymorphic functions 
  2749.                (Polymorphic Use of Collections). 
  2750.  
  2751.  
  2752. ΓòÉΓòÉΓòÉ 2.9.3. Source Files for the Tutorials ΓòÉΓòÉΓòÉ
  2753.  
  2754. Each tutorial's files are stored in a separate directory. The tutorials are 
  2755. contained in subdirectories with the name ...\tutorial\iclcc\tutor? where ? 
  2756. corresponds to the number of the tutorial (1-6). Every directory contains the 
  2757. following files: 
  2758.  
  2759. read.me             Read this to understand the purpose of the tutorial. 
  2760. instruct.txt        Instructions to follow. 
  2761. makefile            Prepared makefile to compile the example. 
  2762. solution            Directory containing a possible solution. 
  2763.  
  2764. You will find prepared .c and .h files, where certain parts are missing. The 
  2765. objective of the tutorials is to apply the information you have learned about 
  2766. the Collection Classes by adding the missing parts for each file. Complete the 
  2767. prepared files following the instructions in instruct.txt. You can compare your 
  2768. solutions to the solutions found in the solution directory. 
  2769.  
  2770.  
  2771. ΓòÉΓòÉΓòÉ 2.9.4. Source Files for Examples ΓòÉΓòÉΓòÉ
  2772.  
  2773. The examples contained in this book can get you started on particular classes. 
  2774. Source code and makefiles for the examples are located in 
  2775. ...\ibmclass\samples\iclcc. If you want to understand the examples in more 
  2776. detail, you can read through the .c and .h files. 
  2777.  
  2778.  
  2779. ΓòÉΓòÉΓòÉ 2.10. Understanding the Reference Chapters ΓòÉΓòÉΓòÉ
  2780.  
  2781. The reference chapters in this book, with the exception of Flat Collection 
  2782. Functions and Introduction to Trees, follow a standard format. This chapter 
  2783. describes the format for both function and class descriptions. It also lists 
  2784. special types defined by the library that you will need to know about to use 
  2785. the Collection Classes. 
  2786.  
  2787. This chapter discusses the following: 
  2788.  
  2789. o Format of member function descriptions 
  2790. o Format of class descriptions 
  2791. o Types defined for the library 
  2792.  
  2793.  
  2794. ΓòÉΓòÉΓòÉ 2.10.1. Format of Member Function Descriptions ΓòÉΓòÉΓòÉ
  2795.  
  2796. This section describes the member function descriptions found in the following 
  2797. chapters: 
  2798.  
  2799. o Flat Collection Functions 
  2800. o N-ary Tree 
  2801. o Cursor 
  2802. o Pointer and Managed Pointer Classes 
  2803.  
  2804.  
  2805. ΓòÉΓòÉΓòÉ 2.10.1.1. Order of Functions ΓòÉΓòÉΓòÉ
  2806.  
  2807. In each chapter that describes member functions, the functions are ordered as 
  2808. follows: 
  2809.  
  2810.  1. Constructors 
  2811.  2. Copy constructors 
  2812.  3. Destructors 
  2813.  4. Operators 
  2814.  5. Member functions, arranged alphabetically 
  2815.  
  2816.  
  2817. ΓòÉΓòÉΓòÉ 2.10.1.2. Format of Each Function ΓòÉΓòÉΓòÉ
  2818.  
  2819. Each member function consists of the following components: 
  2820.  
  2821.  1. A heading that identifies the name of the function. 
  2822.  
  2823.  2. The function's declaration. This declaration contains the following 
  2824.     information: 
  2825.  
  2826.     a. The return type, if any. 
  2827.     b. The function name, in bold special font. 
  2828.     c. The argument list, if any. Tokens that appear in italics are variable 
  2829.        names. You can use other names instead if you are calling the function. 
  2830.        Tokens that appear in special font are keywords, types, or other tokens 
  2831.        that should not be changed, although they may be omitted where the C++ 
  2832.        language rules permit. 
  2833.     d. The const suffix, if any. 
  2834.  
  2835.  3. An explanation of the action the function performs. 
  2836.  
  2837.  4. Any preconditions the function requires to be met before it is called. 
  2838.  
  2839.  5. Any side effects the function may have on the collection or the cursors 
  2840.     associated with it. 
  2841.  
  2842.  6. The return value of the function, unless the function has a return type of 
  2843.     void (for example, constructors and destructors). 
  2844.  
  2845.  7. Any exceptions the function may throw, if a precondition is violated or if 
  2846.     a system failure or restriction occurs. 
  2847.  
  2848. In the sample member function likeElements below, highlighted numbers and 
  2849. letters correspond to the items in the list and sublist above. The function is 
  2850. not an actual or realistic function of the Collection Class Library, but shows 
  2851. all components of actual member functions.  Note that actual member functions 
  2852. may have only some of the headings identified in the example. 
  2853.  
  2854. likeElements1 
  2855.  
  2856. Boolean2a likeElements2b (
  2857.    Element elementA,
  2858.    Element elementB)2c const2d ;
  2859.  
  2860. Performs a subjective comparison of the contents of element elementA and the 
  2861. contents of element elementB.3 
  2862.  
  2863. Preconditions 
  2864.  
  2865. Both elements must already be contained in the collection.4 
  2866.  
  2867. Side Effects 
  2868.  
  2869. All cursors of the collection become undefined.5 
  2870.  
  2871. Return Value 
  2872.  
  2873. Returns True if the elements are sufficiently similar. Otherwise returns 
  2874. False.6 
  2875.  
  2876. Exceptions 
  2877.  
  2878. o IOutOfMemory 
  2879. o ICursorInvalid7 
  2880.  
  2881.  
  2882. ΓòÉΓòÉΓòÉ 2.10.2. Format of Class Descriptions ΓòÉΓòÉΓòÉ
  2883.  
  2884. This section describes the format of chapters that deal with individual classes 
  2885. or groups of classes. Each such chapter consists of the following components: 
  2886.  
  2887. o The chapter title, which usually refers to the kind of collection being 
  2888.   discussed. 
  2889.  
  2890. o A description of the collection's characteristics, such as whether the 
  2891.   collection is sorted or unsorted, or whether the type and value of the 
  2892.   elements are relevant. 
  2893.  
  2894. o A section on class implementation variants, which provides some or all of the 
  2895.   following information: 
  2896.  
  2897.    - The default implementation, and the classes that you can use to alter the 
  2898.      way the collection is implemented. These variant classes are based on 
  2899.      other abstract data types within the Collection Classes. For example, in 
  2900.      the chapter on heap collections, the class IHeapOnTabularSequence is a 
  2901.      heap collection based on TabularSequence. 
  2902.    - The names of the header files that correspond to particular implementation 
  2903.      variants, so that you can include those files in your source code to make 
  2904.      use of the implementation variants. 
  2905.  
  2906. o A section on template arguments and required parameters, which provides the 
  2907.   following information: 
  2908.  
  2909.    - Template arguments, which identify what parameters you must supply when 
  2910.      you instantiate a particular implementation variant. 
  2911.    - Required functions, which are functions that must be provided by the 
  2912.      element- or key type you use for any implementation variant. For further 
  2913.      information, see Required Functions. 
  2914.  
  2915. o A section on the reference class. The reference class allows you to make use 
  2916.   of polymorphism. This section contains information on include files, template 
  2917.   arguments and required functions similar to the information provided for the 
  2918.   implementation variants described above. In general, reference classes do not 
  2919.   put any additional requirements on the element- and key type.  The 
  2920.   requirements are those of the implementation variant used with the reference 
  2921.   class. 
  2922.  
  2923. o An extract from the declarations file that shows the interface for an 
  2924.   abstraction, its member functions and data members. The name of the default 
  2925.   implementation is used in this extract to represent any of the implementation 
  2926.   variants.  The extracts have been edited for clarity and brevity. You should 
  2927.   include the appropriate implementation variant header file, rather than this 
  2928.   declarations file, in any programs you develop that use any implementation 
  2929.   variant of the abstract data type. For this reason, the name of the 
  2930.   declarations file is not given. 
  2931.  
  2932. o Optionally, a coding example to show you how to use the collection. 
  2933.  
  2934.  
  2935. ΓòÉΓòÉΓòÉ 2.10.2.1. Required Functions ΓòÉΓòÉΓòÉ
  2936.  
  2937. As described in Element Functions and Key Functions, the Collection Classes 
  2938. require that you provide certain functions for the element- and key type. These 
  2939. functions are required by member functions of the Collection Classes to 
  2940. manipulate elements and keys. The functions you must provide depend on the 
  2941. abstraction you use and on the implementation variant you choose. For example, 
  2942. you will usually need to provide a key access for all keyed abstractions, and 
  2943. for a hash table implementation you will need to provide a hash function. 
  2944.  
  2945.  
  2946. ΓòÉΓòÉΓòÉ 2.10.3. Types Defined for the Collection Classes Library ΓòÉΓòÉΓòÉ
  2947.  
  2948. In the header file iglobals.h, the following types are defined for using the 
  2949. library: 
  2950.  
  2951. typedef int IBoolean;
  2952. const IBoolean False = 0;
  2953. const IBoolean True = 1;
  2954. typedef IBoolean Boolean;
  2955.  
  2956. typedef unsigned long INumber;
  2957. typedef unsigned long IPosition;
  2958.  
  2959. enum ITreeIterationOrder {IPreorder, IPostorder}; // for N-ary tree only
  2960.  
  2961. Note:  If your environment defines another Boolean, do the following: 
  2962.  
  2963.  1. Erase the line typedef IBoolean Boolean from your iglobals.h file. 
  2964.  2. Use IBoolean wherever you want to refer to Boolean in the context of the 
  2965.     Collection Classes. 
  2966.  
  2967.  
  2968. ΓòÉΓòÉΓòÉ 3. Reference Manual - Flat Collections ΓòÉΓòÉΓòÉ
  2969.  
  2970. This part contains detailed descriptions of the flat collections of the IBM 
  2971. Class Library: Collection Classes. 
  2972.  
  2973. Flat Collection Functions describes the common member functions for flat 
  2974. collections. Subsequent chapters describe individual collection classes. 
  2975.  
  2976. For information on the organization of chapters that describe individual 
  2977. abstract data types, see Format of Class Descriptions. 
  2978.  
  2979. The following flat collections are described in this part: 
  2980.  
  2981. o Bag 
  2982. o Deque 
  2983. o Equality sequence 
  2984. o Heap 
  2985. o Key bag 
  2986. o Key set 
  2987. o Key sorted bag 
  2988. o Key sorted set 
  2989. o Map 
  2990. o Priority queue 
  2991. o Queue 
  2992. o Relation 
  2993. o Sequence 
  2994. o Set 
  2995. o Sorted bag 
  2996. o Sorted map 
  2997. o Sorted relation 
  2998. o Sorted set 
  2999. o Stack 
  3000.  
  3001.  
  3002. ΓòÉΓòÉΓòÉ 3.1. Flat Collection Functions ΓòÉΓòÉΓòÉ
  3003.  
  3004. Some of the terms used in this chapter are defined below. You can also use the 
  3005. Glossary to look up terms you are unfamiliar with. 
  3006.  
  3007. This chapter lists all the functions of flat collections and defines some of 
  3008. the terms used. 
  3009.  
  3010.  
  3011. ΓòÉΓòÉΓòÉ 3.1.1. Terms Used ΓòÉΓòÉΓòÉ
  3012.  
  3013. CLASS_BASE_NAME Represents the name of the class without any template 
  3014.                 arguments, of which the function is a member. 
  3015. CLASS_NAME      Represents the name of the class with template arguments of 
  3016.                 which the function is a member. 
  3017. equal element   Refers to equality of elements as defined by the equality 
  3018.                 operation or ordering relation provided for the element type 
  3019.                 (see Element Functions and Key Functions). It is not defined 
  3020.                 whether the equality operation or the ordering relation is used 
  3021.                 to determine element equality in cases where both are provided. 
  3022. given ...       Refers to an argument of the described function, such as given 
  3023.                 element, given key, or given collection. 
  3024. iteration order The order in which elements are visited in allElementsDo and 
  3025.                 setToNext or setToPrevious. 
  3026.  
  3027.                 In ordered collections the element at position 1 will be 
  3028.                 visited first, then the element at position 2, and so on. 
  3029.                 Sorted collections, in particular, are visited following the 
  3030.                 ordering relation provided for the element type. 
  3031.  
  3032.                 In collections that are not ordered the elements are visited in 
  3033.                 an arbitrary order. Each element is visited exactly once. 
  3034. positioning property The property of an element that is used to position the 
  3035.                 element in a collection. For key collections, the positioning 
  3036.                 property is key equality. For non-sequential collections with 
  3037.                 element equality the positioning property is element equality. 
  3038.                 Other collections have no positioning property. 
  3039. same key        Refers to equality of keys as defined by the equality operation 
  3040.                 or ordering relation provided for the key type (see Element 
  3041.                 Functions and Key Functions). It is not defined whether the 
  3042.                 equality operation or the ordering relation will be used to 
  3043.                 determine key equality in case where both are provided. 
  3044. this collection The collection to which a function is applied.  Contrast with 
  3045.                 the given collection, which is an argument supplied to a 
  3046.                 function. The collection is used synonymously with this 
  3047.                 collection. 
  3048. undefined cursor Indicates that it is undefined whether the cursor is 
  3049.                 invalidated or remains valid.  Even if it remains valid, it may 
  3050.                 refer to a different element than before, or even to no element 
  3051.                 of the collection. You should not use cursors, once they become 
  3052.                 undefined, in functions that require the cursor to point to an 
  3053.                 element of the collection. 
  3054.  
  3055.  
  3056. ΓòÉΓòÉΓòÉ 3.1.2. Flat Collection Member Functions ΓòÉΓòÉΓòÉ
  3057.  
  3058. Each flat collection implements some or all of the member functions described 
  3059. in this chapter.  You can tell which functions a particular flat collection 
  3060. implements by looking at the declarations in the header file for that class. 
  3061.  
  3062. The following member functions are described: 
  3063.  
  3064. Constructor
  3065. Copy Constructor
  3066. Destructor
  3067. operator!=
  3068. operator=
  3069. operator==
  3070. add
  3071. addAllFrom
  3072. addAsFirst
  3073. addAsLast
  3074. addAsNext
  3075. addAsPrevious
  3076. addAtPosition
  3077. addDifference
  3078. addIntersection
  3079. addOrReplaceElementWithKey
  3080. addUnion
  3081. allElementsDo
  3082. allElementsDo
  3083. anyElement
  3084. compare
  3085. contains
  3086. containsAllFrom
  3087. containsAllKeysFrom
  3088. containsElementWithKey
  3089. copy
  3090. dequeue
  3091. differenceWith
  3092. elementAt
  3093. elementAtPosition
  3094. elementWithKey
  3095. enqueue
  3096. firstElement
  3097. intersectionWith
  3098. isbounded
  3099. isEmpty
  3100. isFirst
  3101. isFull
  3102. isLast
  3103. key
  3104. lastElement
  3105. locate
  3106. locateElementWithKey
  3107. locateFirst
  3108. locateLast
  3109. locateNext
  3110. locateNextElementWithKey
  3111. locateOrAdd
  3112. locateOrAddElementWithKey
  3113. locatePrevious
  3114. maxNumberOfElements
  3115. newCursor
  3116. numberOfDifferentElements
  3117. numberOfDifferentKeys
  3118. numberOfElements
  3119. numberOfElementsWithKey
  3120. numberOfOccurrences
  3121. pop
  3122. push
  3123. remove
  3124. removeAllElementsWithKey
  3125. removeAllOccurrences
  3126. removeAll
  3127. removeAll
  3128. removeAt
  3129. removeAtPosition
  3130. removeElementWithKey
  3131. removeFirst
  3132. removeLast
  3133. replaceAt
  3134. replaceElementWithKey
  3135. setToFirst
  3136. setToLast
  3137. setToNext
  3138. setToNextDifferentElement
  3139. setToNextWithDifferentKey
  3140. setToPosition
  3141. setToPrevious
  3142. sort
  3143. top
  3144. unionWith
  3145.  
  3146.  
  3147. ΓòÉΓòÉΓòÉ 3.1.2.1. Constructor ΓòÉΓòÉΓòÉ
  3148.  
  3149. CLASS_BASE_NAME ( INumber numberOfElements = 100 ) ;
  3150.  
  3151. Constructs a collection. numberOfElments is the estimated maximum number of 
  3152. elements contained in the collection. The collection is unbounded and is 
  3153. initially empty. If the estimated maximum is exceeded, the collection is 
  3154. automatically enlarged. 
  3155.  
  3156. Note:  The collection constructor does not define whether any elements are 
  3157. constructed when the collection is constructed. For some classes, the element's 
  3158. default constructor may be invoked when the collection's constructor is 
  3159. invoked.  This is done, for example, when initializing empty elements in 
  3160. advance in a tabular implementation. 
  3161.  
  3162. Exception 
  3163.  
  3164. IOutOfMemory 
  3165.  
  3166.  
  3167. ΓòÉΓòÉΓòÉ 3.1.2.2. Copy Constructor ΓòÉΓòÉΓòÉ
  3168.  
  3169. CLASS_BASE_NAME ( CLASS_NAME const& collection ) ;
  3170.  
  3171. Constructs a collection and copies all elements from the given collection into 
  3172. the collection as described for addAllFrom. 
  3173.  
  3174. Exception 
  3175.  
  3176. IOutOfMemory 
  3177.  
  3178.  
  3179. ΓòÉΓòÉΓòÉ 3.1.2.3. Destructor ΓòÉΓòÉΓòÉ
  3180.  
  3181. ~CLASS_BASE_NAME ( ) ;
  3182.  
  3183. Removes all elements from the collection. Destructors are called for all 
  3184. elements contained in the collection and for elements that have been 
  3185. constructed in advance (see Constructor). 
  3186.  
  3187. Side Effects 
  3188.  
  3189. All cursors of the collection become undefined. 
  3190.  
  3191.  
  3192. ΓòÉΓòÉΓòÉ 3.1.2.4. operator!= ΓòÉΓòÉΓòÉ
  3193.  
  3194. Boolean operator != ( CLASS_NAME const& collection ) const;
  3195.  
  3196. Returns True if the given collection is not equal to the collection. For a 
  3197. definition of equality for collections, see operator==. 
  3198.  
  3199.  
  3200. ΓòÉΓòÉΓòÉ 3.1.2.5. operator= ΓòÉΓòÉΓòÉ
  3201.  
  3202. CLASS_NAME& operator= ( CLASS_NAME const& collection ) ;
  3203.  
  3204. Copies the given collection to the collection. Removes all elements from the 
  3205. collection and adds the elements from the given collection as described for 
  3206. addAllFrom. 
  3207.  
  3208. Preconditions 
  3209.  
  3210. o If the collection is bounded then numberOfElements of the given colelction 
  3211.   must be less than maxNumberOfElements of this collection. 
  3212.  
  3213. Side Effects 
  3214.  
  3215. All cursors of this collection become undefined. 
  3216.  
  3217. Return Value 
  3218.  
  3219. Returns a reference to the collection. 
  3220.  
  3221. Exceptions 
  3222.  
  3223. o IOutOfMemory 
  3224. o IFullException, if the collection is bounded 
  3225.  
  3226.  
  3227. ΓòÉΓòÉΓòÉ 3.1.2.6. operator== ΓòÉΓòÉΓòÉ
  3228.  
  3229. Boolean operator== ( CLASS_NAME const& collection ) const;
  3230.  
  3231. Returns True if the given collection is equal to the collection. Two 
  3232. collections are equal if the number of elements in each collection is the same, 
  3233. and if the condition for the collection is described in the following list: 
  3234.  
  3235. Type of Collection    Condition 
  3236. Unique Elements       If the collections have unique elements, any element that 
  3237.                       occurs in one collection must occur in the other 
  3238.                       collection. 
  3239. Non-Unique Elements   If an element has N occurrences in one collection it must 
  3240.                       have exactly N occurrences in the other collection. 
  3241. Sequential            The ordering of the elements is the same for both 
  3242.                       collections. 
  3243.  
  3244.  
  3245. ΓòÉΓòÉΓòÉ 3.1.2.7. add ΓòÉΓòÉΓòÉ
  3246.  
  3247. Boolean add ( Element const& element ) ;
  3248.  
  3249. Boolean add ( Element const& element,
  3250.    ICursor& cursor ) ;
  3251.  
  3252. If the collection is unique (with respect to elements or keys) and the element 
  3253. or key is already contained in the collection, sets the cursor to the existing 
  3254. element in the collection without adding the element. Otherwise, it adds the 
  3255. element to the collection and sets the cursor to the added element. In 
  3256. sequential collections, the given element is added as the last element. In 
  3257. sorted collections, the element is added at a position determined by the 
  3258. element or key value. Adding an element will either use the element's copy 
  3259. constructor or the assignment operator provided for the element type, depending 
  3260. on the implementation variant you choose. See contains for the definition of 
  3261. element or key containment. 
  3262.  
  3263. Preconditions 
  3264.  
  3265. o The cursor must belong to the collection. 
  3266. o If the collection is bounded and unique, the element or key must exist or 
  3267.   (numberOfElements < maxNumberOfElements). 
  3268. o If the collection is bounded and nonunique, then 
  3269.   (numberOfElements < maxNumberOfElements). 
  3270. o If the collection is a map and contains an element with the same key as the 
  3271.   given element, then this element must be equal to the given element. 
  3272.  
  3273. Side Effects 
  3274.  
  3275. If an element was added, all cursors of this collection, except the given 
  3276. cursor, become undefined. 
  3277.  
  3278. Return Value 
  3279.  
  3280. Returns True if the element was added. 
  3281.  
  3282. Exceptions 
  3283.  
  3284. o IOutOfMemory 
  3285. o ICursorInvalidException 
  3286. o IFullException, if the collection is bounded 
  3287. o IKeyAlreadyExistsException, if the collection is a map 
  3288.  
  3289.  
  3290. ΓòÉΓòÉΓòÉ 3.1.2.8. addAllFrom ΓòÉΓòÉΓòÉ
  3291.  
  3292. void addAllFrom ( CLASS_NAME const& collection ) ;
  3293.  
  3294. void addAllFrom (
  3295.    IACollection <Element> const& collection ) ;
  3296.  
  3297. Adds (copies) all elements of the given collection to the collection. The 
  3298. elements are added in the iteration order of the given collection. The contents 
  3299. of the elements, as opposed to the pointers to the elements, are copied. The 
  3300. elements are added according to the definition of add for this collection. The 
  3301. given collection is not changed. 
  3302.  
  3303. Preconditions 
  3304.  
  3305. Since the elements are added one by one, the following preconditions are tested 
  3306. for each individual add operation: 
  3307.  
  3308. o If the collection is bounded and unique, the element or key must exist or 
  3309.   (numberOfElements < maxNumberOfElements). 
  3310. o If the collection is bounded and nonunique, then 
  3311.   (numberOfElements < maxNumberOfElements). 
  3312. o If the collection is a map and contains an element with the same key as the 
  3313.   given element, then this element must be equal to the given element. 
  3314.  
  3315. Side Effects 
  3316.  
  3317. If any elements were added, all cursors of this collection become undefined. 
  3318.  
  3319. Exceptions 
  3320.  
  3321. o IOutOfMemory 
  3322. o IIdenticalCollectionException 
  3323. o IFullException, if the collection is bounded 
  3324. o IKeyAlreadyExistsException, if the collection is a map 
  3325.  
  3326.  
  3327. ΓòÉΓòÉΓòÉ 3.1.2.9. addAsFirst ΓòÉΓòÉΓòÉ
  3328.  
  3329. void addAsFirst ( Element const& element ) ;
  3330.  
  3331. void addAsFirst ( Element const& element,
  3332.    ICursor& cursor ) ;
  3333.  
  3334. Adds the element to the collection as the first element in sequential order. 
  3335. Sets the cursor to the added element. 
  3336.  
  3337. Preconditions 
  3338.  
  3339. o The cursor must belong to the collection. 
  3340. o If the collection is bounded, 
  3341.  
  3342.   Side Effects 
  3343.  
  3344.   All cursors of this collection, except the given cursor, become undefined. 
  3345.   (numberOfElements < maxNumberOfElements). 
  3346.  
  3347. Exceptions 
  3348.  
  3349. o ICursorInvalidException 
  3350. o IOutOfMemory 
  3351. o IFullException, if the collection is bounded 
  3352.  
  3353.  
  3354. ΓòÉΓòÉΓòÉ 3.1.2.10. addAsLast ΓòÉΓòÉΓòÉ
  3355.  
  3356. void addAsLast ( Element const& element ) ;
  3357.  
  3358. void addAsLast ( Element const& element,
  3359.    ICursor& cursor ) ;
  3360.  
  3361. Adds the element to the collection as the last element in sequential order. 
  3362. Sets the cursor to the added element. 
  3363.  
  3364. Preconditions 
  3365.  
  3366. o The cursor must belong to the collection. 
  3367. o If the collection is bounded, (numberOfElements < maxNumberOfElements). 
  3368.  
  3369. Side Effects 
  3370.  
  3371. All cursors of this collection, except the given cursor, become undefined. 
  3372.  
  3373. Exceptions 
  3374.  
  3375. o ICursorInvalidException 
  3376. o IOutOfMemory 
  3377. o IFullException, if the collection is bounded 
  3378.  
  3379.  
  3380. ΓòÉΓòÉΓòÉ 3.1.2.11. addAsNext ΓòÉΓòÉΓòÉ
  3381.  
  3382. void addAsNext ( Element const& element,
  3383.    ICursor& cursor ) ;
  3384.  
  3385. Adds the element to the collection as the element following element pointed to 
  3386. by the cursor. Sets the cursor to the added element. 
  3387.  
  3388. Preconditions 
  3389.  
  3390. o The cursor must belong to the collection and must point to an element of the 
  3391.   collection. 
  3392. o If the collection is bounded, (numberOfElements < maxNumberOfElements). 
  3393.  
  3394. Side Effects 
  3395.  
  3396. All cursors of this collection, except the given cursor, become undefined. 
  3397.  
  3398. Exceptions 
  3399.  
  3400. o IOutOfMemory 
  3401. o ICursorInvalidException 
  3402. o IFullException, if the collection is bounded 
  3403.  
  3404.  
  3405. ΓòÉΓòÉΓòÉ 3.1.2.12. addAsPrevious ΓòÉΓòÉΓòÉ
  3406.  
  3407. void addAsPrevious ( Element const& element,
  3408.    ICursor& cursor ) ;
  3409.  
  3410. Adds the element to the collection as the element preceding the element pointed 
  3411. to by the cursor. Sets the cursor to the added element. 
  3412.  
  3413. Preconditions 
  3414.  
  3415. o The cursor must belong to the collection and must point to an element of the 
  3416.   collection. 
  3417. o If the collection is bounded, (numberOfElements < maxNumberOfElements). 
  3418.  
  3419. Side Effects 
  3420.  
  3421. All cursors of this collection, except the given cursor, become undefined. 
  3422.  
  3423. Exceptions 
  3424.  
  3425. o IOutOfMemory 
  3426. o ICursorInvalidException 
  3427. o IFullException, if the collection is bounded 
  3428.  
  3429.  
  3430. ΓòÉΓòÉΓòÉ 3.1.2.13. addAtPosition ΓòÉΓòÉΓòÉ
  3431.  
  3432. void addAtPosition ( IPosition position,
  3433.    Element const& element ) ;
  3434.  
  3435. void addAtPosition ( IPosition position,
  3436.    Element const& element, ICursor& cursor ) ;
  3437.  
  3438. Adds the element at the given position to the collection. If an element exists 
  3439. at the given position, the new element will be added as the element preceding 
  3440. the existing element. 
  3441.  
  3442. Sets the cursor to the added element. 
  3443.  
  3444. Position 1 specifies the first element. 
  3445.  
  3446. Preconditions 
  3447.  
  3448. o The cursor must belong to the collection. 
  3449. o (1 =< position =< numberOfElements + 1). 
  3450. o If the collection is bounded, (numberOfElements < maxNumberOfElements). 
  3451.  
  3452. Side Effects 
  3453.  
  3454. All cursors of this collection become undefined except the given cursor. 
  3455.  
  3456. Exceptions 
  3457.  
  3458. o IOutOfMemory.exmp. 
  3459. o ICursorInvalidException 
  3460. o IPositionInvalidException 
  3461. o IFullException, if the collection is bounded 
  3462.  
  3463.  
  3464. ΓòÉΓòÉΓòÉ 3.1.2.14. addDifference ΓòÉΓòÉΓòÉ
  3465.  
  3466. void addDifference ( CLASS_NAME const& collection1,
  3467.    CLASS_NAME const& collection2 ) ;
  3468.  
  3469. Creates the difference between the two given collections, and adds this 
  3470. difference to the collection. The contents of the added elements, as opposed to 
  3471. the pointers to those elements, are copied. 
  3472.  
  3473. For a definition of the difference between two collections, see differenceWith. 
  3474.  
  3475. Preconditions 
  3476.  
  3477. Since the elements are added one by one, the following preconditions are tested 
  3478. for each individual addition. 
  3479.  
  3480. o If the collection is bounded and unique, the element or key must exist or 
  3481.   (numberOfElements < maxNumberOfElements). 
  3482. o If the collection is bounded and nonunique, then 
  3483.   (numberOfElements < maxNumberOfElements). 
  3484. o If the collection is a map and contains an element with the same key as the 
  3485.   given element, then this element must be equal to the given element. 
  3486.  
  3487. Side Effects 
  3488.  
  3489. If any elements were added, all cursors of this collection become undefined. 
  3490.  
  3491. Exceptions 
  3492.  
  3493. o IOutOfMemory 
  3494. o IFullException, if the collection is bounded 
  3495. o IKeyAlreadyExistsException, if the collection is a map 
  3496.  
  3497.  
  3498. ΓòÉΓòÉΓòÉ 3.1.2.15. addIntersection ΓòÉΓòÉΓòÉ
  3499.  
  3500. void addIntersection ( CLASS_NAME const& collection1,
  3501.    CLASS_NAME const& collection2 ) ;
  3502.  
  3503. Creates the intersection of the two given collections, and adds this 
  3504. intersection to the collection. The contents of the added elements, as opposed 
  3505. to the pointers to those elements, are copied. 
  3506.  
  3507. For a definition of the intersection of two collections, see intersectionWith. 
  3508.  
  3509. Preconditions 
  3510.  
  3511. Since the elements are added one by one, the following preconditions are tested 
  3512. for each individual addition. 
  3513.  
  3514. o If the collection is bounded and unique, the element or key must exist or 
  3515.   (numberOfElements < maxNumberOfElements). 
  3516. o If the collection is bounded and nonunique, then 
  3517.   (numberOfElements < maxNumberOfElements). 
  3518. o If the collection is a map and contains an element with the same key as the 
  3519.   given element, then this element must be equal to the given element. 
  3520.  
  3521. Side Effects 
  3522.  
  3523. If any elements were added, all cursors of this collection become undefined. 
  3524.  
  3525. Exceptions 
  3526.  
  3527. o IOutOfMemory 
  3528. o IFullException, if the collection is bounded 
  3529. o IKeyAlreadyExistsException, if the collection is a map 
  3530.  
  3531.  
  3532. ΓòÉΓòÉΓòÉ 3.1.2.16. addOrReplaceElementWithKey ΓòÉΓòÉΓòÉ
  3533.  
  3534. Boolean addOrReplaceElementWithKey (
  3535.    Element const& element ) const;
  3536.  
  3537. Boolean addOrReplaceElementWithKey (
  3538.    Element const& element, ICursor& cursor ) ;
  3539.  
  3540. If an element is contained in the collection where the key is equal to the key 
  3541. of the given element, sets the cursor to this element in the collection and 
  3542. replaces it with the given element. Otherwise, it adds the given element to the 
  3543. collection, and sets the cursor to the added element. If the given element is 
  3544. added, the contents of the element, as opposed to a pointer to it, is added. 
  3545.  
  3546. Preconditions 
  3547.  
  3548. o The cursor must belong to the collection. 
  3549. o If the collection is bounded, an element with the given key must be contained 
  3550.   in the collection, or (numberOfElements < maxNumberOfElements). 
  3551.  
  3552. Side Effects 
  3553.  
  3554. If the element was added, all cursors of this collection, except the given 
  3555. cursor, become undefined. 
  3556.  
  3557. Return Value 
  3558.  
  3559. Returns True if the element was added. cp 3 
  3560.  
  3561. Exceptions 
  3562.  
  3563. o IOutOfMemory 
  3564. o ICursorInvalidException 
  3565. o IFullException, if the collection is bounded 
  3566.  
  3567.  
  3568. ΓòÉΓòÉΓòÉ 3.1.2.17. addUnion ΓòÉΓòÉΓòÉ
  3569.  
  3570. void addUnion (  CLASS_NAME const& collection1,
  3571.    CLASS_NAME const& collection2 ) ;
  3572.  
  3573. Creates the union of the two given collections, and adds this union to the 
  3574. collection. The contents of the added elements, as opposed to the pointers to 
  3575. those elements, are copied. 
  3576.  
  3577. For a definition of the union of two collections, see unionWith. 
  3578.  
  3579. Preconditions 
  3580.  
  3581. Since the elements are added one by one, the following preconditions are tested 
  3582. for each individual addition. 
  3583.  
  3584. o If the collection is bounded and unique, the element or key must exist or 
  3585.   (numberOfElements < maxNumberOfElements). 
  3586. o If the collection is bounded and nonunique, then 
  3587.   (numberOfElements < maxNumberOfElements). 
  3588. o If the collection is a map and contains an element with the same key as the 
  3589.   given element, then this element must be equal to the given element. 
  3590.  
  3591. Side Effects 
  3592.  
  3593. If any elements were added, all cursors of this collection become undefined. 
  3594.  
  3595. Exceptions 
  3596.  
  3597. o IOutOfMemory 
  3598. o IFullException, if the collection is bounded 
  3599. o IKeyAlreadyExistsException, if the collection is a map 
  3600.  
  3601.  
  3602. ΓòÉΓòÉΓòÉ 3.1.2.18. allElementsDo ΓòÉΓòÉΓòÉ
  3603.  
  3604. Boolean allElementsDo (
  3605.    Boolean (*function) (Element&, void*),
  3606.    void* additionalArgument = 0 ) ;
  3607.  
  3608. Boolean allElementsDo (
  3609.    Boolean (*function) (Element const&, void*),
  3610.    void* additionalArgument = 0  ) const;
  3611.  
  3612. Calls the given function for all elements in the collection until the given 
  3613. function returns False. The elements are visited in iteration order. Additional 
  3614. arguments can be passed to the given function using additionalArgument. The 
  3615. additional argument defaults to zero if no additional argument is given. 
  3616.  
  3617. Note: 
  3618.  
  3619.  1. The given function must not remove elements from or add them to the 
  3620.     collection. If you want to remove elements, you can use the removeAll 
  3621.     function with a property argument. For further information see removeAll. 
  3622.  
  3623.  2. For the non-const version of allElementsDo, the given function must not 
  3624.     manipulate the element in the collection in a way that changes the 
  3625.     positioning property of the element. 
  3626.  
  3627. Return Value 
  3628.  
  3629. Returns True if the given function returns True for every element it is applied 
  3630. to. 
  3631.  
  3632.  
  3633. ΓòÉΓòÉΓòÉ 3.1.2.19. allElementsDo ΓòÉΓòÉΓòÉ
  3634.  
  3635. Boolean allElementsDo (
  3636.    IIterator <Element>& iterator ) ;
  3637.  
  3638. Boolean allElementsDo (
  3639.    IConstantIterator <Element>& iterator ) const;
  3640.  
  3641. Calls the applyTo function of the given iterator for all elements of the 
  3642. collection until the applyTo function returns False. The elements are visited 
  3643. in iteration order. Additional arguments may be passed as arguments to the 
  3644. constructor of the derived iterator class (for further details see Iteration 
  3645. Using Iterators). 
  3646.  
  3647. Note: 
  3648.  
  3649.  1. The applyTo function must not remove elements from or add elements to the 
  3650.     collection. If you want to remove elements, you can use the removeAll 
  3651.     function with a property argument. For further information see removeAll. 
  3652.  
  3653.  2. For the non-const version of allElementsDo, the applyTo function must not 
  3654.     manipulate the element in the collection in a way that changes the 
  3655.     positioning property of the element. 
  3656.  
  3657. Return Value 
  3658.  
  3659. Returns True if the applyTo function returns True for every element it is 
  3660. applied to. 
  3661.  
  3662.  
  3663. ΓòÉΓòÉΓòÉ 3.1.2.20. anyElement ΓòÉΓòÉΓòÉ
  3664.  
  3665. Element const& anyElement ( ) const;
  3666.  
  3667. Returns a reference to an arbitrary element of the collection. 
  3668.  
  3669. Precondition 
  3670.  
  3671. The collection must not be empty. 
  3672.  
  3673. Exception 
  3674.  
  3675. IEmptyException 
  3676.  
  3677.  
  3678. ΓòÉΓòÉΓòÉ 3.1.2.21. compare ΓòÉΓòÉΓòÉ
  3679.  
  3680. long compare ( CLASS_NAME const& collection,
  3681.    long (*comparisonFunction)
  3682.  (Element const& element1,Element const& element2)
  3683.    ) const;
  3684.  
  3685. Lexicographically compares the collection with the given collection. Comparison 
  3686. yields <0 if the collection is less than the given collection, 0 if the 
  3687. collection is equal to the given collection, and >0 if the collection is 
  3688. greater than the given collection. Lexicographic comparison is defined by the 
  3689. first pair of corresponding elements, in both collections, that are not equal. 
  3690. If such a pair exists, the collection with the greater element is the greater 
  3691. one. Otherwise, the collection with more elements is the greater one. 
  3692.  
  3693. Note:  The given comparison function must return a result according to the 
  3694. following rules: 
  3695.  
  3696. >0        if element1 > element2, 
  3697. 0         if element1 == element2, 
  3698. <0        if element1 < element2. 
  3699.  
  3700. Return Value 
  3701.  
  3702. Returns the result of the collection comparison. 
  3703.  
  3704.  
  3705. ΓòÉΓòÉΓòÉ 3.1.2.22. contains ΓòÉΓòÉΓòÉ
  3706.  
  3707. Boolean contains ( Element const& element ) const;
  3708.  
  3709. Returns True if the collection contains an element equal to the given element. 
  3710.  
  3711.  
  3712. ΓòÉΓòÉΓòÉ 3.1.2.23. containsAllFrom ΓòÉΓòÉΓòÉ
  3713.  
  3714. Boolean containsAllFrom (
  3715.    CLASS_NAME const& collection ) const;
  3716.  
  3717. Boolean containsAllFrom (
  3718.    IACollection <Element> const& collection ) const;
  3719.  
  3720. Returns True if all the elements of the given collection are contained in the 
  3721. collection. The definition of containment is described in contains. 
  3722.  
  3723.  
  3724. ΓòÉΓòÉΓòÉ 3.1.2.24. containsAllKeysFrom ΓòÉΓòÉΓòÉ
  3725.  
  3726. Boolean containsAllKeysFrom (
  3727.    CLASS_NAME const& collection ) const;
  3728.  
  3729. Boolean containsAllKeysFrom (
  3730.    IACollection <Element> const& collection ) const;
  3731.  
  3732. Returns True if all of the keys of the given collection are contained in the 
  3733. collection. 
  3734.  
  3735.  
  3736. ΓòÉΓòÉΓòÉ 3.1.2.25. containsElementWithKey ΓòÉΓòÉΓòÉ
  3737.  
  3738. Boolean containsElementWithKey ( Key const& key ) const;
  3739.  
  3740. Returns True if the collection contains an element with the same key as the 
  3741. given key. 
  3742.  
  3743.  
  3744. ΓòÉΓòÉΓòÉ 3.1.2.26. copy ΓòÉΓòÉΓòÉ
  3745.  
  3746. void copy ( IACollection <Element> const& collection ) ;
  3747.  
  3748. Copies the given collection to this collection. copy removes all elements from 
  3749. this collection, and adds the elements from the given collection. For 
  3750. information on how adding is done see addAllFrom. 
  3751.  
  3752. Note:  The given collection may be of another concrete type than the collection 
  3753. itself. In this case, copying implicitly performs a conversion. If, for 
  3754. example, the given collection is a bag and the collection itself is a set, 
  3755. elements with multiple occurrences in the copied bag will only occur once in 
  3756. the resulting set. 
  3757.  
  3758. Preconditions 
  3759.  
  3760. Since the elements are copied one by one, the following preconditions are 
  3761. tested for each individual copy operation: 
  3762.  
  3763. o If the collection is bounded and unique, the element or key must exist or 
  3764.   (numberOfElements < maxNumberOfElements). 
  3765. o If the collection is bounded and nonunique, then 
  3766.   (numberOfElements < maxNumberOfElements). 
  3767. o If the collection is a map and contains an element with the same key as the 
  3768.   given element, then this element must be equal to the given element. 
  3769.  
  3770. Side Effects 
  3771.  
  3772. All cursors of this collection become undefined. 
  3773.  
  3774. Exceptions 
  3775.  
  3776. o IOutOfMemory 
  3777. o IFullException, if the collection is bounded 
  3778. o IKeyAlreadyExistsException, if the collection has unique keys. This exception 
  3779.   may be thrown, for example, when copying a bag into a map.) 
  3780.  
  3781.  
  3782. ΓòÉΓòÉΓòÉ 3.1.2.27. dequeue ΓòÉΓòÉΓòÉ
  3783.  
  3784. void dequeue ( ) ;
  3785.  
  3786. void dequeue ( Element& element ) ;
  3787.  
  3788. Copies the first element of the collection to the given element, and removes it 
  3789. from the collection. 
  3790.  
  3791. Precondition 
  3792.  
  3793. The collection must not be empty. 
  3794.  
  3795. Side Effects 
  3796.  
  3797. All cursors of this collection become undefined. 
  3798.  
  3799. Exception 
  3800.  
  3801. IEmptyException 
  3802.  
  3803.  
  3804. ΓòÉΓòÉΓòÉ 3.1.2.28. differenceWith ΓòÉΓòÉΓòÉ
  3805.  
  3806. void differenceWith ( CLASS_NAME const& collection ) ;
  3807.  
  3808. Makes the collection the difference between the collection and the given 
  3809. collection. The difference of A and B (A minus B) is the set of elements that 
  3810. are contained in A but not in B. 
  3811.  
  3812. The following rule applies for bags with duplicate elements: If bag P contains 
  3813. the element X m times and bag Q contains the element X n times, then the 
  3814. difference of P and Q contains the element X m-n times if m > n, and zero times 
  3815. if m=<n. 
  3816.  
  3817. Side Effects 
  3818.  
  3819. If any elements were removed, all cursors of this collection become undefined. 
  3820.  
  3821.  
  3822. ΓòÉΓòÉΓòÉ 3.1.2.29. elementAt ΓòÉΓòÉΓòÉ
  3823.  
  3824. Element& elementAt ( ICursor const& cursor ) ;
  3825.  
  3826. Element const& elementAt ( ICursor const& cursor ) const;
  3827.  
  3828. Returns a reference to the element pointed to by the given cursor. 
  3829.  
  3830. Note:  For the version of elementAt without the const suffix, do not manipulate 
  3831. the element or the key of the element in the collection in a way that changes 
  3832. the positioning property of the element. 
  3833.  
  3834. Precondition 
  3835.  
  3836. The cursor must belong to the collection and must point to an element of the 
  3837. collection. 
  3838.  
  3839. Exception 
  3840.  
  3841. ICursorInvalidException 
  3842.  
  3843.  
  3844. ΓòÉΓòÉΓòÉ 3.1.2.30. elementAtPosition ΓòÉΓòÉΓòÉ
  3845.  
  3846. Element const& elementAtPosition (
  3847.    IPosition position ) const;
  3848.  
  3849. Returns a reference to the element at the given position in the collection. 
  3850.  
  3851. Position 1 specifies the first element. 
  3852.  
  3853. Position must be a valid position in the collection, that is, 
  3854. (1 =< position =< numberOfElements). 
  3855.  
  3856. Precondition 
  3857.  
  3858. (1 =< position =< numberOfElements). 
  3859.  
  3860. Exception 
  3861.  
  3862. IPositionInvalidException 
  3863.  
  3864.  
  3865. ΓòÉΓòÉΓòÉ 3.1.2.31. elementWithKey ΓòÉΓòÉΓòÉ
  3866.  
  3867. Element& elementWithKey ( Key const& key ) ;
  3868.  
  3869. Element const& elementWithKey ( Key const& key ) const;
  3870.  
  3871. Returns a reference to an element specified by the key. 
  3872.  
  3873. Note: 
  3874.  
  3875.  1. For the version of elementWithKey without a const suffix, do not manipulate 
  3876.     the element in the collection in a way that changes the positioning 
  3877.     property of the element. 
  3878.  
  3879.  2. If there are several elements with the given key, an arbitrary one is 
  3880.     returned. 
  3881.  
  3882. Precondition 
  3883.  
  3884. The given key is contained in the collection. 
  3885.  
  3886. Exception 
  3887.  
  3888. IKeyNotContainedException 
  3889.  
  3890.  
  3891. ΓòÉΓòÉΓòÉ 3.1.2.32. enqueue ΓòÉΓòÉΓòÉ
  3892.  
  3893. void enqueue ( Element const& element ) ;
  3894.  
  3895. void enqueue ( Element const& element,
  3896.    ICursor& cursor ) ;
  3897.  
  3898. Adds the element to the collection, and sets the cursor to the added element. 
  3899. For ordinary queues, the given element is added as the last element. For 
  3900. priority queues, the element is added at a position determined by the ordering 
  3901. relation provided for the element or key type. 
  3902.  
  3903. Preconditions 
  3904.  
  3905. o The cursor must belong to the collection. 
  3906. o If the collection is bounded, (numberOfElements < maxNumberOfElements). 
  3907.  
  3908. Side Effects 
  3909.  
  3910. All cursors of this collection except the given cursor become undefined. 
  3911.  
  3912. Exceptions 
  3913.  
  3914. o IOutOfMemory 
  3915. o ICursorInvalidException 
  3916. o IFullException, if the collection is bounded 
  3917.  
  3918.  
  3919. ΓòÉΓòÉΓòÉ 3.1.2.33. firstElement ΓòÉΓòÉΓòÉ
  3920.  
  3921. Element const& firstElement ( ) const;
  3922.  
  3923. Returns a reference to the first element of the collection. 
  3924.  
  3925. Precondition 
  3926.  
  3927. The collection must not be empty. 
  3928.  
  3929. Exception 
  3930.  
  3931. IEmptyException 
  3932.  
  3933.  
  3934. ΓòÉΓòÉΓòÉ 3.1.2.34. intersectionWith ΓòÉΓòÉΓòÉ
  3935.  
  3936. void intersectionWith ( CLASS_NAME const& collection ) ;
  3937.  
  3938. Makes the collection the intersection of the collection and the given 
  3939. collection. The intersection of A and B is the set of elements that is 
  3940. contained in both A and B. 
  3941.  
  3942. The following rule applies for bags with duplicate elements: If bag P contains 
  3943. the element X m times and bag Q contains the element X n times, the 
  3944. intersection of P and Q contains the element X MIN(m,n) times. 
  3945.  
  3946. Side Effects 
  3947.  
  3948. If any elements were removed, all cursors of this collection become undefined. 
  3949.  
  3950.  
  3951. ΓòÉΓòÉΓòÉ 3.1.2.35. isBounded ΓòÉΓòÉΓòÉ
  3952.  
  3953. Boolean isBounded ( ) const;
  3954.  
  3955. Returns True if the collection is bounded. 
  3956.  
  3957.  
  3958. ΓòÉΓòÉΓòÉ 3.1.2.36. isEmpty ΓòÉΓòÉΓòÉ
  3959.  
  3960. Boolean isEmpty ( ) const;
  3961.  
  3962. Returns True if the collection is empty. 
  3963.  
  3964.  
  3965. ΓòÉΓòÉΓòÉ 3.1.2.37. isFirst ΓòÉΓòÉΓòÉ
  3966.  
  3967. Boolean isFirst ( ICursor const& cursor ) const;
  3968.  
  3969. Returns True if the given cursor points to the first element of the collection. 
  3970.  
  3971. Preconditions 
  3972.  
  3973. The cursor must belong to the collection and must point to an element of the 
  3974. collection. 
  3975.  
  3976. Exception 
  3977.  
  3978. ICursorInvalidException 
  3979.  
  3980.  
  3981. ΓòÉΓòÉΓòÉ 3.1.2.38. isFull ΓòÉΓòÉΓòÉ
  3982.  
  3983. Boolean isFull ( ) const;
  3984.  
  3985. Returns True if the collection is bounded and contains the maximum number of 
  3986. elements; that is, if (numberOfElements == maxNumberOfElements). 
  3987.  
  3988.  
  3989. ΓòÉΓòÉΓòÉ 3.1.2.39. isLast ΓòÉΓòÉΓòÉ
  3990.  
  3991. Boolean isLast ( ICursor const& cursor ) const;
  3992.  
  3993. Returns True if the given cursor points to the last element of the collection. 
  3994.  
  3995. Preconditions 
  3996.  
  3997. The cursor must belong to the collection and must point to an element of the 
  3998. collection. 
  3999.  
  4000. Exception 
  4001.  
  4002. ICursorInvalidException 
  4003.  
  4004.  
  4005. ΓòÉΓòÉΓòÉ 3.1.2.40. key ΓòÉΓòÉΓòÉ
  4006.  
  4007. Key const& key ( Element const& element ) const;
  4008.  
  4009. Returns a reference to the key of the given element using the key function 
  4010. provided for the element type. 
  4011.  
  4012.  
  4013. ΓòÉΓòÉΓòÉ 3.1.2.41. lastElement ΓòÉΓòÉΓòÉ
  4014.  
  4015. Element const& lastElement ( ) const;
  4016.  
  4017. Returns a reference to the last element of the collection. 
  4018.  
  4019. Precondition 
  4020.  
  4021. The collection must not be empty. 
  4022.  
  4023. Exception 
  4024.  
  4025. IEmptyException 
  4026.  
  4027.  
  4028. ΓòÉΓòÉΓòÉ 3.1.2.42. locate ΓòÉΓòÉΓòÉ
  4029.  
  4030. Boolean locate ( Element const& element,
  4031.    ICursor& cursor ) const;
  4032.  
  4033. Locates an element in the collection which is equal to the given element. Sets 
  4034. the cursor to point to the element in the collection, or invalidates the cursor 
  4035. if no such element exists. 
  4036.  
  4037. If the collection contains several such elements, the first element in 
  4038. iteration order is located. 
  4039.  
  4040. Precondition 
  4041.  
  4042. The cursor must belong to the collection. 
  4043.  
  4044. Return Value 
  4045.  
  4046. Returns True if an element was found. 
  4047.  
  4048. Exceptions 
  4049.  
  4050. ICursorInvalidException 
  4051.  
  4052.  
  4053. ΓòÉΓòÉΓòÉ 3.1.2.43. locateElementWithKey ΓòÉΓòÉΓòÉ
  4054.  
  4055. Boolean locateElementWithKey ( Key const& key,
  4056.    ICursor& cursor ) const;
  4057.  
  4058. Locates an element in the collection with the same key as the given key. Sets 
  4059. the cursor to point to the element in the collection, or invalidates the cursor 
  4060. if no such element exists. 
  4061.  
  4062. If the collection contains several such elements, the first element in 
  4063. iteration order is located. 
  4064.  
  4065. Precondition 
  4066.  
  4067. The cursor must belong to the collection. 
  4068.  
  4069. Return Value 
  4070.  
  4071. Returns True if an element was found. 
  4072.  
  4073. Exception 
  4074.  
  4075. ICursorInvalidException 
  4076.  
  4077.  
  4078. ΓòÉΓòÉΓòÉ 3.1.2.44. locateFirst ΓòÉΓòÉΓòÉ
  4079.  
  4080. Boolean locateFirst ( Element const& element,
  4081.    ICursor& cursor ) const;
  4082.  
  4083. Locates the first element in iteration order in the collection that is equal to 
  4084. the given element. Sets the cursor to the located element, or invalidates the 
  4085. cursor if no such element exists. 
  4086.  
  4087. Precondition 
  4088.  
  4089. The cursor must belong to the collection. 
  4090.  
  4091. Return Value 
  4092.  
  4093. Returns True if an element was found. 
  4094.  
  4095. Exception 
  4096.  
  4097. ICursorInvalidException 
  4098.  
  4099.  
  4100. ΓòÉΓòÉΓòÉ 3.1.2.45. locateLast ΓòÉΓòÉΓòÉ
  4101.  
  4102. Boolean locateLast ( Element const& element,
  4103.    ICursor& cursor ) const;
  4104.  
  4105. Locates the last element in iteration order in the collection that is equal to 
  4106. the given element. Sets the cursor to the located element, or invalidates the 
  4107. cursor if no such element exists. 
  4108.  
  4109. Precondition 
  4110.  
  4111. The cursor must belong to the collection. 
  4112.  
  4113. Return Value 
  4114.  
  4115. Returns True if an element was found. 
  4116.  
  4117. Exception 
  4118.  
  4119. ICursorInvalidException 
  4120.  
  4121.  
  4122. ΓòÉΓòÉΓòÉ 3.1.2.46. locateNext ΓòÉΓòÉΓòÉ
  4123.  
  4124. Boolean locateNext ( Element const& element,
  4125.    ICursor& cursor ) const;
  4126.  
  4127. Locates the next element in iteration order in the collection that is equal to 
  4128. the given element starting at the element next to the one pointed to by the 
  4129. given cursor. Sets the cursor to point to the element in the collection. The 
  4130. cursor is invalidated if the end of the collection is reached and no more 
  4131. occurrences of the given element are left to be visited. 
  4132.  
  4133. Note:  If you code a call to locateFirst and a set of calls to locateNext, each 
  4134. occurrence of an element will be visited exactly once in iteration order. 
  4135.  
  4136. Precondition 
  4137.  
  4138. The cursor must belong to the collection and must point to an element of the 
  4139. collection. 
  4140.  
  4141. Return Value 
  4142.  
  4143. Returns True if an element was found. 
  4144.  
  4145. Exception 
  4146.  
  4147. ICursorInvalidException 
  4148.  
  4149.  
  4150. ΓòÉΓòÉΓòÉ 3.1.2.47. locateNextElementWithKey ΓòÉΓòÉΓòÉ
  4151.  
  4152. Boolean locateNextElementWithKey (
  4153.    Key const& key, ICursor& cursor ) const;
  4154.  
  4155. Locates the next element in iteration order in the collection with the given 
  4156. key, starting at the element next to the one pointed to by the given cursor. 
  4157. Sets the cursor to point to the element in the collection. The cursor is 
  4158. invalidated if the end of the collection is reached and no more occurrences of 
  4159. such an element are left to be visited. 
  4160.  
  4161. Note:  If you code a call to locateFirst and a set of calls to 
  4162. locateNextElementWithKey, each occurence of an element will be visited exactly 
  4163. once in iteration order. 
  4164.  
  4165. Preconditions 
  4166.  
  4167. The cursor must belong to the collection and must point to an element of the 
  4168. collection. 
  4169.  
  4170. Return Value 
  4171.  
  4172. Returns True if an element was found. 
  4173.  
  4174. Exception 
  4175.  
  4176. ICursorInvalidException 
  4177.  
  4178.  
  4179. ΓòÉΓòÉΓòÉ 3.1.2.48. locateOrAdd ΓòÉΓòÉΓòÉ
  4180.  
  4181. Boolean locateOrAdd ( Element const& element ) ;
  4182.  
  4183. Boolean locateOrAdd ( Element const& element,
  4184.    ICursor& cursor ) ;
  4185.  
  4186. Locates an element in the collection that is equal to the given element (see 
  4187. locate for details on locate). If no such element is found, locateOrAdd adds 
  4188. the element as described in add. The cursor is set to the located or added 
  4189. element. 
  4190.  
  4191. Note:  This method may be more efficient than using a locate followed by a 
  4192. conditional add. 
  4193.  
  4194. Preconditions 
  4195.  
  4196. o The cursor must belong to the collection. 
  4197. o If the collection is a map and contains an element with the same key as the 
  4198.   given element, then this element must be equal to the given element. 
  4199. o The element or key must exist, or (numberOfElements < maxNumberOfElements). 
  4200.  
  4201. Side Effects 
  4202.  
  4203. If the element was added, all cursors of this collection, except the given 
  4204. cursor, become undefined. 
  4205.  
  4206. Return Value 
  4207.  
  4208. Returns True if the element was located.  Returns False if the element could 
  4209. not be located but had to be added. 
  4210.  
  4211. Exceptions 
  4212.  
  4213. o IOutOfMemory 
  4214. o ICursorInvalidException 
  4215. o IFullException, if the collection is bounded 
  4216. o IKeyAlreadyExistsException, if the collection is a map 
  4217.  
  4218.  
  4219. ΓòÉΓòÉΓòÉ 3.1.2.49. locateOrAddElementWithKey ΓòÉΓòÉΓòÉ
  4220.  
  4221. Boolean locateOrAddElementWithKey (
  4222.    Element const& element ) ;
  4223.  
  4224. Boolean locateOrAddElementWithKey (
  4225.    Element const& element; ICursor& cursor ) ;
  4226.  
  4227. Locates an element in the collection with the given key as described for the 
  4228. locateElementWithKey function. If no such element exists, 
  4229. locateOrAddElementWithKey adds the element as described in add. The cursor is 
  4230. set to the located or added element. 
  4231.  
  4232. Preconditions 
  4233.  
  4234. o If the collection is bounded and an element with the given key is not already 
  4235.   contained then (numberOfElements < maxNumberOfElements). 
  4236. o The cursor must belong to the collection. 
  4237.  
  4238. Side Effects 
  4239.  
  4240. If the element was added, all cursors of this collection, except the given 
  4241. cursor, become undefined. 
  4242.  
  4243. Return Value Returns True if the element was located.  Returns False if the 
  4244. element could not be located but had to be added. 
  4245.  
  4246. Exceptions 
  4247.  
  4248. o IOutOfMemory 
  4249. o ICursorInvalidException 
  4250. o IFullException, if the collection is bounded 
  4251.  
  4252.  
  4253. ΓòÉΓòÉΓòÉ 3.1.2.50. locatePrevious ΓòÉΓòÉΓòÉ
  4254.  
  4255. Boolean locatePrevious ( Element const& element,
  4256.    ICursor& cursor ) const;
  4257.  
  4258. Locates the previous element in iteration order that is equal to the given 
  4259. element, beginning at the element previous to the one specified by the given 
  4260. cursor and moving in reverse iteration order through the elements. Sets the 
  4261. cursor to the located element, or invalidates the cursor if no such element 
  4262. exists. 
  4263.  
  4264. Preconditions 
  4265.  
  4266. The cursor must belong to the collection and must point to an element of the 
  4267. collection. 
  4268.  
  4269. Return Value 
  4270.  
  4271. Returns True if an element was found. 
  4272.  
  4273. Exceptions 
  4274.  
  4275. ICursorInvalidException 
  4276.  
  4277.  
  4278. ΓòÉΓòÉΓòÉ 3.1.2.51. maxNumberOfElements ΓòÉΓòÉΓòÉ
  4279.  
  4280. INumber maxNumberOfElements ( ) const;
  4281.  
  4282. Returns the maximum number of elements the collection can contain. 
  4283.  
  4284. Precondition 
  4285.  
  4286. The collection is bounded. 
  4287.  
  4288. Exceptions 
  4289.  
  4290. INotBoundedException 
  4291.  
  4292.  
  4293. ΓòÉΓòÉΓòÉ 3.1.2.52. newCursor ΓòÉΓòÉΓòÉ
  4294.  
  4295. ICursor* newCursor ( ) const;
  4296.  
  4297. Creates a cursor for the collection and returns a pointer to the cursor. The 
  4298. cursor is initially not valid. 
  4299.  
  4300. Exception 
  4301.  
  4302. IOutOfMemory 
  4303.  
  4304.  
  4305. ΓòÉΓòÉΓòÉ 3.1.2.53. numberOfDifferentElements ΓòÉΓòÉΓòÉ
  4306.  
  4307. INumber numberOfDifferentElements ( ) const;
  4308.  
  4309. Returns the number of different elements in the collection. 
  4310.  
  4311.  
  4312. ΓòÉΓòÉΓòÉ 3.1.2.54. numberOfDifferentKeys ΓòÉΓòÉΓòÉ
  4313.  
  4314. INumber numberOfDifferentKeys ( ) const;
  4315.  
  4316. Returns the number of different keys in the collection. 
  4317.  
  4318.  
  4319. ΓòÉΓòÉΓòÉ 3.1.2.55. numberOfElements ΓòÉΓòÉΓòÉ
  4320.  
  4321. INumber numberOfElements ( ) const;
  4322.  
  4323. Returns the number of elements the collection contains. 
  4324.  
  4325.  
  4326. ΓòÉΓòÉΓòÉ 3.1.2.56. numberOfElementsWithKey ΓòÉΓòÉΓòÉ
  4327.  
  4328. INumber numberOfElementsWithKey (
  4329.    Key const& key ) const;
  4330.  
  4331. Returns the number of elements in the collection with the given key. 
  4332.  
  4333.  
  4334. ΓòÉΓòÉΓòÉ 3.1.2.57. numberOfOccurrences ΓòÉΓòÉΓòÉ
  4335.  
  4336. INumber numberOfOccurrences (
  4337.    Element const& element ) const;
  4338.  
  4339. Returns the number of occurrences of the given element in the collection. 
  4340.  
  4341.  
  4342. ΓòÉΓòÉΓòÉ 3.1.2.58. pop ΓòÉΓòÉΓòÉ
  4343.  
  4344. void pop ( ) ;
  4345.  
  4346. void pop ( Element& element ) ;
  4347.  
  4348. Copies the last element of the collection to the given element, and removes it 
  4349. from the collection. 
  4350.  
  4351. Precondition 
  4352.  
  4353. The collection must not be empty. 
  4354.  
  4355. Side Effects 
  4356.  
  4357. All cursors of this collection become undefined. 
  4358.  
  4359. Exception 
  4360.  
  4361. IEmptyException 
  4362.  
  4363.  
  4364. ΓòÉΓòÉΓòÉ 3.1.2.59. push ΓòÉΓòÉΓòÉ
  4365.  
  4366. void push ( Element const& element ) ;
  4367.  
  4368. void push ( Element const& element,
  4369.    ICursor& cursor ) ;
  4370.  
  4371. Adds the element to the collection as the last element (as defined for add), 
  4372. and sets the cursor to the added element. 
  4373.  
  4374. Preconditions 
  4375.  
  4376. o The cursor must belong to the collection.. 
  4377. o If the collection is bounded, (numberOfElements < maxNumberOfElements). 
  4378.  
  4379. Side Effects 
  4380.  
  4381. All cursors of this collection, except the given cursor, become undefined. 
  4382.  
  4383. Exceptions 
  4384.  
  4385. o IOutOfMemory 
  4386. o ICursorInvalidException 
  4387. o IFullException, if the collection is bounded 
  4388.  
  4389.  
  4390. ΓòÉΓòÉΓòÉ 3.1.2.60. remove ΓòÉΓòÉΓòÉ
  4391.  
  4392. Boolean remove ( Element const& element ) ;
  4393.  
  4394. Removes an element in the collection that is equal to the given element. If no 
  4395. such element exists, the collection remains unchanged. In collections with 
  4396. nonunique elements, an arbitrary occurrence of the given element will be 
  4397. removed. Element destructors are called as described in removeAt. 
  4398.  
  4399. Side Effects 
  4400.  
  4401. If an element was removed, all cursors of this collection become undefined. 
  4402.  
  4403. Return Value 
  4404.  
  4405. Returns True if an element was removed. 
  4406.  
  4407.  
  4408. ΓòÉΓòÉΓòÉ 3.1.2.61. removeAllElementsWithKey ΓòÉΓòÉΓòÉ
  4409.  
  4410. INumber removeAllElementsWithKey (
  4411.    Key const& key ) ;
  4412.  
  4413. Removes all elements from the collection with the same key as the given key. 
  4414. Element destructors are called as described in removeAt. 
  4415.  
  4416. Side Effects 
  4417.  
  4418. If any elements were removed all cursors of this collection become undefined. 
  4419.  
  4420. Return Value 
  4421.  
  4422. The number of elements removed. 
  4423.  
  4424.  
  4425. ΓòÉΓòÉΓòÉ 3.1.2.62. removeAllOccurrences ΓòÉΓòÉΓòÉ
  4426.  
  4427. INumber removeAllOccurrences ( Element const& element ) ;
  4428.  
  4429. Removes all elements from the collection that are equal to the given element, 
  4430. and returns the number of elements removed. Element destructors are called as 
  4431. described for removeAt. 
  4432.  
  4433. Side Effects 
  4434.  
  4435. If any elements were removed, all cursors of this collection become undefined. 
  4436.  
  4437.  
  4438. ΓòÉΓòÉΓòÉ 3.1.2.63. removeAll ΓòÉΓòÉΓòÉ
  4439.  
  4440. void removeAll ( ) ;
  4441.  
  4442. Removes all elements from the collection. Element destructors are called as 
  4443. described for removeAt. 
  4444.  
  4445. Side Effects 
  4446.  
  4447. All cursors of this collection become undefined. 
  4448.  
  4449.  
  4450. ΓòÉΓòÉΓòÉ 3.1.2.64. removeAll ΓòÉΓòÉΓòÉ
  4451.  
  4452. INumber removeAll (
  4453.    Boolean (*property) (Element const&, void*),
  4454.    void* additionalArgument = 0  ) ;
  4455.  
  4456. Removes all elements from this collection for which the given property function 
  4457. returns True. Additional arguments can be passed to the given property function 
  4458. using additionalArgument. The additional argument defaults to zero if no 
  4459. additional argument is given. Element destructors are called as described in 
  4460. removeAt 
  4461.  
  4462. Side Effects 
  4463.  
  4464. If any elements were removed, all cursors of this collection become undefined. 
  4465.  
  4466. Return Value 
  4467.  
  4468. The number of elements removed. 
  4469.  
  4470.  
  4471. ΓòÉΓòÉΓòÉ 3.1.2.65. removeAt ΓòÉΓòÉΓòÉ
  4472.  
  4473. void removeAt ( ICursor const& cursor ) ;
  4474.  
  4475. Removes the element pointed to by the cursor. 
  4476.  
  4477. Note:  It is undefined whether the destructor for the removed element is called 
  4478. or whether the element will only be destructed with the collection destructor. 
  4479. For example, in a tabular implementation a destructor will only be called when 
  4480. the whole collection is destructed, not when a single element is removed. 
  4481.  
  4482. Preconditions 
  4483.  
  4484. The cursor must belong to the collection and must point to an element of the 
  4485. collection. 
  4486.  
  4487. Side Effects 
  4488.  
  4489. All cursors of this collection become undefined. 
  4490.  
  4491. Exception 
  4492.  
  4493. ICursorInvalidException 
  4494.  
  4495.  
  4496. ΓòÉΓòÉΓòÉ 3.1.2.66. removeAtPosition ΓòÉΓòÉΓòÉ
  4497.  
  4498. void removeAtPosition ( IPosition position ) ;
  4499.  
  4500. Removes the element from the collection, which is at the given position. 
  4501.  
  4502. The first element of the collection has position 1. 
  4503.  
  4504. Precondition 
  4505.  
  4506. Position must be a valid position in the collection, that is, 
  4507. (1 =< position =< numberOfElements). 
  4508.  
  4509. Side Effects 
  4510.  
  4511. All cursors of this collection become undefined. 
  4512.  
  4513. Exception 
  4514.  
  4515. IPositionInvalidException 
  4516.  
  4517.  
  4518. ΓòÉΓòÉΓòÉ 3.1.2.67. removeElementWithKey ΓòÉΓòÉΓòÉ
  4519.  
  4520. Boolean removeElementWithKey ( Key const& key ) ;
  4521.  
  4522. Removes an element from the collection with the same key as the given key. If 
  4523. no such element exists the collection remains unchanged. In collections with 
  4524. nonunique elements, an arbitrary occurrence of such an element will be removed. 
  4525. Element destructors are called as described in removeAt. 
  4526.  
  4527. Side Effects 
  4528.  
  4529. If an element was removed, all cursors of this collection become undefined. 
  4530.  
  4531. Return Value 
  4532.  
  4533. Returns True if an element was removed. 
  4534.  
  4535.  
  4536. ΓòÉΓòÉΓòÉ 3.1.2.68. removeFirst ΓòÉΓòÉΓòÉ
  4537.  
  4538. void removeFirst ( ) ;
  4539.  
  4540. Removes the first element from the collection. Element destructors are called 
  4541. as described in removeAt. 
  4542.  
  4543. Precondition 
  4544.  
  4545. The collection must not be empty. 
  4546.  
  4547. Side Effects 
  4548.  
  4549. All cursors of this collection become undefined. 
  4550.  
  4551. Exception 
  4552.  
  4553. IEmptyException 
  4554.  
  4555.  
  4556. ΓòÉΓòÉΓòÉ 3.1.2.69. removeLast ΓòÉΓòÉΓòÉ
  4557.  
  4558. void removeLast ( ) ;
  4559.  
  4560. Removes the last element from the collection. Element destructors are called as 
  4561. described in removeAt. 
  4562.  
  4563. Precondition 
  4564.  
  4565. The collection must not be empty. 
  4566.  
  4567. Side Effects 
  4568.  
  4569. All cursors of this collection become undefined. 
  4570.  
  4571. Exception 
  4572.  
  4573. IEmptyException 
  4574.  
  4575.  
  4576. ΓòÉΓòÉΓòÉ 3.1.2.70. replaceAt ΓòÉΓòÉΓòÉ
  4577.  
  4578. void replaceAt ( ICursor const& cursor,
  4579.    Element const& element ) ;
  4580.  
  4581. Replaces the element pointed to by the cursor with the given element. 
  4582.  
  4583. Preconditions 
  4584.  
  4585. o The cursor must belong to the collection and must point to an element of the 
  4586.   collection. 
  4587. o The given element must have the same positioning property as the replaced 
  4588.   element. 
  4589.  
  4590. Exceptions 
  4591.  
  4592. o ICursorInvalidException 
  4593. o IInvalidReplacementException 
  4594.  
  4595.  
  4596. ΓòÉΓòÉΓòÉ 3.1.2.71. replaceElementWithKey ΓòÉΓòÉΓòÉ
  4597.  
  4598. Boolean replaceElementWithKey ( Element const& element ) ;
  4599.  
  4600. Boolean replaceElementWithKey ( Element const& element,
  4601.    ICursor& cursor ) ;
  4602.  
  4603. Replaces an element with the same key as the given element by the given 
  4604. element, and sets the cursor to this element. If no such element exists, it 
  4605. invalidates the cursor. In collections with nonunique elements, an arbitrary 
  4606. occurrence of such an element will be replaced. 
  4607.  
  4608. Precondition 
  4609.  
  4610. The cursor must belong to the collection. 
  4611.  
  4612. Return Value 
  4613.  
  4614. Returns True if an element was replaced. 
  4615.  
  4616. Exceptions 
  4617.  
  4618. ICursorInvalidException 
  4619.  
  4620.  
  4621. ΓòÉΓòÉΓòÉ 3.1.2.72. setToFirst ΓòÉΓòÉΓòÉ
  4622.  
  4623. Boolean setToFirst ( ICursor& cursor ) const;
  4624.  
  4625. Sets the cursor to the first element of the collection in iteration order. If 
  4626. the collection is empty (if no first element exists), it invalidates the given 
  4627. cursor. 
  4628.  
  4629. Precondition 
  4630.  
  4631. The cursor must belong to the collection. 
  4632.  
  4633. Return Value 
  4634.  
  4635. Returns True if the collection is not empty. 
  4636.  
  4637. Exception 
  4638.  
  4639. ICursorInvalidException 
  4640.  
  4641.  
  4642. ΓòÉΓòÉΓòÉ 3.1.2.73. setToLast ΓòÉΓòÉΓòÉ
  4643.  
  4644. Boolean setToLast ( ICursor& cursor ) const;
  4645.  
  4646. Sets the cursor to the last element of the collection in iteration order. If 
  4647. the collection is empty (if no last element exists), the given cursor is no 
  4648. longer valid. 
  4649.  
  4650. Precondition 
  4651.  
  4652. The cursor must belong to the collection. 
  4653.  
  4654. Return Value 
  4655.  
  4656. Returns True if the collection is not empty. 
  4657.  
  4658. Exceptions 
  4659.  
  4660. ICursorInvalidException 
  4661.  
  4662.  
  4663. ΓòÉΓòÉΓòÉ 3.1.2.74. setToNext ΓòÉΓòÉΓòÉ
  4664.  
  4665. Boolean setToNext ( ICursor& cursor ) const;
  4666.  
  4667. Sets the cursor to the next element in the collection in iteration order. If no 
  4668. more elements are left to be visited, the given cursor will no longer be valid. 
  4669.  
  4670. Precondition 
  4671.  
  4672. The cursor must belong to the collection and must point to an element. 
  4673.  
  4674. Return Value 
  4675.  
  4676. Returns True if there is a next element. 
  4677.  
  4678. Exceptions 
  4679.  
  4680. ICursorInvalidException 
  4681.  
  4682.  
  4683. ΓòÉΓòÉΓòÉ 3.1.2.75. setToNextDifferentElement ΓòÉΓòÉΓòÉ
  4684.  
  4685. Boolean setToNextDifferentElement (
  4686.    ICursor& cursor ) const;
  4687.  
  4688. Sets the cursor to the next element in iteration order in the collection that 
  4689. is different from the element pointed to by the given cursor. If no more 
  4690. elements are left to be visited, the given cursor will no longer be valid. 
  4691.  
  4692. Precondition 
  4693.  
  4694. The cursor must belong to the collection and must point to an element of the 
  4695. collection. 
  4696.  
  4697. Return Value 
  4698.  
  4699. Returns True if a subsequent element was found that is different. 
  4700.  
  4701. Exception 
  4702.  
  4703. ICursorInvalidException 
  4704.  
  4705.  
  4706. ΓòÉΓòÉΓòÉ 3.1.2.76. setToNextWithDifferentKey ΓòÉΓòÉΓòÉ
  4707.  
  4708. Boolean setToNextWithDifferentKey ( ICursor& cursor ) const;
  4709.  
  4710. Sets the cursor to the next element in the collection in iteration order with a 
  4711. key different from the key of the element pointed to by the given cursor. If no 
  4712. such element exists, the given cursor is no longer valid. 
  4713.  
  4714. Preconditions 
  4715.  
  4716. The cursor must belong to the collection and must point to an element of the 
  4717. collection. 
  4718.  
  4719. Return Value 
  4720.  
  4721. Returns True if a subsequent element was found whose key is different from the 
  4722. current key. 
  4723.  
  4724. Exception 
  4725.  
  4726. ICursorInvalidException 
  4727.  
  4728.  
  4729. ΓòÉΓòÉΓòÉ 3.1.2.77. setToPosition ΓòÉΓòÉΓòÉ
  4730.  
  4731. void setToPosition ( IPosition position,
  4732.    ICursor& cursor ) const;
  4733.  
  4734. Sets the cursor to the element at the given position. Position 1 specifies the 
  4735. first element. 
  4736.  
  4737. Precondition 
  4738.  
  4739. o The cursor must belong to the collection. 
  4740. o Position must be a valid position in the collection; that is, 
  4741.   (1 =< position =< numberOfElements). 
  4742.  
  4743. Exceptions 
  4744.  
  4745. o ICursorInvalidException 
  4746. o IPositionInvalidException 
  4747.  
  4748.  
  4749. ΓòÉΓòÉΓòÉ 3.1.2.78. setToPrevious ΓòÉΓòÉΓòÉ
  4750.  
  4751. Boolean setToPrevious ( ICursor& cursor ) const;
  4752.  
  4753. Sets the cursor to the previous element in iteration order, or invalidates the 
  4754. cursor if no such element exists. 
  4755.  
  4756. Preconditions 
  4757.  
  4758. The cursor must belong to the collection and must point to an element of the 
  4759. collection. 
  4760.  
  4761. Return Value 
  4762.  
  4763. Returns True if a previous element exists. 
  4764.  
  4765. Exception 
  4766.  
  4767. ICursorInvalidException 
  4768.  
  4769.  
  4770. ΓòÉΓòÉΓòÉ 3.1.2.79. sort ΓòÉΓòÉΓòÉ
  4771.  
  4772. void sort ( long (*comparisonFunction)
  4773.    (Element const& element1, Element const& element2) );
  4774.  
  4775. Sorts the collection such that the elements occur in ascending order. The 
  4776. relation of two elements is described in the comparisonFunction 
  4777.  
  4778. Note:  The comparisonFunction must deliver a result according to the following 
  4779. rules: 
  4780.  
  4781. >0        if (element1 > element2) 
  4782. 0         if (element1 == element2) 
  4783. <0        if (element1 < element2) 
  4784.  
  4785. Side Effects 
  4786.  
  4787. All cursors of this collection become undefined. 
  4788.  
  4789.  
  4790. ΓòÉΓòÉΓòÉ 3.1.2.80. top ΓòÉΓòÉΓòÉ
  4791.  
  4792. Element const& top ( ) const;
  4793.  
  4794. Returns a reference to the last element of the collection. 
  4795.  
  4796. Precondition 
  4797.  
  4798. The collection must not be empty. 
  4799.  
  4800. Exception 
  4801.  
  4802. IEmptyException 
  4803.  
  4804.  
  4805. ΓòÉΓòÉΓòÉ 3.1.2.81. unionWith ΓòÉΓòÉΓòÉ
  4806.  
  4807. void unionWith (
  4808.    CLASS_NAME const& collection ) ;
  4809.  
  4810. Makes the collection the union of the collection and the given collection. The 
  4811. union of A and B is the set of elements which are members of A or B or both. 
  4812.  
  4813. The following rule applies for bags with duplicate elements: If bag P contains 
  4814. the element X m times and bag Q contains the element X n times, the union of P 
  4815. and Q contains the element X m+n times. 
  4816.  
  4817. Preconditions 
  4818.  
  4819. Since the elements from the given collection are added to the collection one by 
  4820. one, the following preconditions are tested for each individual add operation : 
  4821.  
  4822. o If the collection is bounded and unique, the element or key must exist or 
  4823.   (numberOfElements < maxNumberOfElements). 
  4824. o If the collection is bounded and nonunique, then 
  4825.   (numberOfElements < maxNumberOfElements). 
  4826. o If the collection is a map and contains an element with the same key as the 
  4827.   given element, then this element must be equal to the given element. 
  4828.  
  4829. Side Effects 
  4830.  
  4831. If any elements were added to the collection, all cursors of this collection 
  4832. become undefined. 
  4833.  
  4834. Exceptions 
  4835.  
  4836. o IOutOfMemory 
  4837. o IFullException, if the collection is bounded 
  4838. o IKeyAlreadyExistsException, if the collection is a map 
  4839.  
  4840. Note:  This function is not provided for equality sequences. 
  4841.  
  4842.  
  4843. ΓòÉΓòÉΓòÉ 3.2. Bag ΓòÉΓòÉΓòÉ
  4844.  
  4845. A bag is an unordered collection of zero or more elements with no key. 
  4846. Multiple elements are supported.  A request to add an element that already 
  4847. exists is not ignored. 
  4848.  
  4849. Combination of Flat Collection Properties gives an overview of the properties 
  4850. of a bag and its relationship to other flat collections. 
  4851.  
  4852. The following rule applies for duplicates: If bag P contains the element X m 
  4853. times and bag Q contains the element X n times, then the union of P and Q 
  4854. contains the element X m+n times, the intersection of P and Q contains the 
  4855. element X MIN(m,n) times, and the difference of P and Q contains the element X 
  4856. m-n times if m is > n, and zero times if m is =< n. 
  4857.  
  4858. Note:  All member functions of bag are described under "List of Functions". 
  4859.  
  4860.  
  4861. ΓòÉΓòÉΓòÉ 3.2.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  4862.  
  4863. IBag, the first class in the table below, is the default implementation 
  4864. variant. If you want to use polymorphism, you can replace the following class 
  4865. implementation variants by the reference class. 
  4866.  
  4867. Class Name                    Header File  Based On
  4868.  
  4869. IBag                          ibag.h       AVL KeySortedSet
  4870. IGBag                         ibag.h       AVL KeySortedSet
  4871. IBagOnBSTKeySortedSet         ibagbst.h    B* KeySortedSet
  4872. IGBagOnBSTKeySortedSet        ibagbst.h    B* KeySortedSet
  4873. IBagOnSortedLinkedSequence    ibagsls.h    Linked Sequence
  4874. IGBagOnSortedLinkedSequence   ibagsls.h    Linked Sequence
  4875. IBagOnSortedTabularSequence   ibagsts.h    TabularSequence
  4876. IGBagOnSortedTabularSequence  ibagsts.h    TabularSequence
  4877. IBagOnSortedDilutedSequence   ibagsds.h    DilutedSequence
  4878. IGBagOnSortedDilutedSequence  ibagsds.h    DilutedSequence
  4879. IBagOnHashKeySet              ibaghks.h    HashKeySet
  4880. IGBagOnHashKeySet             ibaghks.h    HashKeySet
  4881.  
  4882.  
  4883. ΓòÉΓòÉΓòÉ 3.2.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  4884.  
  4885. The following implementation variants are defined for bags: 
  4886.  
  4887. o Bag 
  4888. o Bag on B* Key Sorted Set 
  4889. o Bag on Sorted Linked Sequence 
  4890. o Bag on Sorted Tabular Sequence 
  4891. o Bag on Sorted Diluted Sequence 
  4892. o Bag on Hash Key Set 
  4893.  
  4894.  
  4895. ΓòÉΓòÉΓòÉ 3.2.2.1. Bag ΓòÉΓòÉΓòÉ
  4896.  
  4897. IBag  <Element>
  4898. IGBag <Element, ECOps>
  4899.  
  4900. The default implementation of the class IBag requires the following element 
  4901. functions: 
  4902.  
  4903. Element Type 
  4904.  
  4905. o Copy constructor 
  4906. o Destructor 
  4907. o Assignment 
  4908. o Equality test 
  4909. o Ordering relation 
  4910.  
  4911.  
  4912. ΓòÉΓòÉΓòÉ 3.2.2.2. Bag on B* Key Sorted Set ΓòÉΓòÉΓòÉ
  4913.  
  4914. IBagOnBSTKeySortedSet  <Element>
  4915. IGBagOnBSTKeySortedSet <Element, ECOps>
  4916.  
  4917. The default implementation of the class IBagOnBSTKeySortedSet requires the 
  4918. following element functions: 
  4919.  
  4920. Element Type 
  4921.  
  4922. o Default constructor 
  4923. o Copy constructor 
  4924. o Destructor 
  4925. o Assignment 
  4926. o Equality test 
  4927. o Ordering relation 
  4928.  
  4929.  
  4930. ΓòÉΓòÉΓòÉ 3.2.2.3. Bag on Sorted Linked Sequence ΓòÉΓòÉΓòÉ
  4931.  
  4932. IBagOnSortedLinkedSequence  <Element>
  4933. IGBagOnSortedLinkedSequence <Element, ECOps>
  4934.  
  4935. The implementation of the class IBagOnSortedLinkedSequence requires the 
  4936. following element functions: 
  4937.  
  4938. Element Type 
  4939.  
  4940. o Copy constructor 
  4941. o Destructor 
  4942. o Assignment 
  4943. o Equality test 
  4944. o Ordering relation 
  4945.  
  4946.  
  4947. ΓòÉΓòÉΓòÉ 3.2.2.4. Bag on Sorted Tabular Sequence ΓòÉΓòÉΓòÉ
  4948.  
  4949. IBagOnSortedTabularSequence  <Element>
  4950. IGBagOnSortedTabularSequence <Element, ECOps>
  4951.  
  4952. The implementation of the class IBagOnSortedTabularSequence requires the 
  4953. following element functions: 
  4954.  
  4955. Element Type 
  4956.  
  4957. o Default constructor 
  4958. o Copy constructor 
  4959. o Destructor 
  4960. o Assignment 
  4961. o Equality test 
  4962. o Ordering relation 
  4963.  
  4964.  
  4965. ΓòÉΓòÉΓòÉ 3.2.2.5. Bag on Sorted Diluted Sequence ΓòÉΓòÉΓòÉ
  4966.  
  4967. IBagOnSortedDilutedSequence  <Element>
  4968. IGBagOnSortedDilutedSequence <Element, ECOps>
  4969.  
  4970. The implementation of the class IBagOnSortedDilutedSequence requires the 
  4971. following element functions: 
  4972.  
  4973. Element Type 
  4974.  
  4975. o Default constructor 
  4976. o Copy constructor 
  4977. o Destructor 
  4978. o Assignment 
  4979. o Equality test 
  4980. o Ordering relation 
  4981.  
  4982.  
  4983. ΓòÉΓòÉΓòÉ 3.2.2.6. Bag on Hash Key Set ΓòÉΓòÉΓòÉ
  4984.  
  4985. IBagOnHashKeySet  <Element>
  4986. IGBagOnHashKeySet <Element, EHOps>
  4987.  
  4988. The implementation of the class IBagOnHashKeySet requires the following element 
  4989. functions: 
  4990.  
  4991. Element Type 
  4992.  
  4993. o Copy constructor 
  4994. o Destructor 
  4995. o Assignment 
  4996. o Equality test 
  4997. o Hash function 
  4998.  
  4999.  
  5000. ΓòÉΓòÉΓòÉ 3.2.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  5001.  
  5002. For polymorphism, you can use the corresponding abstract class, IABag, which is 
  5003. found in the iabag.h header file, or the corresponding reference class, IRBag, 
  5004. which is found in the irbag.h header file. See Polymorphic Use of Collections 
  5005. for further information. 
  5006.  
  5007.  
  5008. ΓòÉΓòÉΓòÉ 3.2.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  5009.  
  5010. IABag <Element>
  5011. IRBag <Element, ConcreteBase>
  5012.  
  5013. The concrete base class is one of the classes defined above. 
  5014.  
  5015. The required functions are the same as the required functions of the concrete 
  5016. base class. 
  5017.  
  5018.  
  5019. ΓòÉΓòÉΓòÉ 3.2.4. Declarations for Bag ΓòÉΓòÉΓòÉ
  5020.  
  5021. template < class Element >
  5022. class IBag {
  5023. public:
  5024.  
  5025.   class Cursor : ICursor {
  5026.     Element& element ();
  5027.     Boolean operator== (Cursor const& cursor);
  5028.     Boolean operator!= (Cursor const& cursor);
  5029.   };
  5030.  
  5031.                   IBag                (INumber numberOfElements = 100);
  5032.                   IBag                (IBag < Element > const&);
  5033.    IBag < Element >&
  5034.                   operator =          (IBag < Element > const&);
  5035.                   ~IBag               ();
  5036.    Boolean        add                 (Element const&);
  5037.    Boolean        add                 (Element const&, ICursor&);
  5038.    void           addAllFrom          (IBag < Element > const&);
  5039.    Element const& elementAt           (ICursor const&) const;
  5040.    Element&       elementAt           (ICursor const&);
  5041.    Element const& anyElement          () const;
  5042.    void           removeAt            (ICursor const&);
  5043.    INumber        removeAll           (Boolean (*property)
  5044.                                       (Element const&, void*),
  5045.                                        void* additionalArgument = 0);
  5046.    void           replaceAt           (ICursor const&, Element const&);
  5047.    void           removeAll           ();
  5048.    Boolean        isBounded           () const;
  5049.    INumber        maxNumberOfElements () const;
  5050.    INumber        numberOfElements    () const;
  5051.    Boolean        isEmpty             () const;
  5052.    Boolean        isFull              () const;
  5053.    ICursor*       newCursor           () const;
  5054.    Boolean        setToFirst          (ICursor&) const;
  5055.    Boolean        setToNext           (ICursor&) const;
  5056.    Boolean        allElementsDo       (Boolean (*function) (Element&, void*),
  5057.                                        void* additionalArgument = 0);
  5058.    Boolean        allElementsDo       (IIterator <Element>&);
  5059.    Boolean        allElementsDo       (Boolean (*function)
  5060.                                        (Element const&, void*),
  5061.                                        void* additionalArgument = 0) const;
  5062.    Boolean        allElementsDo       (IConstantIterator <Element>&) const;
  5063.    Boolean        isConsistent        () const;
  5064.    Boolean        contains            (Element const&) const;
  5065.    Boolean        containsAllFrom     (IBag < Element > const&) const;
  5066.    Boolean        locate              (Element const&, ICursor&) const;
  5067.    Boolean        locateOrAdd         (Element const&);
  5068.    Boolean        locateOrAdd         (Element const&, ICursor&);
  5069.    Boolean        remove              (Element const&);
  5070.    INumber        numberOfOccurrences (Element const&) const;
  5071.    Boolean        locateNext          (Element const&, ICursor&) const;
  5072.    INumber        removeAllOccurrences(Element const&);
  5073.    INumber        numberOfDifferentElements () const;
  5074.    Boolean        setToNextDifferentElement (ICursor&) const;
  5075.    Boolean        operator ==         (IBag < Element > const&) const;
  5076.    Boolean        operator !=         (IBag < Element > const&) const;
  5077.    void           unionWith           (IBag < Element > const&);
  5078.    void           intersectionWith    (IBag < Element > const&);
  5079.    void           differenceWith      (IBag < Element > const&);
  5080.    void           addUnion            (IBag < Element > const&,
  5081.                                        IBag < Element > const&);
  5082.    void           addIntersection     (IBag < Element > const&,
  5083.                                        IBag < Element > const&);
  5084.    void           addDifference       (IBag < Element > const&,
  5085.                                        IBag < Element > const&);
  5086.  
  5087. };
  5088.  
  5089.  
  5090. ΓòÉΓòÉΓòÉ 3.3. Deque ΓòÉΓòÉΓòÉ
  5091.  
  5092. A deque or double-ended queue is a sequence with restricted access.  It is an 
  5093. ordered collection of elements with no key and no element equality.  The 
  5094. elements are arranged so that each collection has a first and a last element, 
  5095. each element except the last has a next element, and each element but the first 
  5096. has a previous element.  You can only add or remove the first or last element. 
  5097.  
  5098. The type and value of the elements are irrelevant, and have no effect on the 
  5099. behavior of the collection. 
  5100.  
  5101. Note:  All member functions of deque are described under "List of Functions". 
  5102.  
  5103.  
  5104. ΓòÉΓòÉΓòÉ 3.3.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  5105.  
  5106. IDeque, the first class in the table below, is the default implementation 
  5107. variant. If you want to use polymorphism, you can replace the following class 
  5108. implementation variants by the reference class. 
  5109.  
  5110. Class Name                Header File  Based On
  5111.  
  5112. IDeque                    ideque.h     LinkedSequence
  5113. IGDeque                   ideque.h     LinkedSequence
  5114. IDequeOnTabularSequence   idquts.h     TabularSequence
  5115. IGDequeOnTabularSequence  idquts.h     TabularSequence
  5116. IDequeOnDilutedSequence   idquds.h     DilutedSequence
  5117. IGDequeOnDilutedSequence  idquds.h     DilutedSequence
  5118.  
  5119.  
  5120. ΓòÉΓòÉΓòÉ 3.3.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  5121.  
  5122. The following implementation variants are defined for deques: 
  5123.  
  5124. o Deque 
  5125. o Deque on Tabular Sequence 
  5126. o Deque on Diluted Sequence 
  5127.  
  5128.  
  5129. ΓòÉΓòÉΓòÉ 3.3.2.1. Deque ΓòÉΓòÉΓòÉ
  5130.  
  5131. IDeque  <Element>
  5132. IGDeque <Element, StdOps>
  5133.  
  5134. The default implementation of the class IDeque requires the following element 
  5135. functions: 
  5136.  
  5137. Element Type 
  5138.  
  5139. o Copy constructor 
  5140. o Destructor 
  5141. o Assignment 
  5142.  
  5143.  
  5144. ΓòÉΓòÉΓòÉ 3.3.2.2. Deque on Tabular Sequence ΓòÉΓòÉΓòÉ
  5145.  
  5146. IDequeOnTabularSequence  <Element>
  5147. IGDequeOnTabularSequence <Element, StdOps>
  5148.  
  5149. The implementation of the class IDequeOnTabularSequence requires the following 
  5150. element functions: 
  5151.  
  5152. Element Type 
  5153.  
  5154. o Default constructor 
  5155. o Copy constructor 
  5156. o Destructor 
  5157. o Assignment 
  5158.  
  5159.  
  5160. ΓòÉΓòÉΓòÉ 3.3.2.3. Deque on Diluted Sequence ΓòÉΓòÉΓòÉ
  5161.  
  5162. IDequeOnDilutedSequence  <Element>
  5163. IGDequeOnDilutedSequence <Element, StdOps>
  5164.  
  5165. The implementation of the class IDequeOnDilutedSequence requires the following 
  5166. element functions: 
  5167.  
  5168. Element Type 
  5169.  
  5170. o Default constructor 
  5171. o copy constructor 
  5172. o Assignment 
  5173.  
  5174.  
  5175. ΓòÉΓòÉΓòÉ 3.3.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  5176.  
  5177. For polymorphism, you can use the corresponding abstract class, IADeque, which 
  5178. is found in the iadeque.h header file, or the corresponding reference class, 
  5179. IRDeque, which is found in the irdeque.h header file. See Polymorphic Use of 
  5180. Collections for further information. 
  5181.  
  5182.  
  5183. ΓòÉΓòÉΓòÉ 3.3.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  5184.  
  5185. IADeque <Element>
  5186. IRDeque <Element, ConcreteBase>
  5187.  
  5188. The concrete base class is one of the classes defined above. 
  5189.  
  5190. The required functions are the same as the required functions of the concrete 
  5191. base class. 
  5192.  
  5193.  
  5194. ΓòÉΓòÉΓòÉ 3.3.4. Declarations for Deque ΓòÉΓòÉΓòÉ
  5195.  
  5196. template < class Element >
  5197. class IDeque  {
  5198. public:
  5199.  
  5200.   class Cursor : ICursor {
  5201.     Element& element ();
  5202.     void setToLast ();
  5203.     void setToPrevious ();
  5204.     Boolean operator== (Cursor const& cursor);
  5205.     Boolean operator!= (Cursor const& cursor);
  5206.   };
  5207.  
  5208.                   IDeque             (INumber numberOfElements = 100);
  5209.                   IDeque             (IDeque < Element > const&);
  5210.    IDeque < Element >&
  5211.                   operator =         (IDeque < Element > const&);
  5212.                   ~IDeque            ();
  5213.    Boolean        add                (Element const&);
  5214.    Boolean        add                (Element const&, ICursor&);
  5215.    void           addAllFrom         (IDeque < Element > const&);
  5216.    Element const& elementAt          (ICursor const&) const;
  5217.    Element const& anyElement         () const;
  5218.    void           removeAll          ();
  5219.    Boolean        isBounded          () const;
  5220.    INumber        maxNumberOfElements() const;
  5221.    INumber        numberOfElements   () const;
  5222.    Boolean        isEmpty            () const;
  5223.    Boolean        isFull             () const;
  5224.    ICursor*       newCursor          () const;
  5225.    Boolean        setToFirst         (ICursor&) const;
  5226.    Boolean        setToNext          (ICursor&) const;
  5227.    Boolean        allElementsDo      (Boolean (*function) (Element const&, void*),
  5228.                                       void* additionalArgument = 0) const;
  5229.    Boolean        allElementsDo      (IConstantIterator <Element>&) const;
  5230.    Boolean        isConsistent       () const;
  5231.    void           removeFirst        ();
  5232.    void           removeLast         ();
  5233.    Element const& firstElement       () const;
  5234.    Element const& lastElement        () const;
  5235.    Element const& elementAtPosition  (IPosition) const;
  5236.    Boolean        setToLast          (ICursor&) const;
  5237.    Boolean        setToPrevious      (ICursor&) const;
  5238.    void           setToPosition      (IPosition, ICursor&) const;
  5239.    Boolean        isFirst            (ICursor const&) const;
  5240.    Boolean        isLast             (ICursor const&) const;
  5241.    long           compare            (IDeque < Element > const&,
  5242.                                       long (*comparisonFunction)
  5243.                                          (Element const&,
  5244.                                          Element const&)) const;
  5245.    void           addAsFirst         (Element const&);
  5246.    void           addAsFirst         (Element const&, ICursor&);
  5247.    void           addAsLast          (Element const&);
  5248.    void           addAsLast          (Element const&, ICursor&);
  5249. };
  5250.  
  5251.  
  5252. ΓòÉΓòÉΓòÉ 3.3.5. Coding Example for Deque ΓòÉΓòÉΓòÉ
  5253.  
  5254. The following program uses the default deque class, IDeque, to create a deque. 
  5255. It fills the deque with characters by adding them to the back end. The program 
  5256. then removes the characters from alternating ends of the deque (beginning with 
  5257. the front end) until the deque is empty. 
  5258.  
  5259. The program uses the constant iterator class, IConstantIterator, when printing 
  5260. the collection. It uses the addAsLast function to fill the deque and the 
  5261. numberOfElements function to determine the deque's size. It uses the functions 
  5262. firstElement, removeFirst, lastElement, and removeLast to empty the deque. 
  5263.  
  5264. // letterdq.C  -  An example of using a Deque.
  5265. #include <iostream.h>
  5266.  
  5267. #include <ideqseq.h>
  5268. #include <ideque.h>
  5269.                      // Let's use the default deque
  5270. typedef IDeque <char> Deque;
  5271.                      // The deque requires iteration to be const
  5272. typedef IConstantIterator <char> CharIterator;
  5273.  
  5274. class Print : public CharIterator
  5275. {
  5276. public:
  5277.    Boolean applyTo(char const&c)
  5278.       {
  5279.       cout << c;
  5280.       return True;
  5281.       }
  5282. };
  5283.  
  5284.            // Test variables
  5285. char *String = "Teqikbonfxjme vralz o.gdya  eospu o wr cu h";
  5286.  
  5287.  
  5288.            // Main program
  5289. int main()
  5290. {
  5291.    Deque D;
  5292.    char  C;
  5293.    Boolean ReadFront = True;
  5294.  
  5295.    int i;
  5296.  
  5297.    // Put all characters in the deque.
  5298.    // Then read it, changing the end to read from
  5299.    // with every character read.
  5300.  
  5301.    cout << "\nAdding characters to the back end of the deque:\n";
  5302.  
  5303.    for (i = 0; String[i] != 0; i ++) {
  5304.       D.addAsLast(String[i]);
  5305.       cout << String[i];
  5306.       }
  5307.  
  5308.    cout << "\n\nCurrent number of elements in the deque: "
  5309.         <<  D.numberOfElements() << "\n";
  5310.  
  5311.    cout << "\nContents of the deque:\n";
  5312.    Print Aprinter;
  5313.    D.allElementsDo(Aprinter);
  5314.  
  5315.    cout << "\n\nReading from the deque one element from front, one "
  5316.            "from back, and so on:\n";
  5317.  
  5318.    while (!D.isEmpty())
  5319.       {
  5320.       if (ReadFront)                  // Read from front of Deque
  5321.          {
  5322.          C = D.firstElement();        // Get the character
  5323.          D.removeFirst();             // Delete it from the Deque
  5324.          }
  5325.       else
  5326.          {
  5327.          C = D.lastElement();
  5328.          D.removeLast();
  5329.          }
  5330.       cout << C;
  5331.  
  5332.       ReadFront = !ReadFront;     // Switch to other end of Deque
  5333.       }
  5334.  
  5335.    return(0);
  5336. }
  5337.  
  5338. The program produces the following output: 
  5339.  
  5340.  
  5341. Adding characters to the back end of the deque:
  5342. Teqikbonfxjme vralz o.gdya  eospu o wr cu h
  5343.  
  5344. Current number of elements in the deque: 43
  5345.  
  5346. Contents of the deque:
  5347. Teqikbonfxjme vralz o.gdya  eospu o wr cu h
  5348.  
  5349. Reading from the deque one element from front, one from back, and so on:
  5350. The quick brown fox jumpes over a lazy dog.
  5351.  
  5352.  
  5353. ΓòÉΓòÉΓòÉ 3.4. Equality Sequence ΓòÉΓòÉΓòÉ
  5354.  
  5355. An equality sequence is an ordered collection of elements. The elements are 
  5356. arranged so that each collection has a first and a last element, each element 
  5357. except the last has a next element, and each element but the first has a 
  5358. previous element.  An equality sequence supports element equality, which gives 
  5359. you the ability, for example, to search for particular elements. 
  5360.  
  5361. Combination of Flat Collection Properties gives an overview of the properties 
  5362. of an equality sequence and of its relationship to other flat collections. 
  5363.  
  5364. Note:  All member functions of equality sequence are described under "List of 
  5365. Functions". 
  5366.  
  5367.  
  5368. ΓòÉΓòÉΓòÉ 3.4.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  5369.  
  5370. IEqualitySequence, the first class in the table below, is the default 
  5371. implementation variant. If you want to use polymorphism, you can replace the 
  5372. following class implementation variants by the reference class. 
  5373.  
  5374. Class Name          Header File  Based On
  5375.  
  5376. IEqualitySequence   ieqseq.h     LinkedSequence
  5377. IGEqualitySequence  ieqseq.h     LinkedSequence
  5378. IEqualitySequence-  ieqts.h      TabularSequence
  5379.  OnTabularSequence
  5380. IGEqualitySequence  ieqts.h      TabularSequence
  5381. IEqualitySequence-  ieqds.h      DilutedSequence
  5382.  OnDilutedSequence
  5383. IGEqualitySequence  ieqds.h      DilutedSequence
  5384.  
  5385.  
  5386. ΓòÉΓòÉΓòÉ 3.4.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  5387.  
  5388. The following implementation variants are defined for equality sequences: 
  5389.  
  5390. o Equality Sequence 
  5391. o Equality Sequence on Tabular Sequence 
  5392. o Equality Sequence on Diluted Sequence 
  5393.  
  5394.  
  5395. ΓòÉΓòÉΓòÉ 3.4.2.1. Equality Sequence ΓòÉΓòÉΓòÉ
  5396.  
  5397. IEqualitySequence  <Element>
  5398. IGEqualitySequence <Element, EOps>
  5399.  
  5400. The default implementation of IEqualitySequence requires the following element 
  5401. functions: 
  5402.  
  5403. Element Type 
  5404.  
  5405. o Assignment 
  5406. o Equality test 
  5407.  
  5408.  
  5409. ΓòÉΓòÉΓòÉ 3.4.2.2. Equality Sequence on Tabular Sequence ΓòÉΓòÉΓòÉ
  5410.  
  5411. IEqualitySequenceOnTabularSequence  <Element>
  5412. IGEqualitySequenceOnTabularSequence <Element, EOps>
  5413.  
  5414. The implementation of the class IEqualitySequenceOnTabularSequence requires the 
  5415. following element functions: 
  5416.  
  5417. Element Type 
  5418.  
  5419. o Default constructor 
  5420. o Copy constructor 
  5421. o Destructor 
  5422. o Assignment 
  5423. o Equality test 
  5424.  
  5425.  
  5426. ΓòÉΓòÉΓòÉ 3.4.2.3. Equality Sequence on Diluted Sequence ΓòÉΓòÉΓòÉ
  5427.  
  5428. IEqualitySequenceOnDilutedSequence  <Element>
  5429. IGEqualitySequenceOnDilutedSequence <Element, EOps>
  5430.  
  5431. The implementation of the class IEqualitySequenceOnDilutedSequence requires the 
  5432. following element functions: 
  5433.  
  5434. Element Type 
  5435.  
  5436. o Default constructor 
  5437. o Copy constructor 
  5438. o Destructor 
  5439. o Assignment 
  5440. o Equality test 
  5441.  
  5442.  
  5443. ΓòÉΓòÉΓòÉ 3.4.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  5444.  
  5445. For polymorphism, you can use the corresponding abstract class, IAEqSeq, which 
  5446. is found in the iaeqseq.h header file, or the corresponding reference class, 
  5447. IREqSeq, which is found in the ireqseq.h header file. See Polymorphic Use of 
  5448. Collections for further information. 
  5449.  
  5450.  
  5451. ΓòÉΓòÉΓòÉ 3.4.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  5452.  
  5453. IAEqSequ <Element>
  5454. IREqSequ <Element, ConcreteBase>
  5455.  
  5456. The concrete base class is one of the classes defined above. 
  5457.  
  5458. The required functions are the same as the required functions of the concrete 
  5459. base class. 
  5460.  
  5461.  
  5462. ΓòÉΓòÉΓòÉ 3.4.4. Declarations for Equality Sequence ΓòÉΓòÉΓòÉ
  5463.  
  5464. template < class Element >
  5465. class IEqualitySequence {
  5466. public:
  5467.  
  5468.   class Cursor : ICursor {
  5469.     Element& element ();
  5470.     void setToLast ();
  5471.     void setToPrevious ();
  5472.     Boolean operator== (Cursor const& cursor);
  5473.     Boolean operator!= (Cursor const& cursor);
  5474.   };
  5475.  
  5476.                   IEqualitySequence  (INumber numberOfElements = 100);
  5477.                   IEqualitySequence  (IEqualitySequence < Element > const&);
  5478.    IEqualitySequence < Element >&
  5479.                   operator =         (IEqualitySequence < Element > const&);
  5480.                   ~IEqualitySequence ();
  5481.    Boolean        add                (Element const&);
  5482.    Boolean        add                (Element const&, ICursor&);
  5483.    void           addAllFrom         (IEqualitySequence < Element > const&);
  5484.    Element const& elementAt          (ICursor const&) const;
  5485.    Element&       elementAt          (ICursor const&);
  5486.    Element const& anyElement         () const;
  5487.    void           removeAt           (ICursor const&);
  5488.    INumber        removeAll          (Boolean (*property)
  5489.                                       (Element const&, void*),
  5490.                                       void* additionalArgument = 0);
  5491.    void           replaceAt          (ICursor const&, Element const&);
  5492.    void           removeAll          ();
  5493.    Boolean        isBounded          () const;
  5494.    INumber        maxNumberOfElements() const;
  5495.    INumber        numberOfElements   () const;
  5496.    Boolean        isEmpty            () const;
  5497.    Boolean        isFull             () const;
  5498.    ICursor*       newCursor          () const;
  5499.    Boolean        setToFirst         (ICursor&) const;
  5500.    Boolean        setToNext          (ICursor&) const;
  5501.    Boolean        allElementsDo      (Boolean (*function) (Element&, void*),
  5502.                                       void* additionalArgument = 0);
  5503.    Boolean        allElementsDo      (IIterator <Element>&);
  5504.    Boolean        allElementsDo      (Boolean (*function)
  5505.                                       (Element const&, void*),
  5506.                                       void* additionalArgument = 0) const;
  5507.    Boolean        allElementsDo      (IConstantIterator <Element>&) const;
  5508.    Boolean        isConsistent       () const;
  5509.    Boolean        contains           (Element const&) const;
  5510.    Boolean        containsAllFrom    (IEqualitySequence < Element > const&) const;
  5511.    Boolean        locate             (Element const&, ICursor&) const;
  5512.    Boolean        locateOrAdd        (Element const&);
  5513.    Boolean        locateOrAdd        (Element const&, ICursor&);
  5514.    Boolean        remove             (Element const&);
  5515.    INumber        numberOfOccurrences   (Element const&) const;
  5516.    Boolean        locateNext         (Element const&, ICursor&) const;
  5517.    INumber        removeAllOccurrences  (Element const&);
  5518.    Boolean        operator ==        (IEqualitySequence < Element > const&) const;
  5519.    Boolean        operator !=        (IEqualitySequence < Element > const&) const;
  5520.    void           removeFirst        ();
  5521.    void           removeLast         ();
  5522.    void           removeAtPosition   (IPosition);
  5523.    Element const& firstElement       () const;
  5524.    Element const& lastElement        () const;
  5525.    Element const& elementAtPosition  (IPosition) const;
  5526.    Boolean        setToLast          (ICursor&) const;
  5527.    Boolean        setToPrevious      (ICursor&) const;
  5528.    void           setToPosition      (IPosition, ICursor&) const;
  5529.    Boolean        isFirst            (ICursor const&) const;
  5530.    Boolean        isLast             (ICursor const&) const;
  5531.    long           compare            (IEqualitySequence < Element > const&,
  5532.                                       long (*comparisonFunction)
  5533.                                          (Element const&,
  5534.                                           Element const&)) const;
  5535.    void           addAsFirst         (Element const&);
  5536.    void           addAsFirst         (Element const&, ICursor&);
  5537.    void           addAsLast          (Element const&);
  5538.    void           addAsLast          (Element const&, ICursor&);
  5539.    void           addAsNext          (Element const&, ICursor&);
  5540.    void           addAsPrevious      (Element const&, ICursor&);
  5541.    void           addAtPosition      (IPosition, Element const&);
  5542.    void           addAtPosition      (IPosition, Element const&, ICursor&);
  5543.    void           sort               (long (*comparisonFunction)
  5544.                                       (Element const&, Element const&));
  5545.    Boolean        locateFirst        (Element const&, ICursor&) const;
  5546.    Boolean        locateLast         (Element const&, ICursor&) const;
  5547.    Boolean        locatePrevious     (Element const&, ICursor&) const;
  5548.  
  5549. };
  5550.  
  5551.  
  5552. ΓòÉΓòÉΓòÉ 3.5. Heap ΓòÉΓòÉΓòÉ
  5553.  
  5554. A heap is an unordered collection of zero or more elements with no key. 
  5555. Element equality is not supported.  Multiple elements are supported.  The type 
  5556. and value of the elements are irrelevant, and have no effect on the behavior of 
  5557. the heap. 
  5558.  
  5559. Combination of Flat Collection Properties illustrates the properties of a heap 
  5560. and of its relationship to other flat collections. 
  5561.  
  5562. Note:  All member functions of heap are described under "List of Functions". 
  5563.  
  5564.  
  5565. ΓòÉΓòÉΓòÉ 3.5.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  5566.  
  5567. IHeap, the first class in the table below, is the default implementation 
  5568. variant. If you need to use polymorphism, you can replace the following class 
  5569. implementation variants by the reference class. 
  5570.  
  5571. Class Name              Header File  Based On
  5572.  
  5573. IHeap                   iheap.h      LinkedSequence
  5574. IGHeap                  iheap.h      LinkedSequence
  5575. IHeapOnTabularSequence  iheapts.h    TabularSequence
  5576. IGHeapOnTabularSequence iheapts.h    TabularSequence
  5577. IHeapOnDilutedSequence  iheapds.h    DilutedSequence
  5578. IGHeapOnDilutedSequence iheapds.h    DilutedSequence
  5579.  
  5580.  
  5581. ΓòÉΓòÉΓòÉ 3.5.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  5582.  
  5583. The following implementation variants are defined for heaps: 
  5584.  
  5585. o Heap 
  5586. o Heap on Tabular Sequence 
  5587. o Heap on Diluted Sequence 
  5588.  
  5589.  
  5590. ΓòÉΓòÉΓòÉ 3.5.2.1. Heap ΓòÉΓòÉΓòÉ
  5591.  
  5592. IHeap  <Element>
  5593. IGHeap <Element, StdOps>
  5594.  
  5595. The default implementation of IHeap requires the following element functions: 
  5596.  
  5597. Element Type 
  5598.  
  5599. o Copy constructor 
  5600. o Assignment 
  5601.  
  5602.  
  5603. ΓòÉΓòÉΓòÉ 3.5.2.2. Heap on Tabular Sequence ΓòÉΓòÉΓòÉ
  5604.  
  5605. IHeapOnTabularSequence  <Element>
  5606. IGHeapOnTabularSequence <Element, StdOps>
  5607.  
  5608. The implementation of the class IHeapOnTabularSequence requires the following 
  5609. element functions: 
  5610.  
  5611. Element Type 
  5612.  
  5613. o Default constructor 
  5614. o Copy constructor 
  5615. o Assignment 
  5616.  
  5617.  
  5618. ΓòÉΓòÉΓòÉ 3.5.2.3. Heap on Diluted Sequence ΓòÉΓòÉΓòÉ
  5619.  
  5620. IHeapOnDilutedSequence  <Element>
  5621. IGHeapOnDilutedSequence <Element, StdOps>
  5622.  
  5623. The implementation of the class IHeapOnDilutedSequence requires the following 
  5624. element functions: 
  5625.  
  5626. Element Type 
  5627.  
  5628. o Default constructor 
  5629. o Copy constructor 
  5630.  
  5631.  
  5632. ΓòÉΓòÉΓòÉ 3.5.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  5633.  
  5634. For polymorphism, you can use the corresponding abstract class, IAHeap, which 
  5635. is found in the iaheap.h header file, or the corresponding reference class, 
  5636. IRHeap, which is found in the irheap.h header file. 
  5637.  
  5638.  
  5639. ΓòÉΓòÉΓòÉ 3.5.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  5640.  
  5641. IAHeap <Element>
  5642. IRHeap <Element, ConcreteBase>
  5643.  
  5644. The concrete base class is one of the heap classes. 
  5645.  
  5646. The required functions are the same as the required functions of the concrete 
  5647. base class. 
  5648.  
  5649.  
  5650. ΓòÉΓòÉΓòÉ 3.5.4. Declarations for Heap ΓòÉΓòÉΓòÉ
  5651.  
  5652. template < class Element >
  5653. class IHeap {
  5654. public:
  5655.   class Cursor : ICursor {
  5656.     Element& element ();
  5657.     Boolean operator== (Cursor const& cursor);
  5658.     Boolean operator!= (Cursor const& cursor);
  5659.   };
  5660.                   IHeap             (INumber numberOfElements = 100,
  5661.                                      IBoundIndicator = IUnbounded);
  5662.                   IHeap             (IHeap < Element > const&);
  5663.    IHeap < Element >&    operator = (IHeap < Element > const&);
  5664.                   ~IHeap            ();
  5665.    Boolean        add               (Element const&);
  5666.    Boolean        add               (Element const&, ICursor&);
  5667.    void           addAllFrom        (IHeap < Element > const&);
  5668.    Element const& elementAt         (ICursor const&) const;
  5669.    Element&       elementAt         (ICursor const&);
  5670.    Element const& anyElement        () const;
  5671.    void           removeAt          (ICursor const&);
  5672.    INumber        removeAll         (Boolean (*property)
  5673.                                      (Element const&, void*),
  5674.                                      void* additionalArgument = 0);
  5675.    void           replaceAt         (ICursor const&, Element const&);
  5676.    void           removeAll         ();
  5677.    Boolean        isBounded         () const;
  5678.    INumber        maxNumberOfElements () const;
  5679.    INumber        numberOfElements  () const;
  5680.    Boolean        isEmpty           () const;
  5681.    Boolean        isFull            () const;
  5682.    ICursor*       newCursor         () const;
  5683.    Boolean        setToFirst        (ICursor&) const;
  5684.    Boolean        setToNext         (ICursor&) const;
  5685.    Boolean        allElementsDo     (Boolean (*function) (Element&, void*),
  5686.                                      void* additionalArgument = 0);
  5687.    Boolean        allElementsDo     (IIterator <Element>&);
  5688.    Boolean        allElementsDo     (Boolean (*function)
  5689.                                      (Element const&, void*),
  5690.                                      void* additionalArgument = 0) const;
  5691.    Boolean        allElementsDo     (IConstantIterator <Element>&) const;
  5692. };
  5693.  
  5694.  
  5695. ΓòÉΓòÉΓòÉ 3.5.5. Coding Example for Heap ΓòÉΓòÉΓòÉ
  5696.  
  5697. See Coding Example for Key Sorted Set for an example of using a heap. 
  5698.  
  5699.  
  5700. ΓòÉΓòÉΓòÉ 3.6. Key Bag ΓòÉΓòÉΓòÉ
  5701.  
  5702. A key bag is an unordered collection of zero or more elements that have a key. 
  5703. Multiple elements are supported. 
  5704.  
  5705. Behavior of add for Unique and Multiple Collections illustrates the differences 
  5706. in behavior between map, relation, key set, and key bag when adding identical 
  5707. elements and elements with the same key. 
  5708.  
  5709. Combination of Flat Collection Properties gives an overview of the properties 
  5710. of a key bag and its relationship to other flat collections. 
  5711.  
  5712. Note:  All member functions of key bag are described under "List of Functions". 
  5713.  
  5714.  
  5715. ΓòÉΓòÉΓòÉ 3.6.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  5716.  
  5717. IKeyBag, the first class in the table below, is the default implementation 
  5718. variant. If you want to use polymorphism, you can replace the following class 
  5719. implementation variants by the reference class. 
  5720.  
  5721. Class Name       Header File    Based On
  5722.  
  5723. IKeyBag          ikeybag.h      Hash Table
  5724. IGKeyBag         ikeybag.h      Hash Table
  5725. IHashKeyBag      ihshkb.h       Hash Table
  5726. IGHashKeyBag     ihshkb.h       Hash Table (basic)
  5727.  
  5728.  
  5729. ΓòÉΓòÉΓòÉ 3.6.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  5730.  
  5731. The following implementation variants are defined for key bags: 
  5732.  
  5733. o Key Bag 
  5734. o Hash Key Bag 
  5735.  
  5736.  
  5737. ΓòÉΓòÉΓòÉ 3.6.2.1. Key Bag ΓòÉΓòÉΓòÉ
  5738.  
  5739. IKeyBag  <Element, Key>
  5740. IGKeyBag <Element, Key, KEHOps>
  5741.  
  5742. The default implementation of the class IKeyBag requires the following element 
  5743. and key functions: 
  5744.  
  5745. Element Type 
  5746.  
  5747. o Copy constructor 
  5748. o Destructor 
  5749. o Assignment 
  5750. o Key access 
  5751.  
  5752. Key Type 
  5753.  
  5754. o Equality test 
  5755. o Hash function 
  5756.  
  5757.  
  5758. ΓòÉΓòÉΓòÉ 3.6.2.2. Hash Key Bag ΓòÉΓòÉΓòÉ
  5759.  
  5760. IHashKeyBag  <Element, Key>
  5761. IGHashKeyBag <Element, Key, KEHOps>
  5762.  
  5763. The implementation of the class IHashKeyBag requires the following element and 
  5764. key functions: 
  5765.  
  5766. Element Type 
  5767.  
  5768. o Copy constructor 
  5769. o Destructor 
  5770. o Assignment 
  5771. o Key access 
  5772.  
  5773. Key Type 
  5774.  
  5775. o Equality test 
  5776. o Hash function 
  5777.  
  5778.  
  5779. ΓòÉΓòÉΓòÉ 3.6.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  5780.  
  5781. For polymorphism, you can use the corresponding abstract class, IAKeyBag, which 
  5782. is found in the iakeybag.h header file, or the corresponding reference class, 
  5783. IRKeyBag, which is found in the irkeybag.h header file. See Polymorphic Use of 
  5784. Collections for further information. 
  5785.  
  5786.  
  5787. ΓòÉΓòÉΓòÉ 3.6.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  5788.  
  5789. IAKeyBag <Element, Key>
  5790. IRKeyBag <Element, Key, ConcreteBase>
  5791.  
  5792. The concrete base class is one of the classes defined above. 
  5793.  
  5794. The required functions are the same as the required functions of the concrete 
  5795. base class. 
  5796.  
  5797.  
  5798. ΓòÉΓòÉΓòÉ 3.6.4. Declarations for Key Bag ΓòÉΓòÉΓòÉ
  5799.  
  5800. template  <class Element, class Key >
  5801. class IKeyBag {
  5802. public:
  5803.   class Cursor : ICursor {
  5804.     Element& element ();
  5805.     Boolean operator== (Cursor const& cursor);
  5806.     Boolean operator!= (Cursor const& cursor);
  5807.   };
  5808.                   IKeyBag             (INumber
  5809.                                                numberOfElements = 100,
  5810.                                                IBoundIndicator =
  5811.                                                IUnbounded);
  5812.                   IKeyBag             (IKeyBag < Element, Key > const&);
  5813.    IKeyBag < Element, Key >& operator = (IKeyBag < Element, Key > const&);
  5814.                  ~IKeyBag             ();
  5815.    Boolean        add                         (Element const&);
  5816.    Boolean        add                         (Element const&,
  5817.                                                ICursor&);
  5818.    void           addAllFrom                  (IKeyBag < Element, Key > const&);
  5819.    Element const& elementAt                   (ICursor const&) const;
  5820.    Element&       elementAt                   (ICursor const&);
  5821.    Element const& anyElement                  () const;
  5822.    void           removeAt                    (ICursor const&);
  5823.    INumber        removeAll                   (Boolean (*property)
  5824.                                                (Element const&, void*),
  5825.                                                void* additionalArgument = 0);
  5826.    void           replaceAt                   (ICursor const&,
  5827.                                                Element const&);
  5828.    void           removeAll                   ();
  5829.    Boolean        isBounded                   () const;
  5830.    INumber        maxNumberOfElements         () const;
  5831.    INumber        numberOfElements            () const;
  5832.    Boolean        isEmpty                     () const;
  5833.    Boolean        isFull                      () const;
  5834.    ICursor*       newCursor                   () const;
  5835.    Boolean        setToFirst                  (ICursor&) const;
  5836.    Boolean        setToNext                   (ICursor&) const;
  5837.    Boolean        allElementsDo               (Boolean (*function)
  5838.                                                   (Element&, void*),
  5839.                                                void* additionalArgument = 0);
  5840.    Boolean        allElementsDo               (IIterator <Element>&);
  5841.    Boolean        allElementsDo               (Boolean (*function)
  5842.                                                (Element const&, void*),
  5843.                                                void* additionalArgument = 0)
  5844.                                                const;
  5845.    Boolean        allElementsDo               (IConstantIterator
  5846.                                                   <Element>&) const;
  5847.    Key const&     key                         (Element const&) const;
  5848.    Boolean        containsElementWithKey      (Key const&) const;
  5849.    Boolean        containsAllKeysFrom  (IKeyBag < Element, Key > const&) const;
  5850.    Boolean        locateElementWithKey        (Key const&, ICursor&)
  5851.                                                const;
  5852.    Boolean        replaceElementWithKey       (Element const&);
  5853.    Boolean        replaceElementWithKey       (Element const&,
  5854.                                                ICursor&);
  5855.    Boolean        locateOrAddElementWithKey   (Element const&);
  5856.    Boolean        locateOrAddElementWithKey   (Element const&,
  5857.                                                ICursor&);
  5858.    Boolean        addOrReplaceElementWithKey  (Element const&);
  5859.    Boolean        addOrReplaceElementWithKey  (Element const&,
  5860.                                                ICursor&);
  5861.    Boolean        removeElementWithKey        (Key const&);
  5862.    Element const& elementWithKey              (Key const&) const;
  5863.    Element&       elementWithKey              (Key const&);
  5864.    INumber        numberOfElementsWithKey     (Key const&) const;
  5865.    Boolean        locateNextElementWithKey    (Key const&,
  5866.                                                ICursor&) const;
  5867.    INumber        removeAllElementsWithKey    (Key const&);
  5868.    INumber        numberOfDifferentKeys       () const;
  5869.    Boolean        setToNextWithDifferentKey   (ICursor&) const;
  5870. };
  5871.  
  5872.  
  5873. ΓòÉΓòÉΓòÉ 3.6.5. Coding Example for Key Bag ΓòÉΓòÉΓòÉ
  5874.  
  5875. The following program uses the default key bag class, IKeyBag to create a key 
  5876. bag for storing observations made on animals. The key of the class is the name 
  5877. of the animal.  The program produces various reports regarding the 
  5878. observations.  Then it removes all the extinct animals, which are stored in a 
  5879. sequence, from the key bag. 
  5880.  
  5881. The program uses the add function to fill the key bag and the forCursor macro 
  5882. to display the observations. It uses the following functions to produce the 
  5883. reports: 
  5884.  
  5885. o numberOfElements 
  5886. o numberOfDifferentKeys 
  5887. o numberOfElementsWithKey 
  5888. o locateElementWithKey 
  5889. o setToNextElementWithKey 
  5890. o removeAllElementsWithKey 
  5891.  
  5892. // animals.C  -  An example of using a Key Bag
  5893. #include <iostream.h>
  5894.                // Class Animal:
  5895. #include "animal.h"
  5896.  
  5897.                // Let's use the default Key Bag:
  5898. #include <ikeybag.h>
  5899. typedef IKeyBag<Animal, ToyString> Animals;
  5900.  
  5901.                // For keys let's use the default Sequence:
  5902. #include <iseq.h>
  5903. typedef ISequence<ToyString> Names;
  5904.  
  5905.  
  5906. main() {
  5907.  
  5908.    Animals animals;
  5909.    Animals::Cursor animalsCur1(animals), animalsCur2(animals);
  5910.  
  5911.    animals.add(Animal("bear", "heavy"));
  5912.    animals.add(Animal("bear", "strong"));
  5913.    animals.add(Animal("dinosaur", "heavy"));
  5914.    animals.add(Animal("dinosaur", "huge"));
  5915.    animals.add(Animal("dinosaur", "extinct"));
  5916.    animals.add(Animal("eagle", "black"));
  5917.    animals.add(Animal("eagle", "strong"));
  5918.    animals.add(Animal("lion", "dangerous"));
  5919.    animals.add(Animal("lion", "strong"));
  5920.    animals.add(Animal("mammoth", "long haired"));
  5921.    animals.add(Animal("mammoth", "extinct"));
  5922.    animals.add(Animal("sabre tooth tiger", "extinct"));
  5923.    animals.add(Animal("zebra", "striped"));
  5924.  
  5925.                  // Display all elements in animals:
  5926.    cout << "\nAll our observations on animals:\n";
  5927.    forCursor(animalsCur1)  cout << "    " << animalsCur1.element();
  5928.  
  5929.    cout << "\n\nNumber of observations on animals: "
  5930.         << animals.numberOfElements() << "\n";
  5931.  
  5932.    cout << "\nNumber of different animals: "
  5933.         << animals.numberOfDifferentKeys() << "\n";
  5934.  
  5935.    Names namesOfExtinct(animals.numberOfDifferentKeys());
  5936.    Names::Cursor extinctCur1(namesOfExtinct);
  5937.  
  5938.    animalsCur1.setToFirst();
  5939.    do {
  5940.       ToyString name = animalsCur1.element().name();
  5941.  
  5942.       cout << "\nWe have " << animals.numberOfElementsWithKey(name)
  5943.            << " observations on " << name.text() << ":\n";
  5944.  
  5945.                    // We need to use a separate cursor here
  5946.                    // because otherwise animalsCur1 would become
  5947.                    // invalid after last locateNextElement...()
  5948.       animals.locateElementWithKey(name, animalsCur2);
  5949.       do  {
  5950.          ToyString attribute = animalsCur2.element().attribute();
  5951.          cout << "    " << attribute << "\n";
  5952.          if (attribute == "extinct") namesOfExtinct.add(name);
  5953.       } while (animals.locateNextElementWithKey(name, animalsCur2));
  5954.  
  5955.    } while (animals.setToNextWithDifferentKey(animalsCur1));
  5956.  
  5957.                  // Remove all observations on extinct animals:
  5958.    forCursor(extinctCur1)
  5959.       animals.removeAllElementsWithKey(extinctCur1.element());
  5960.  
  5961.                  // Display all elements in animals:
  5962.    cout << "\n\nAfter removing all observations on extinct animals:\n";
  5963.    forCursor(animalsCur1)  cout << "    " << animalsCur1.element();
  5964.  
  5965.    cout << "\nNumber of observations on animals: "
  5966.         << animals.numberOfElements() << "\n";
  5967.  
  5968.    cout << "\nNumber of different animals: "
  5969.         << animals.numberOfDifferentKeys() << "\n";
  5970.  
  5971.    return 0;
  5972. }
  5973.  
  5974. The program produces the following output: 
  5975.  
  5976.  
  5977. All our observations on animals:
  5978.     The eagle is strong.
  5979.     The eagle is black.
  5980.     The bear is strong.
  5981.     The bear is heavy.
  5982.     The zebra is striped.
  5983.     The mammoth is extinct.
  5984.     The mammoth is long haired.
  5985.     The lion is strong.
  5986.     The lion is dangerous.
  5987.     The dinosaur is extinct.
  5988.     The dinosaur is huge.
  5989.     The dinosaur is heavy.
  5990.     The sabre tooth tiger is extinct.
  5991.  
  5992.  
  5993. Number of observations on animals: 13
  5994.  
  5995. Number of different animals: 7
  5996.  
  5997. We have 2 observations on eagle:
  5998.     strong
  5999.     black
  6000.  
  6001. We have 2 observations on bear:
  6002.     strong
  6003.     heavy
  6004.  
  6005. We have 1 observations on zebra:
  6006.     striped
  6007.  
  6008. We have 2 observations on mammoth:
  6009.     extinct
  6010.     long haired
  6011.  
  6012. We have 2 observations on lion:
  6013.     strong
  6014.     dangerous
  6015.  
  6016. We have 3 observations on dinosaur:
  6017.     extinct
  6018.     huge
  6019.     heavy
  6020.  
  6021. We have 1 observations on sabre tooth tiger:
  6022.     extinct
  6023.  
  6024.  
  6025. After removing all observations on extinct animals:
  6026.     The eagle is strong.
  6027.     The eagle is black.
  6028.     The bear is strong.
  6029.     The bear is heavy.
  6030.     The zebra is striped.
  6031.     The lion is strong.
  6032.     The lion is dangerous.
  6033.  
  6034. Number of observations on animals: 7
  6035.  
  6036. Number of different animals: 4
  6037.  
  6038.  
  6039. ΓòÉΓòÉΓòÉ 3.7. Key Set ΓòÉΓòÉΓòÉ
  6040.  
  6041. A key set is an unordered collection of zero or more elements that have a key. 
  6042. Element equality is not supported.  Only unique elements are supported, in 
  6043. terms of their key. 
  6044.  
  6045. Behavior of add for Unique and Multiple Collections illustrates the differences 
  6046. in behavior between map, relation, key set, and key bag when adding identical 
  6047. elements and elements with the same key. 
  6048.  
  6049. Combination of Flat Collection Properties gives an overview of the properties 
  6050. of a key set and its relationship to other flat collections. 
  6051.  
  6052. Note:  All member functions of key set are described under "List of Functions". 
  6053.  
  6054.  
  6055. ΓòÉΓòÉΓòÉ 3.7.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  6056.  
  6057. IKeySet, the first class in the table below, is the default implementation 
  6058. variant. If you want to use polymorphism, you can replace the following class 
  6059. implementation variants by the reference class. 
  6060.  
  6061. Class Name                      Header File Based On
  6062.  
  6063. IKeySet                         ikeyset.h   AVL KeySortedSet
  6064. IGKeySet                        ikeyset.h   AVL KeySortedSet
  6065. IKeySetOnBSTKeySortedSet        iksbst.h    B* KeySortedSet
  6066. IGKeySetOnBSTKeySortedSet       iksbst.h    B* KeySortedSet
  6067. IHashKeySet                     ihshks.h    Hash table for
  6068.                                              KeySet (basic)
  6069. IGHashKeySet                    ihshks.h    Hash table for
  6070.                                              KeySet (basic)
  6071. IKeySetOnSortedLinkedSequence   ikssls.h    LinkedSequence
  6072. IGKeySetOnSortedLinkedSequence  ikssls.h    LinkedSequence
  6073. IKeySetOnSortedTabularSequence  ikssts.h    TabularSequence
  6074. IGKeySetOnSortedTabularSequence ikssts.h    TabularSequence
  6075. IKeySetOnSortedDilutedSequence  ikssds.h    Diluted Sequence
  6076. IGKeySetOnSortedDilutedSequence ikssds.h    DilutedSequence
  6077.  
  6078.  
  6079. ΓòÉΓòÉΓòÉ 3.7.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  6080.  
  6081. The following implementation variants are defined for key sets: 
  6082.  
  6083. o Key Set 
  6084. o Key Set on B* Key Sorted Set 
  6085. o Hash Key Set 
  6086. o Key Set on Sorted Linked Sequence 
  6087. o Key Set on Sorted Tabular Sequence 
  6088. o Key Set on Sorted Diluted Sequence 
  6089.  
  6090.  
  6091. ΓòÉΓòÉΓòÉ 3.7.2.1. Key Set ΓòÉΓòÉΓòÉ
  6092.  
  6093. IKeySet  <Element, Key>
  6094. IGKeySet <Element, Key, KCOps>
  6095.  
  6096. The default implementation of the class IKeySet requires the following element 
  6097. and key functions: 
  6098.  
  6099. Element Type 
  6100.  
  6101. o Copy constructor 
  6102. o Destructor 
  6103. o Assignment 
  6104. o Key access 
  6105.  
  6106. Key Type 
  6107.  
  6108. Ordering relation 
  6109.  
  6110.  
  6111. ΓòÉΓòÉΓòÉ 3.7.2.2. Key Set on B* Key Sorted Set ΓòÉΓòÉΓòÉ
  6112.  
  6113. IKeySetOnBSTKeySortedSet  <Element, Key>
  6114. IGKeySetOnBSTKeySortedSet <Element, Key, KCOps>
  6115.  
  6116. The default implementation of the class IKeySetOnBSTKeySortedSet  requires the 
  6117. following element and key functions: 
  6118.  
  6119. Element Type 
  6120.  
  6121. o Default constructor 
  6122. o Copy constructor 
  6123. o Destructor 
  6124. o Assignment 
  6125. o Key access 
  6126.  
  6127. Key Type 
  6128.  
  6129. Ordering relation 
  6130.  
  6131.  
  6132. ΓòÉΓòÉΓòÉ 3.7.2.3. Hash Key Set ΓòÉΓòÉΓòÉ
  6133.  
  6134. IHashKeySet  <Element, Key>
  6135. IGHashKeySet <Element, Key, KEHOps>
  6136.  
  6137. The implementation class IGHashKeySet requires the following element and key 
  6138. functions: 
  6139.  
  6140. Element Type 
  6141.  
  6142. o Copy constructor 
  6143. o Destructor 
  6144. o Assignment 
  6145. o Key access 
  6146.  
  6147. Key Type 
  6148.  
  6149. o Equality test 
  6150. o Hash function 
  6151.  
  6152.  
  6153. ΓòÉΓòÉΓòÉ 3.7.2.4. Key Set on Sorted Linked Sequence ΓòÉΓòÉΓòÉ
  6154.  
  6155. IKeySetOnSortedLinkedSequence  <Element, Key>
  6156. IGKeySetOnSortedLinkedSequence <Element, Key, KCOps>
  6157.  
  6158. The default implementation of the class IKeySetOnSortedLinkedSequence requires 
  6159. the following element and key functions: 
  6160.  
  6161. Element Type 
  6162.  
  6163. o Copy constructor 
  6164. o Destructor 
  6165. o Assignment 
  6166. o Key access 
  6167.  
  6168. Key Type 
  6169.  
  6170. Ordering relation 
  6171.  
  6172.  
  6173. ΓòÉΓòÉΓòÉ 3.7.2.5. Key Set on Sorted Tabular Sequence ΓòÉΓòÉΓòÉ
  6174.  
  6175. IKeySetOnSortedTabularSequence  <Element, Key>
  6176. IGKeySetOnSortedTabularSequence <Element, Key, KCOps>
  6177.  
  6178. The default implementation of the class IKeySetOnSortedTabularSequence requires 
  6179. the following element and key functions: 
  6180.  
  6181. Element Type 
  6182.  
  6183. o Default constructor 
  6184. o Copy constructor 
  6185. o Destructor 
  6186. o Assignment 
  6187. o Key access 
  6188.  
  6189. Key Type 
  6190.  
  6191. Ordering relation 
  6192.  
  6193.  
  6194. ΓòÉΓòÉΓòÉ 3.7.2.6. Key Set on Sorted Diluted Sequence ΓòÉΓòÉΓòÉ
  6195.  
  6196. IKeySetOnSortedDilutedSequence  <Element, Key>
  6197. IGKeySetOnSortedDilutedSequence <Element, Key, KCOps>
  6198.  
  6199. The default implementation of the class IKeySetOnSortedDilutedSequence requires 
  6200. the following element and key functions: 
  6201.  
  6202. Element Type 
  6203.  
  6204. o Default constructor 
  6205. o Copy constructor 
  6206. o Destructor 
  6207. o Assignment 
  6208. o Key access 
  6209.  
  6210. Key Type 
  6211.  
  6212. Ordering relation 
  6213.  
  6214.  
  6215. ΓòÉΓòÉΓòÉ 3.7.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  6216.  
  6217. For polymorphism, you can use the corresponding abstract class, IAKeySet, which 
  6218. is found in the iakeyset.h header file, or the corresponding reference class, 
  6219. IRKeySet, which is found in the irkeyset.h header file. See Polymorphic Use of 
  6220. Collections for further information. 
  6221.  
  6222.  
  6223. ΓòÉΓòÉΓòÉ 3.7.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  6224.  
  6225. IAKeySet <Element, Key>
  6226. IRKeySet <Element, Key, ConcreteBase>
  6227.  
  6228. The concrete base class is one of the classes defined above. 
  6229.  
  6230. The required functions are the same as the required functions of the concrete 
  6231. base class. 
  6232.  
  6233.  
  6234. ΓòÉΓòÉΓòÉ 3.7.4. Declarations for Key Set ΓòÉΓòÉΓòÉ
  6235.  
  6236. template < class Element, class Key >
  6237. class IKeySet {
  6238. public:
  6239.   class Cursor : ICursor {
  6240.     Element& element ();
  6241.     Boolean operator== (Cursor const& cursor);
  6242.     Boolean operator!= (Cursor const& cursor);
  6243.   };
  6244.                   IKeySet             (INumber
  6245.                                        numberOfElements = 100,
  6246.                                        IBoundIndicator = IUnbounded);
  6247.                   IKeySet             (IKeySet < Element, Key > const&);
  6248.    IKeySet < Element, Key >& operator = (IKeySet < Element, Key > const&);
  6249.                   ~IKeySet            ();
  6250.    Boolean        add                 (Element const&);
  6251.    Boolean        add                 (Element const&, ICursor&);
  6252.    void           addAllFrom          (IKeySet < Element, Key > const&);
  6253.    Element const& elementAt           (ICursor const&) const;
  6254.    Element&       elementAt           (ICursor const&);
  6255.    Element const& anyElement          () const;
  6256.    void           removeAt            (ICursor const&);
  6257.    INumber        removeAll           (Boolean (*property)
  6258.                                        (Element const&, void*),
  6259.                                        void* additionalArgument = 0);
  6260.    void           replaceAt           (ICursor const&,
  6261.                                        Element const&);
  6262.    void           removeAll           ();
  6263.    Boolean        isBounded           () const;
  6264.    INumber        maxNumberOfElements () const;
  6265.    INumber        numberOfElements    () const;
  6266.    Boolean        isEmpty             () const;
  6267.    Boolean        isFull              () const;
  6268.    ICursor*       newCursor           () const;
  6269.    Boolean        setToFirst          (ICursor&) const;
  6270.    Boolean        setToNext           (ICursor&) const;
  6271.    Boolean        allElementsDo       (Boolean (*function)
  6272.                                        (Element&, void*),
  6273.                                        void* additionalArgument = 0);
  6274.    Boolean        allElementsDo       (IIterator <Element>&);
  6275.    Boolean        allElementsDo       (Boolean (*function)
  6276.                                        (Element const&, void*),
  6277.                                        void* additionalArgument = 0) const;
  6278.    Boolean        allElementsDo       (IConstantIterator <Element>&) const;
  6279.    Key const&     key                 (Element const&) const;
  6280.    Boolean    containsElementWithKey      (Key const&) const;
  6281.    Boolean    containsAllKeysFrom         (IKeySet < Element, Key > const&)
  6282.                                            const;
  6283.    Boolean    locateElementWithKey        (Key const&, ICursor&) const;
  6284.    Boolean    replaceElementWithKey       (Element const&);
  6285.    Boolean    replaceElementWithKey       (Element const&, ICursor&);
  6286.    Boolean    locateOrAddElementWithKey   (Element const&);
  6287.    Boolean    locateOrAddElementWithKey   (Element const&, ICursor&);
  6288.    Boolean    addOrReplaceElementWithKey  (Element const&);
  6289.    Boolean    addOrReplaceElementWithKey  (Element const&, ICursor&);
  6290.    Boolean    removeElementWithKey        (Key const&);
  6291.    Element const& elementWithKey          (Key const&) const;
  6292.    Element&   elementWithKey              (Key const&);
  6293. };
  6294.  
  6295.  
  6296. ΓòÉΓòÉΓòÉ 3.7.5. Coding Example for Key Set ΓòÉΓòÉΓòÉ
  6297.  
  6298. The following program implements a key set using the default class, IKeySet. 
  6299. The program adds four elements to the key set and then removes one element by 
  6300. looking for a key.  If an exception occurs, it displays the exception name and 
  6301. description. 
  6302.  
  6303. The program uses cursor iteration (the forCursor macro) to display the contents 
  6304. of the collection. To add and remove elements, it uses the add function and the 
  6305. removeElementWithKey function. 
  6306.  
  6307. //  intkyset.C  -  An example of using a Key Set
  6308. #include <iostream.h>
  6309. #include <iglobals.h>
  6310. #include <icursor.h>
  6311.  
  6312. #include <ikeyset.h>
  6313.  
  6314.                       // Class DemoElement:
  6315. #include "demoelem.h"
  6316.  
  6317.  
  6318. typedef IKeySet < DemoElement,int > TestKeySet;
  6319.  
  6320.  
  6321. ostream & operator << ( ostream & sout, TestKeySet const & t){
  6322.   sout << t.numberOfElements() << " elements are in the set:\n";
  6323.  
  6324.   TestKeySet::Cursor cursor (t);
  6325.   //  forCursor(c)
  6326.   // expands to
  6327.   //  for ((c).setToFirst (); (c).isValid (); (c).setToNext ())
  6328.  
  6329.   forCursor (cursor)
  6330.     sout << "   " << cursor.element() << "\n";
  6331.  
  6332.   return sout << "\n";
  6333. }
  6334.  
  6335.  
  6336. main(){
  6337.   TestKeySet t;
  6338.  try {
  6339.      t.add(DemoElement(1,1));
  6340.      t.add(DemoElement(2,4711));
  6341.      t.add(DemoElement(3,1));
  6342.      t.add(DemoElement(4,443));
  6343.  
  6344.      cout << t;
  6345.  
  6346.      t.removeElementWithKey (3);
  6347.      cout << t;
  6348.    }
  6349.  catch (IException & exception) {
  6350.    cout << exception.name() << " : " << exception.text();
  6351.    }
  6352.  
  6353.   return 0;
  6354. }
  6355.  
  6356. The program produces the following output: 
  6357.  
  6358. 4 elements are in the set:
  6359.    1,1
  6360.    2,4711
  6361.    3,1
  6362.    4,443
  6363.  
  6364. 3 elements are in the set:
  6365.    1,1
  6366.    2,4711
  6367.    4,443
  6368.  
  6369.  
  6370. ΓòÉΓòÉΓòÉ 3.8. Key Sorted Bag ΓòÉΓòÉΓòÉ
  6371.  
  6372. A key sorted bag is an ordered collection of zero or more elements that have a 
  6373. key.  Elements are sorted according to the value of their key field.  Element 
  6374. equality is not supported.  Multiple elements are supported. 
  6375.  
  6376. Combination of Flat Collection Properties gives an overview of the properties 
  6377. of a key sorted bag and its relationship to other flat collections. 
  6378.  
  6379. Note:  All member functions of key sorted bag are described under "List of 
  6380. Functions". 
  6381.  
  6382.  
  6383. ΓòÉΓòÉΓòÉ 3.8.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  6384.  
  6385. IKeySortedBag, the first class in the table below, is the default 
  6386. implementation variant. If you want to use polymorphism, you can replace the 
  6387. following class implementation variants by the reference class. 
  6388.  
  6389. Class Name                             Header File Based On
  6390.  
  6391. IKeySortedBag                          iksbag.h    LinkedSequence
  6392. IGKeySortedBag                         iksbag.h    LinkedSequence
  6393. IKeySortedBagOnSortedTabularSequence   iksbsts.h   TabularSequence
  6394. IGKeySortedBagOnSortedTabularSequence  iksbsts.h   TabularSequence
  6395. IKeySortedBagOnSortedDilutedSequence   iksbsds.h   DilutedSequence
  6396. IGKeySortedBagOnSortedDilutedSequence  iksbsds.h   DilutedSequence
  6397.  
  6398.  
  6399. ΓòÉΓòÉΓòÉ 3.8.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  6400.  
  6401. The following implementation variants are defined for key sorted bags: 
  6402.  
  6403. o Key Sorted Bag 
  6404. o Key Sorted Bag on Tabular Sequence 
  6405. o Key Sorted Bag on Diluted Sequence 
  6406.  
  6407.  
  6408. ΓòÉΓòÉΓòÉ 3.8.2.1. Key Sorted Bag ΓòÉΓòÉΓòÉ
  6409.  
  6410. IKeySortedBag  <Element, Key>
  6411. IGKeySortedBag <Element, Key, KCOps>
  6412.  
  6413. The implementation of the class IKeySortedBag requires the following element 
  6414. and key functions: 
  6415.  
  6416. Element Type 
  6417.  
  6418. o Copy constructor 
  6419. o Destructor 
  6420. o Assignment 
  6421. o Key access 
  6422.  
  6423. Key Type 
  6424.  
  6425. Ordering relation 
  6426.  
  6427.  
  6428. ΓòÉΓòÉΓòÉ 3.8.2.2. Key Sorted Bag on Tabular Sequence ΓòÉΓòÉΓòÉ
  6429.  
  6430. IKeySortedBagOnTabularSequence  <Element, Key>
  6431. IGKeySortedBagOnTabularSequence <Element, Key, KCOps>
  6432.  
  6433. The implementation of the class IKeySortedBagOnTabularSequence requires the 
  6434. following element and key functions: 
  6435.  
  6436. Element Type 
  6437.  
  6438. o Default constructor 
  6439. o Copy constructor 
  6440. o Destructor 
  6441. o Assignment 
  6442. o Key access 
  6443.  
  6444. Key Type 
  6445.  
  6446. Ordering relation 
  6447.  
  6448.  
  6449. ΓòÉΓòÉΓòÉ 3.8.2.3. Key Sorted Bag on Diluted Sequence ΓòÉΓòÉΓòÉ
  6450.  
  6451. IKeySortedBagOnDilutedSequence  <Element, Key>
  6452. IGKeySortedBagOnDilutedSequence <Element, Key, KCOps>
  6453.  
  6454. The implementation of the class IKeySortedBagOnDilutedSequence requires the 
  6455. following element and key functions: 
  6456.  
  6457. Element Type 
  6458.  
  6459. o Default constructor 
  6460. o Copy constructor 
  6461. o Destructor 
  6462. o Assignment 
  6463. o Key access 
  6464.  
  6465. Key Type 
  6466.  
  6467. Ordering relation 
  6468.  
  6469.  
  6470. ΓòÉΓòÉΓòÉ 3.8.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  6471.  
  6472. For polymorphism, you can use the corresponding abstract class, IAKeySortedBag, 
  6473. which is found in the iaksbag.h header file, or the corresponding reference 
  6474. class, IRKeySortedBag, which is found in the irksbag.h header file. See 
  6475. Polymorphic Use of Collections for further information. 
  6476.  
  6477.  
  6478. ΓòÉΓòÉΓòÉ 3.8.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  6479.  
  6480. IAKSBag <Element, Key>
  6481. IRKSBag <Element, Key, ConcreteBase>
  6482.  
  6483. The concrete base class is one of the classes defined above. 
  6484.  
  6485. The required functions are the same as the required functions of the concrete 
  6486. base class. 
  6487.  
  6488.  
  6489. ΓòÉΓòÉΓòÉ 3.8.4. Declarations for Key Sorted Bag ΓòÉΓòÉΓòÉ
  6490.  
  6491. template < class Element, class Key >
  6492. class IKeySortedBag {
  6493. public:
  6494.   class Cursor : ICursor {
  6495.     Element& element ();
  6496.     void setToLast ();
  6497.     void setToPrevious ();
  6498.     Boolean operator== (Cursor const& cursor);
  6499.     Boolean operator!= (Cursor const& cursor);
  6500.   };
  6501.                   IKeySortedBag    (INumber numberOfElements = 100,
  6502.                                     IBoundIndicator = IUnbounded);
  6503.                   IKeySortedBag    (IKeySortedBag < Element, Key > const&);
  6504.    IKeySortedBag < Element, Key >& operator =
  6505.                                    (IKeySortedBag < Element, Key > const&);
  6506.                   ~IKeySortedBag   ();
  6507.    Boolean        add              (Element const&);
  6508.    Boolean        add              (Element const&, ICursor&);
  6509.    void           addAllFrom       (IKeySortedBag < Element, Key > const&);
  6510.    Element const& elementAt        (ICursor const&) const;
  6511.    Element&       elementAt        (ICursor const&);
  6512.    Element const& anyElement       () const;
  6513.    void           removeAt         (ICursor const&);
  6514.    INumber        removeAll        (Boolean (*property)
  6515.                                     (Element const&, void*),
  6516.                                     void* additionalArgument = 0);
  6517.    void           replaceAt        (ICursor const&,
  6518.                                     Element const&);
  6519.    void           removeAll        ();
  6520.    Boolean        isBounded        () const;
  6521.    INumber        maxNumberOfElements  () const;
  6522.    INumber        numberOfElements () const;
  6523.    Boolean        isEmpty          () const;
  6524.    Boolean        isFull           () const;
  6525.    ICursor*       newCursor        () const;
  6526.    Boolean        setToFirst       (ICursor&) const;
  6527.    Boolean        setToNext        (ICursor&) const;
  6528.    Boolean        allElementsDo    (Boolean (*function)
  6529.                                        (Element&, void*),
  6530.                                     void* additionalArgument = 0);
  6531.    Boolean        allElementsDo    (IIterator <Element>&);
  6532.    Boolean        allElementsDo    (Boolean (*function)
  6533.                                     (Element const&, void*),
  6534.                                     void* additionalArgument = 0)
  6535.                                     const;
  6536.    Boolean        allElementsDo    (IConstantIterator
  6537.                                        <Element>&) const;
  6538.    Key const&     key              (Element const&) const;
  6539.    Boolean  containsElementWithKey (Key const&) const;
  6540.    Boolean  containsAllKeysFrom    (IKeySortedBag < Element, Key > const&) const;
  6541.    Boolean  locateElementWithKey   (Key const&, ICursor&) const;
  6542.    Boolean  replaceElementWithKey  (Element const&);
  6543.    Boolean  replaceElementWithKey  (Element const&, ICursor&);
  6544.    Boolean  locateOrAddElementWithKey   (Element const&);
  6545.    Boolean  locateOrAddElementWithKey   (Element const&, ICursor&);
  6546.    Boolean  addOrReplaceElementWithKey  (Element const&);
  6547.    Boolean  addOrReplaceElementWithKey  (Element const&, ICursor&);
  6548.    Boolean  removeElementWithKey    (Key const&);
  6549.    Element  const& elementWithKey   (Key const&) const;
  6550.    Element& elementWithKey          (Key const&);
  6551.    INumber  numberOfElementsWithKey (Key const&) const;
  6552.    Boolean  locateNextElementWithKey(Key const&,
  6553.                                                ICursor&) const;
  6554.    INumber        removeAllElementsWithKey    (Key const&);
  6555.    INumber        numberOfDifferentKeys       () const;
  6556.    Boolean        setToNextWithDifferentKey   (ICursor&) const;
  6557.    void           removeFirst                 ();
  6558.    void           removeLast                  ();
  6559.    void           removeAtPosition            (IPosition);
  6560.    Element const& firstElement                () const;
  6561.    Element const& lastElement                 () const;
  6562.    Element const& elementAtPosition           (IPosition) const;
  6563.    Boolean        setToLast                   (ICursor&) const;
  6564.    Boolean        setToPrevious               (ICursor&) const;
  6565.    void           setToPosition               (IPosition, ICursor&) const;
  6566.    Boolean        isFirst                     (ICursor const&) const;
  6567.    Boolean        isLast                      (ICursor const&) const;
  6568.    long           compare      (IKeySortedBag < Element, Key > const&,
  6569.                                 long (*comparisonFunction)
  6570.                                 (Element const&, Element const&)) const;
  6571. };
  6572.  
  6573.  
  6574. ΓòÉΓòÉΓòÉ 3.8.5. Coding Example for Key Sorted Bag ΓòÉΓòÉΓòÉ
  6575.  
  6576. The following program illustrates the use of a key bag. The program determines 
  6577. the number of words that have the same length in a phrase. It stores the words 
  6578. of the phrase in a key sorted bag that it implements using the default class, 
  6579. IKeySortedBag. The program makes the key the length of the word. Because of the 
  6580. properties of a key sorted bag, it sorts the words by their length (the key), 
  6581. and it stores all duplicate words. 
  6582.  
  6583. The program determines the number of different word lengths using the 
  6584. numberOfDifferentKeys function. It uses the numberOfElementsWithKey function 
  6585. and the setToNextWithDifferentKey function to iterate through the collection 
  6586. and count the number of words with the same length. 
  6587.  
  6588. // wordbag.C  -  An exampe for using a Key Sorted Bag
  6589.    #include <iostream.h>
  6590.                                 // Class Word:
  6591.    #include "toyword.h"
  6592.                                 // Let's use the defaults:
  6593.    #include <iksbag.h>
  6594.    typedef IKeySortedBag <Word, int> WordBag;
  6595.  
  6596.  
  6597. int main() {
  6598.    Word phrase[] = {"people", "who", "live", "in", "glass",
  6599.                    "houses", "should", "not", "throw", "stones"};
  6600.    const int phraseWords = sizeof(phrase) / sizeof(Word);
  6601.    WordBag wordbag(phraseWords);
  6602.    for (int cnt=0; cnt < phraseWords; cnt++)  {
  6603.      wordbag.add(phrase[cnt]);
  6604.    }
  6605.  
  6606.    cout << "Contents of our WordBag sorted by number of letters:\n";
  6607.  
  6608.    WordBag::Cursor wordBagCursor(wordbag);
  6609.    forCursor(wordBagCursor)
  6610.      cout << "WB: " << wordBagCursor.element().text() << "\n";
  6611.  
  6612.    cout << "\nOur phrase has " << phraseWords << " words.\n";
  6613.    cout << "In our WordBag are " << wordbag.numberOfElements()
  6614.         << " words.\n\n";
  6615.  
  6616.    cout << "There are " << wordbag.numberOfDifferentKeys()
  6617.         << " different word lengths.\n\n";
  6618.  
  6619.    wordBagCursor.setToFirst();
  6620.    do  {
  6621.       int letters = wordbag.key(wordBagCursor.element());
  6622.       cout << "There are "
  6623.            << wordbag.numberOfElementsWithKey(letters)
  6624.            << " words with " << letters << " letters.\n";
  6625.    }  while  (wordbag.setToNextWithDifferentKey(wordBagCursor));
  6626.    return 0;
  6627. }
  6628.  
  6629.  
  6630. ΓòÉΓòÉΓòÉ 3.9. Key Sorted Set ΓòÉΓòÉΓòÉ
  6631.  
  6632. A key sorted set is an ordered collection of zero or more elements that have a 
  6633. key.  Elements are sorted according to the value of their key field.  Element 
  6634. equality is not supported.  Only elements with unique keys are supported.  A 
  6635. request to add an element whose key already exists is ignored. 
  6636.  
  6637. Combination of Flat Collection Properties gives an overview of the properties 
  6638. of a key sorted set and its relationship to other flat collections. 
  6639.  
  6640. Note:  All member functions of key sorted set are described under "List of 
  6641. Functions". 
  6642.  
  6643.  
  6644. ΓòÉΓòÉΓòÉ 3.9.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  6645.  
  6646. IKeySortedSet, the first class in the table below, is the default 
  6647. implementation variant. If you want to use polymorphism, you can replace the 
  6648. following class implementation variants by the reference class. 
  6649.  
  6650. Class Name             Header File  Description
  6651.  
  6652. IKeySortedSet          iksset.h     AVL tree for KeySortedSet
  6653. IGKeySortedSet         iksset.h     AVL tree for KeySortedSet
  6654. IAvlKeySortedSet       iavlkss.h    AVL tree for KeySortedSet
  6655. IGAvlKeySortedSet      iavlkss.h    AVL tree for KeySortedSet
  6656. IBSTKeySortedSet       ibstkss.h    B* tree for KeySortedSet
  6657. IGBSTKeySortedSet      ibstkss.h    B* tree for KeySortedSet
  6658. IKeySortedSetOn-       iksssls.h    Based on LinkedSequence
  6659.  SortedLinkedSequence
  6660. IGKeySortedSetOn-      iksssls.h    Based on LinkedSequence
  6661.  SortedLinkedSequence
  6662. IKeySortedSetOn-       iksssts.h    Based on TabularSequence
  6663.  SortedTabularSequence
  6664. IGKeySortedSetOn-      iksssts.h    Based on TabularSequence
  6665.  SortedTabularSequence
  6666. IKeySortedSetOn-       iksssds.h    Based on DilutedSequence
  6667.  SortedDilutedSequence
  6668. IGKeySortedSetOn-      iksssds.h    Based on DilutedSequence
  6669.  SortedDilutedSequence
  6670.  
  6671.  
  6672. ΓòÉΓòÉΓòÉ 3.9.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  6673.  
  6674. The following implementation variants are defined for key sorted sets: 
  6675.  
  6676. o Key Sorted Set 
  6677. o AVL Key Sorted Set 
  6678. o B* Key Sorted Set 
  6679. o Key Sorted Set on Sorted Linked Sequence 
  6680. o Key Sorted Set on Sorted Tabular Sequence 
  6681. o Key Sorted Set on Sorted Diluted Sequence 
  6682.  
  6683.  
  6684. ΓòÉΓòÉΓòÉ 3.9.2.1. Key Sorted Set ΓòÉΓòÉΓòÉ
  6685.  
  6686. IKeySortedSet  <Element, Key>
  6687. IGKeySortedSet <Element, Key, KCOps>
  6688.  
  6689. The implementation of the class IKeySortedSet requires the following element 
  6690. and key functions: 
  6691.  
  6692. Element Type 
  6693.  
  6694. o Copy constructor 
  6695. o Destructor 
  6696. o Assignment 
  6697. o Key access 
  6698.  
  6699. Key Type 
  6700.  
  6701. Ordering relation 
  6702.  
  6703.  
  6704. ΓòÉΓòÉΓòÉ 3.9.2.2. AVL Key Sorted Set ΓòÉΓòÉΓòÉ
  6705.  
  6706. IAvlKeySortedSet  <Element>
  6707. IGAvlKeySortedSet <Element, Key, KCOps>
  6708.  
  6709. The implementation of the class IGAvlKeySortedSet requires the following 
  6710. element and key functions: 
  6711.  
  6712. Element Type 
  6713.  
  6714. o Copy constructor 
  6715. o Assignment 
  6716. o Destructor 
  6717. o Key access 
  6718.  
  6719. Key Type 
  6720.  
  6721. Ordering relation 
  6722.  
  6723.  
  6724. ΓòÉΓòÉΓòÉ 3.9.2.3. B* Key Sorted Set ΓòÉΓòÉΓòÉ
  6725.  
  6726. IBSTKeySortedSet  <Element, Key>
  6727. IGBSTKeySortedSet <Element, Key, KCOps>
  6728.  
  6729. The implementation of the class IBSTKeySortedSet requires the following element 
  6730. and key functions: 
  6731.  
  6732. Element Type 
  6733.  
  6734. o Default constructor 
  6735. o Copy constructor 
  6736. o Destructor 
  6737. o Assignment 
  6738. o Key access 
  6739.  
  6740. Key Type 
  6741.  
  6742. Ordering relation 
  6743.  
  6744.  
  6745. ΓòÉΓòÉΓòÉ 3.9.2.4. Key Sorted Set on Sorted Linked Sequence ΓòÉΓòÉΓòÉ
  6746.  
  6747. IKeySortedSetOnSortedLinkedSequence  <Element>
  6748. IGKeySortedSetOnSortedLinkedSequence <Element, Key, KCOps>
  6749.  
  6750. The implementation of the class IKeySortedSetOnSortedLinkedSequence requires 
  6751. the following element and key functions: 
  6752.  
  6753. Element Type 
  6754.  
  6755. o Copy constructor 
  6756. o Destructor 
  6757. o Assignment 
  6758. o Key access 
  6759.  
  6760. Key Type 
  6761.  
  6762. Ordering relation 
  6763.  
  6764.  
  6765. ΓòÉΓòÉΓòÉ 3.9.2.5. Key Sorted Set on Sorted Tabular Sequence ΓòÉΓòÉΓòÉ
  6766.  
  6767. IKeySortedSetOnSortedTabularSequence  <Element>
  6768. IGKeySortedSetOnSortedTabularSequence <Element, Key, KCOps>
  6769.  
  6770. The implementation of the class IKeySortedSetOnSortedTabularSequence requires 
  6771. the following element and key functions: 
  6772.  
  6773. Element Type 
  6774.  
  6775. o Default constructor 
  6776. o Copy constructor 
  6777. o Destructor 
  6778. o Assignment 
  6779. o Key access 
  6780.  
  6781. Key Type 
  6782.  
  6783. Ordering relation 
  6784.  
  6785.  
  6786. ΓòÉΓòÉΓòÉ 3.9.2.6. Key Sorted Set on Sorted Diluted Sequence ΓòÉΓòÉΓòÉ
  6787.  
  6788. IKeySortedSetOnSortedDilutedSequence  <Element, Key>
  6789. IGKeySortedSetOnSortedDilutedSequence <Element, Key, KCOps>
  6790.  
  6791. The implementation of the class IKeySortedSetOnSortedDilutedSequence requires 
  6792. the following element and key functions: 
  6793.  
  6794. Element Type 
  6795.  
  6796. o Default constructor 
  6797. o Copy constructor 
  6798. o Destructor 
  6799. o Assignment 
  6800. o Key access 
  6801.  
  6802. Key Type 
  6803.  
  6804. Ordering relation 
  6805.  
  6806.  
  6807. ΓòÉΓòÉΓòÉ 3.9.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  6808.  
  6809. For polymorphism, you can use the corresponding abstract class, IAKeySortedSet, 
  6810. which is found in the iaksset.h header file, or the corresponding reference 
  6811. class, IRKeySortedSet, which is found in the irksset.h header file. See 
  6812. Polymorphic Use of Collections for further information. 
  6813.  
  6814.  
  6815. ΓòÉΓòÉΓòÉ 3.9.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  6816.  
  6817. IAKeySortedSet <Element, Key>
  6818. IRKeySortedSet <Element, Key, ConcreteBase>
  6819.  
  6820. The concrete base class is one of the classes defined above. 
  6821.  
  6822. The required functions are the same as the required functions of the concrete 
  6823. base class. 
  6824.  
  6825.  
  6826. ΓòÉΓòÉΓòÉ 3.9.4. Declarations for Key Sorted Set ΓòÉΓòÉΓòÉ
  6827.  
  6828. template < class Element, class Key >
  6829. class IKeySortedSet {
  6830. public:
  6831.   class Cursor : ICursor {
  6832.     Element& element ();
  6833.     void setToLast ();
  6834.     void setToPrevious ();
  6835.     Boolean operator== (Cursor const& cursor);
  6836.     Boolean operator!= (Cursor const& cursor);
  6837.   };
  6838.                   IKeySortedSet        (INumber numberOfElements = 100,
  6839.                                         IBoundIndicator = IUnbounded);
  6840.                   IKeySortedSet        (IKeySortedSet < Element, Key > const&);
  6841.    IKeySortedSet < Element, Key >&
  6842.                   operator =           (IKeySortedSet < Element, Key > const&);
  6843.                   ~IKeySortedSet       ();
  6844.    Boolean        add                   (Element const&);
  6845.    Boolean        add                   (Element const&, ICursor&);
  6846.    void           addAllFrom            (IKeySortedSet < Element, Key > const&);
  6847.    Element const& elementAt             (ICursor const&) const;
  6848.    Element&       elementAt             (ICursor const&);
  6849.    Element const& anyElement            () const;
  6850.    void           removeAt              (ICursor const&);
  6851.    INumber        removeAll             (Boolean (*property)
  6852.                                          (Element const&, void*),
  6853.                                          void* additionalArgument = 0);
  6854.    void           replaceAt             (ICursor const&, Element const&);
  6855.    void           removeAll             ();
  6856.    Boolean        isBounded             () const;
  6857.    INumber        maxNumberOfElements   () const;
  6858.    INumber        numberOfElements      () const;
  6859.    Boolean        isEmpty               () const;
  6860.    Boolean        isFull                () const;
  6861.    ICursor*       newCursor             () const;
  6862.    Boolean        setToFirst            (ICursor&) const;
  6863.    Boolean        setToNext             (ICursor&) const;
  6864.    Boolean        allElementsDo         (Boolean (*function) (Element&, void*),
  6865.                                          void* additionalArgument = 0);
  6866.    Boolean        allElementsDo         (IIterator <Element>&);
  6867.    Boolean        allElementsDo         (Boolean (*function)
  6868.                                          (Element const&, void*),
  6869.                                          void* additionalArgument = 0) const;
  6870.    Boolean        allElementsDo         (IConstantIterator <Element>&) const;
  6871.    Key const&     key                   (Element const&) const;
  6872.    Boolean        containsElementWithKey(Key const&) const;
  6873.    Boolean        containsAllKeysFrom   (IKeySortedSet < Element, Key > const&) const;
  6874.    Boolean        locateElementWithKey  (Key const&, ICursor&) const;
  6875.    Boolean        replaceElementWithKey (Element const&);
  6876.    Boolean        replaceElementWithKey (Element const&, ICursor&);
  6877.    Boolean        locateOrAddElementWithKey   (Element const&);
  6878.    Boolean        locateOrAddElementWithKey   (Element const&, ICursor&);
  6879.    Boolean        addOrReplaceElementWithKey  (Element const&);
  6880.    Boolean        addOrReplaceElementWithKey  (Element const&, ICursor&);
  6881.    Boolean        removeElementWithKey  (Key const&);
  6882.    Element const& elementWithKey        (Key const&) const;
  6883.    Element&       elementWithKey        (Key const&);
  6884.    void           removeFirst           ();
  6885.    void           removeLast            ();
  6886.    void           removeAtPosition      (IPosition);
  6887.    Element const& firstElement          () const;
  6888.    Element const& lastElement           () const;
  6889.    Element const& elementAtPosition     (IPosition) const;
  6890.    Boolean        setToLast             (ICursor&) const;
  6891.    Boolean        setToPrevious         (ICursor&) const;
  6892.    void           setToPosition         (IPosition, ICursor&) const;
  6893.    Boolean        isFirst               (ICursor const&) const;
  6894.    Boolean        isLast                (ICursor const&) const;
  6895.    long           compare               (IKeySortedSet < Element, Key > const&,
  6896.                                          long (*comparisonFunction)
  6897.                                             (Element const&,
  6898.                                             Element const&)) const;
  6899. };
  6900.  
  6901.  
  6902. ΓòÉΓòÉΓòÉ 3.9.5. Coding Example for Key Sorted Set ΓòÉΓòÉΓòÉ
  6903.  
  6904. The following program uses the default classes for a key sorted set and a heap, 
  6905. IKeySortedSet and IHeap, to track parcels for a delivery service.  It uses a 
  6906. key sorted set to record the parcels that are currently in circulation.  The 
  6907. fast access of a sorted collection is not necessary to keep track of the 
  6908. delivered parcels, so the program uses a heap to keep track of them. 
  6909.  
  6910. The parcel element contains three data members: one of type PlaceTime that 
  6911. stores the origin time and place of the parcel, another of type PlaceTime that 
  6912. stores the current time and place of the parcel, and one of type ToyString that 
  6913. stores the destination. 
  6914.  
  6915. The function update adds parcels that have arrived at their destinations to the 
  6916. heap of delivered parcels, and removes them from the key sorted set for 
  6917. circulating parcels. 
  6918.  
  6919. The program uses the add function to update and the removeAll function to 
  6920. remove elements from the key sorted set. 
  6921.  
  6922. // parcel.C  -  An example for using a Key Sorted Set and a Heap
  6923. #include <iostream.h>
  6924.  
  6925. #include "parcel.h"
  6926.                           // Let's use the default KeySorted Set:
  6927. #include <iksset.h>
  6928.                           // Let's use the default Heap:
  6929. #include <iheap.h>
  6930.  
  6931. typedef IKeySortedSet<Parcel, ToyString> ParcelSet;
  6932. typedef IHeap        <Parcel>            ParcelHeap;
  6933.  
  6934. ostream& operator<<(ostream&, ParcelSet const&);
  6935. ostream& operator<<(ostream&, ParcelHeap const&);
  6936.  
  6937. void update(ParcelSet&, ParcelHeap&);
  6938.  
  6939.  
  6940. main()  {
  6941.  
  6942.   ParcelSet circulating;
  6943.   ParcelHeap delivered;
  6944.  
  6945.   int today = 8;
  6946.  
  6947.   circulating.add(Parcel("London", "Athens",
  6948.      today,      "26LoAt"));
  6949.   circulating.add(Parcel("Amsterdam", "Toronto",
  6950.      today += 2, "27AmTo"));
  6951.   circulating.add(Parcel("Washington", "Stockholm",
  6952.      today += 5, "25WaSt"));
  6953.   circulating.add(Parcel("Dublin", "Kairo",
  6954.      today += 1, "25DuKa"));
  6955.   update(circulating, delivered);
  6956.   cout << "\nThe situation at start:\n";
  6957.   cout << "Parcels in circulation:\n" << circulating;
  6958.  
  6959.   today ++;
  6960.   circulating.elementWithKey("27AmTo").arrivedAt(
  6961.      "Atlanta",   today);
  6962.   circulating.elementWithKey("25WaSt").arrivedAt(
  6963.      "Amsterdam", today);
  6964.   circulating.elementWithKey("25DuKa").arrivedAt(
  6965.      "Paris",     today);
  6966.   update(circulating, delivered);
  6967.   cout << "\n\nThe situation at day " << today << ":\n";
  6968.   cout << "Parcels in circulation:\n" << circulating;
  6969.  
  6970.   today ++;          // One day later ...
  6971.   circulating.elementWithKey("27AmTo").arrivedAt("Chicago", today);
  6972.              // As in real life, one parcel gets lost:
  6973.   circulating.removeElementWithKey("26LoAt");
  6974.   update(circulating, delivered);
  6975.   cout << "\n\nThe situation at day " << today << ":\n";
  6976.   cout << "Parcels in circulation:\n" << circulating;
  6977.  
  6978.   today ++;
  6979.   circulating.elementWithKey("25WaSt").arrivedAt("Oslo", today);
  6980.   circulating.elementWithKey("25DuKa").arrivedAt("Kairo", today);
  6981.              // New parcels are shipped.
  6982.   circulating.add(Parcel("Dublin", "Rome", today,   "27DuRo"));
  6983.              // Let's try to add one with a key already there.
  6984.              // The KeySsorted Set should ignore it:
  6985.   circulating.add(Parcel("Nowhere", "Nirvana", today, "25WaSt"));
  6986.   update(circulating, delivered);
  6987.   cout << "\n\nThe situation at day " << today << ":\n";
  6988.   cout << "Parcels in circulation:\n" << circulating;
  6989.   cout << "Parcels delivered:\n" << delivered;
  6990.  
  6991.                    // Now we make all parcels arrive today:
  6992.   today ++;
  6993.  
  6994.   ParcelSet::Cursor circulatingcursor(circulating);
  6995.   forCursor(circulatingcursor) {
  6996.      circulating.elementAt(circulatingcursor).wasDelivered(today);
  6997.   }
  6998.   update(circulating, delivered);
  6999.   cout << "\n\nThe situation at day " << today << ":\n";
  7000.   cout << "Parcels in circulation:\n" << circulating;
  7001.   cout << "Parcels delivered:\n" << delivered;
  7002.  
  7003.   if (circulating.isEmpty())
  7004.      cout << "\nAll parcels were delivered.\n";
  7005.   else
  7006.      cout << "\nSomething very strange happened here.\n";
  7007.  
  7008.   return  0;
  7009. }
  7010.  
  7011.  
  7012. ostream& operator<<(ostream& os, ParcelSet const& parcels)  {
  7013.   ParcelSet::Cursor pcursor(parcels);
  7014.   forCursor(pcursor) {
  7015.      os <<  pcursor.element() << "\n";
  7016.   }
  7017.   return os;
  7018. }
  7019.  
  7020. ostream& operator<<(ostream& os, ParcelHeap const& parcels)  {
  7021.   ParcelHeap::Cursor pcursor(parcels);
  7022.   forCursor(pcursor) {
  7023.      os <<  pcursor.element() << "\n";
  7024.   }
  7025.   return os;
  7026. }
  7027.  
  7028. Boolean wasDelivered(Parcel const& p, void* dp) {
  7029.    if ( p.lastArrival().city() == p.destination() ) {
  7030.       ((ParcelHeap*)dp)->add(p);
  7031.       return True;
  7032.    }
  7033.    else
  7034.       return False;
  7035. }
  7036.  
  7037. void update(ParcelSet& p, ParcelHeap& d) {
  7038.    p.removeAll(wasDelivered, &d);
  7039. }
  7040.  
  7041. The program produces the following output: 
  7042.  
  7043.  
  7044. The situation at start:
  7045. Parcels in circulation:
  7046. 25DuKa: From Dublin(day 16) to Kairo
  7047.             is at Dublin  since day 16.
  7048. 25WaSt: From Washington(day 15) to Stockholm
  7049.             is at Washington  since day 15.
  7050. 26LoAt: From London(day 8) to Athens
  7051.             is at London  since day 8.
  7052. 27AmTo: From Amsterdam(day 10) to Toronto
  7053.             is at Amsterdam  since day 10.
  7054.  
  7055.  
  7056. The situation at day 17:
  7057. Parcels in circulation:
  7058. 25DuKa: From Dublin(day 16) to Kairo
  7059.             is at Paris  since day 17.
  7060. 25WaSt: From Washington(day 15) to Stockholm
  7061.             is at Amsterdam  since day 17.
  7062. 26LoAt: From London(day 8) to Athens
  7063.             is at London  since day 8.
  7064. 27AmTo: From Amsterdam(day 10) to Toronto
  7065.             is at Atlanta  since day 17.
  7066.  
  7067.  
  7068. The situation at day 18:
  7069. Parcels in circulation:
  7070. 25DuKa: From Dublin(day 16) to Kairo
  7071.             is at Paris  since day 17.
  7072. 25WaSt: From Washington(day 15) to Stockholm
  7073.             is at Amsterdam  since day 17.
  7074. 27AmTo: From Amsterdam(day 10) to Toronto
  7075.             is at Chicago  since day 18.
  7076.  
  7077.  
  7078. The situation at day 19:
  7079. Parcels in circulation:
  7080. 25WaSt: From Washington(day 15) to Stockholm
  7081.             is at Oslo  since day 19.
  7082. 27AmTo: From Amsterdam(day 10) to Toronto
  7083.             is at Chicago  since day 18.
  7084. 27DuRo: From Dublin(day 19) to Rome
  7085.             is at Dublin  since day 19.
  7086. Parcels delivered:
  7087. 25DuKa: From Dublin(day 16) to Kairo
  7088.             was delivered on day 19.
  7089.  
  7090.  
  7091. The situation at day 20:
  7092. Parcels in circulation:
  7093. Parcels delivered:
  7094. 25DuKa: From Dublin(day 16) to Kairo
  7095.             was delivered on day 19.
  7096. 25WaSt: From Washington(day 15) to Stockholm
  7097.             was delivered on day 20.
  7098. 27AmTo: From Amsterdam(day 10) to Toronto
  7099.             was delivered on day 20.
  7100. 27DuRo: From Dublin(day 19) to Rome
  7101.             was delivered on day 20.
  7102.  
  7103. All parcels were delivered.
  7104.  
  7105.  
  7106. ΓòÉΓòÉΓòÉ 3.10. Map ΓòÉΓòÉΓòÉ
  7107.  
  7108. A map is an unordered collection of zero or more elements that have a key. 
  7109. Element equality is supported and the values of the elements are relevant. 
  7110.  
  7111. Only elements with unique keys are supported.  A request to add an element 
  7112. whose key already exists in another element of the collection is ignored. 
  7113.  
  7114. Behavior of add for Unique and Multiple Collections illustrates the differences 
  7115. in behavior between map, relation, key set, and key bag when adding identical 
  7116. elements and elements with the same key. 
  7117.  
  7118. Combination of Flat Collection Properties gives an overview of the properties 
  7119. of a map and its relationship to other flat collections. 
  7120.  
  7121. Note:  All member functions of map are described under "List of Functions". 
  7122.  
  7123.  
  7124. ΓòÉΓòÉΓòÉ 3.10.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  7125.  
  7126. IMap, the first class in the table below, is the default implementation 
  7127. variant. If you want to use polymorphism, you can replace the following class 
  7128. implementation variants by the reference class. 
  7129.  
  7130. Class Name                   Header File Based On
  7131.  
  7132. IMap                         imap.h      AVL KeySortedSet
  7133. IGMap                        imap.h      AVL KeySortedSet
  7134. IMapOnBSTKeySortedSet        imapbst.h   B* KeySortedSet
  7135. IGMapOnBSTKeySortedSet       imapbst.h   B* KeySortedSet
  7136. IMapOnSortedLinkedSequence   imapsls.h   Linked Sequence
  7137. IGMapOnSortedLinkedSequence  imapsls.h   LinkedSequence
  7138. IMapOnSortedTabularSequence  imapsts.h   TabularSequence
  7139. IGMapOnSortedTabularSequence imapsts.h   TabularSequence
  7140. IMapOnSortedDilutedSequence  imapsds.h   DilutedSequence
  7141. IGMapOnSortedDilutedSequence imapsds.h   DilutedSequence
  7142. IMapOnHashKeySet             imaphks.h   Hash KeySet
  7143. IGMapOnHashKeySet            imaphks.h   Hash KeySet
  7144.  
  7145.  
  7146. ΓòÉΓòÉΓòÉ 3.10.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  7147.  
  7148. The following implementation variants are defined for maps: 
  7149.  
  7150. o Map 
  7151. o Map on B* Key Sorted Set 
  7152. o Map on Sorted Linked Sequence 
  7153. o Map on Sorted Tabular Sequence 
  7154. o Map on Sorted Diluted Sequence 
  7155. o Map on Hash Key Set 
  7156.  
  7157.  
  7158. ΓòÉΓòÉΓòÉ 3.10.2.1. Map ΓòÉΓòÉΓòÉ
  7159.  
  7160. IMap  <Element, Key>
  7161. IGMap <Element, Key, EKCOps>
  7162.  
  7163. The implementation of the class IMap requires the following element and key 
  7164. functions: 
  7165.  
  7166. Element Type 
  7167.  
  7168. o Copy constructor 
  7169. o Destructor 
  7170. o Assignment 
  7171. o Equality test 
  7172. o Key access 
  7173.  
  7174. Key Type 
  7175.  
  7176. Ordering relation 
  7177.  
  7178.  
  7179. ΓòÉΓòÉΓòÉ 3.10.2.2. Map on B* Key Sorted Set ΓòÉΓòÉΓòÉ
  7180.  
  7181. IMapOnBSTKeySortedSet  <Element, Key>
  7182. IGMapOnBSTKeySortedSet <Element, Key, EKCOps>
  7183.  
  7184. The default implementation of the class IMapOnBSTKeySortedSet requires the 
  7185. following element and key functions: 
  7186.  
  7187. Element Type 
  7188.  
  7189. o Default constructor 
  7190. o Copy constructor 
  7191. o Destructor 
  7192. o Assignment 
  7193. o Equality test 
  7194. o Key access 
  7195.  
  7196. Key Type 
  7197.  
  7198. Ordering relation 
  7199.  
  7200.  
  7201. ΓòÉΓòÉΓòÉ 3.10.2.3. Map on Sorted Linked Sequence ΓòÉΓòÉΓòÉ
  7202.  
  7203. IMapOnSortedLinkedSequence  <Element, Key>
  7204. IGMapOnSortedLinkedSequence <Element, Key, EKCOps>
  7205.  
  7206. The implementation of the class IMapOnSortedLinkedSequence requires the 
  7207. following element and key functions: 
  7208.  
  7209. Element Type 
  7210.  
  7211. o Copy constructor 
  7212. o Destructor 
  7213. o Assignment 
  7214. o Equality test 
  7215. o Key access 
  7216.  
  7217. Key Type 
  7218.  
  7219. Ordering relation 
  7220.  
  7221.  
  7222. ΓòÉΓòÉΓòÉ 3.10.2.4. Map on Sorted Tabular Sequence ΓòÉΓòÉΓòÉ
  7223.  
  7224. IMapOnSortedTabularSequence  <Element, Key>
  7225. IGMapOnSortedTabularSequence <Element, Key, EKCOps>
  7226.  
  7227. The implementation of the class IMapOnSortedTabularSequence requires the 
  7228. following element and key functions: 
  7229.  
  7230. Element Type 
  7231.  
  7232. o Default constructor 
  7233. o Copy constructor 
  7234. o Destructor 
  7235. o Assignment 
  7236. o Equality test 
  7237. o Key access 
  7238.  
  7239. Key Type 
  7240.  
  7241. Ordering relation 
  7242.  
  7243.  
  7244. ΓòÉΓòÉΓòÉ 3.10.2.5. Map on Sorted Diluted Sequence ΓòÉΓòÉΓòÉ
  7245.  
  7246. IMapOnSortedDilutedSequence  <Element, Key>
  7247. IGMapOnSortedDilutedSequence <Element, Key, EKCOps>
  7248.  
  7249. The implementation of the class IMapOnSortedDilutedSequence requires the 
  7250. following element and key functions: 
  7251.  
  7252. Element Type 
  7253.  
  7254. o Default constructor 
  7255. o Copy constructor 
  7256. o Destructor 
  7257. o Assignment 
  7258. o Equality test 
  7259. o Key access 
  7260.  
  7261. Key Type 
  7262.  
  7263. Ordering relation 
  7264.  
  7265.  
  7266. ΓòÉΓòÉΓòÉ 3.10.2.6. Map on Hash Key Set ΓòÉΓòÉΓòÉ
  7267.  
  7268. IMapOnHashKeySet  <Element, Key>
  7269. IGMapOnHashKeySet <Element, Key, EKEHOps>
  7270.  
  7271. The implementation of the class IMapOnHashKeySet requires the following element 
  7272. and key functions: 
  7273.  
  7274. Element Type 
  7275.  
  7276. o Copy constructor 
  7277. o Destructor 
  7278. o Assignment 
  7279. o Equality test 
  7280. o Key access 
  7281.  
  7282. Key Type 
  7283.  
  7284. o Equality test 
  7285. o Hash function 
  7286.  
  7287.  
  7288. ΓòÉΓòÉΓòÉ 3.10.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  7289.  
  7290. For polymorphism, you can use the corresponding abstract class, IAMap, which is 
  7291. found in the iamap.h header file, or the corresponding reference class, IRMap, 
  7292. which is found in the irmap.h header file. See Polymorphic Use of Collections 
  7293. for further information. 
  7294.  
  7295.  
  7296. ΓòÉΓòÉΓòÉ 3.10.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  7297.  
  7298. IAMap <Element, Key>
  7299. IRMap <Element, Key, ConcreteBase>
  7300.  
  7301. The concrete base class is one of the classes defined above. 
  7302.  
  7303. The required functions are the same as the required functions of the concrete 
  7304. base class. 
  7305.  
  7306.  
  7307. ΓòÉΓòÉΓòÉ 3.10.4. Declarations for Map ΓòÉΓòÉΓòÉ
  7308.  
  7309. template < class Element, class Key >
  7310. class IMap {
  7311. public:
  7312.   class Cursor : ICursor {
  7313.     Element& element ();
  7314.     Boolean operator== (Cursor const& cursor);
  7315.     Boolean operator!= (Cursor const& cursor);
  7316.   };
  7317.                   IMap             (INumber numberOfElements = 100,
  7318.                                     IBoundIndicator = IUnbounded);
  7319.                   IMap             (IMap < Element, Key > const&);
  7320.    IMap < Element, Key >& operator =
  7321.                                    (IMap < Element, Key > const&);
  7322.                   ~IMap            ();
  7323.    Boolean        add              (Element const&);
  7324.    Boolean        add              (Element const&, ICursor&);
  7325.    void           addAllFrom       (IMap < Element, Key > const&);
  7326.    Element const& elementAt        (ICursor const&) const;
  7327.    Element&       elementAt        (ICursor const&);
  7328.    Element const& anyElement       () const;
  7329.    void           removeAt         (ICursor const&);
  7330.    INumber        removeAll        (Boolean (*property)
  7331.                                     (Element const&, void*),
  7332.                                     void* additionalArgument = 0);
  7333.    void           replaceAt        (ICursor const&, Element const&);
  7334.    void           removeAll        ();
  7335.    Boolean        isBounded        () const;
  7336.    INumber        maxNumberOfElements  () const;
  7337.    INumber        numberOfElements () const;
  7338.    Boolean        isEmpty          () const;
  7339.    Boolean        isFull           () const;
  7340.    ICursor*       newCursor        () const;
  7341.    Boolean        setToFirst       (ICursor&) const;
  7342.    Boolean        setToNext        (ICursor&) const;
  7343.    Boolean        allElementsDo    (Boolean (*function) (Element&, void*),
  7344.                                     void* additionalArgument = 0);
  7345.    Boolean        allElementsDo    (IIterator <Element>&);
  7346.    Boolean        allElementsDo    (Boolean (*function)
  7347.                                     (Element const&, void*),
  7348.                                     void* additionalArgument = 0) const;
  7349.    Boolean        allElementsDo    (IConstantIterator <Element>&) const;
  7350.    Boolean        contains         (Element const&) const;
  7351.    Boolean        containsAllFrom  (IMap < Element, Key > const&) const;
  7352.    Boolean        locate           (Element const&, ICursor&) const;
  7353.    Boolean        locateOrAdd      (Element const&);
  7354.    Boolean        locateOrAdd      (Element const&, ICursor&);
  7355.    Boolean        remove           (Element const&);
  7356.    Boolean        operator ==      (IMap < Element, Key > const&) const;
  7357.    Boolean        operator !=      (IMap < Element, Key > const&) const;
  7358.    void           unionWith        (IMap < Element, Key > const&);
  7359.    void           intersectionWith (IMap < Element, Key > const&);
  7360.    void           differenceWith   (IMap < Element, Key > const&);
  7361.    void           addUnion         (IMap < Element, Key > const&,
  7362.                                     IMap < Element, Key > const&);
  7363.    void           addIntersection  (IMap < Element, Key > const&,
  7364.                                     IMap < Element, Key > const&);
  7365.    void           addDifference    (IMap < Element, Key > const&,
  7366.                                     IMap < Element, Key > const&);
  7367.    Key const&     key              (Element const&) const;
  7368.    Boolean  containsElementWithKey (Key const&) const;
  7369.    Boolean  containsAllKeysFrom    (IMap < Element, Key > const&) const;
  7370.    Boolean  locateElementWithKey   (Key const&, ICursor&) const;
  7371.    Boolean  replaceElementWithKey  (Element const&);
  7372.    Boolean  replaceElementWithKey  (Element const&, ICursor&);
  7373.    Boolean  locateOrAddElementWithKey   (Element const&);
  7374.    Boolean  locateOrAddElementWithKey   (Element const&, ICursor&);
  7375.    Boolean  addOrReplaceElementWithKey  (Element const&);
  7376.    Boolean  addOrReplaceElementWithKey  (Element const&, ICursor&);
  7377.    Boolean  removeElementWithKey   (Key const&);
  7378.    Element const& elementWithKey   (Key const&) const;
  7379.    Element& elementWithKey         (Key const&);
  7380. };
  7381.  
  7382.  
  7383. ΓòÉΓòÉΓòÉ 3.10.5. Coding Example for Map ΓòÉΓòÉΓòÉ
  7384.  
  7385. The following program allows EBCDIC to ASCII and ASCII to EBCDIC translation of 
  7386. a string. It uses two maps, one with the EBCDIC code as key (E2AMap) and one 
  7387. with the ASCII code as key (A2EMap). It converts from EBCDIC to ASCII by 
  7388. finding the element whose key matches the EBCDIC code in E2AMap (which has the 
  7389. EBCDIC code as key) and taking the ASCII code information from that element. It 
  7390. converts from ASCII to EBCDIC by finding the key that matches the ASCII code in 
  7391. A2EMap (which has the ASCII code as key) and taking the EBCDIC code information 
  7392. for that element. 
  7393.  
  7394. The program uses the add function to build the maps and the elementWithKey 
  7395. function to convert the characters. 
  7396.  
  7397. // transtab.C  -  An example of using a Map
  7398. #include "transelm.h"
  7399.  
  7400.        // Get the standard operation classes:
  7401. #include <istdops.h>
  7402.  
  7403. #include "trmapops.h"
  7404.  
  7405.       // Now we define the two Map templates and two maps
  7406.       // We want both of them to be based on the Hashtable KeySet
  7407. #include <imaphks.h>
  7408.  
  7409. typedef IGMapOnHashKeySet
  7410.           < TranslationElement, char,
  7411.             KeyOpsTransE2A <TranslationElement, char> >  TransE2AMap;
  7412. typedef IGMapOnHashKeySet
  7413.           < TranslationElement, char,
  7414.             KeyOpsTransA2E <TranslationElement, char> >  TransA2EMap;
  7415.  
  7416. void display(char*, char*);
  7417.  
  7418. int main(int argc, char* argv[])  {
  7419.  
  7420.    TransA2EMap  A2EMap;
  7421.    TransE2AMap  E2AMap;
  7422.  
  7423.        //    char translationtable[256] =  ....
  7424. #include <xebc2asc.h>
  7425.  
  7426.       //  Load the translation table into both maps.
  7427.    for (int i=0; i < 256; i++)
  7428.    {
  7429.                        /*      asc_code         ebc_code      */
  7430.       TranslationElement te(translationtable[i],   i   );
  7431.  
  7432.       E2AMap.add(te);
  7433.       A2EMap.add(te);
  7434.    }
  7435.        // What do we want to convert now?
  7436.    char* to_convert;
  7437.    if  (argc > 1)  to_convert = argv[1];
  7438.    else            to_convert = "$7  (=Dollar seven)";
  7439.  
  7440.    size_t text_length = strlen(to_convert) +1;
  7441.  
  7442.    char* converted_to_asc = new char[text_length];
  7443.    char* converted_to_ebc = new char[text_length];
  7444.  
  7445.        // Convert the strings in place, character by character
  7446.    for (i=0; to_convert[i] != 0x00; i++)   {
  7447.       converted_to_asc[i]
  7448.         = E2AMap.elementWithKey(to_convert[i]).asc_code;
  7449.       converted_to_ebc[i]
  7450.         = A2EMap.elementWithKey(to_convert[i]).ebc_code;
  7451.    }
  7452.  
  7453.    display("To convert", to_convert);
  7454.    display("After EBCDIC-ASCII conversion", converted_to_asc);
  7455.    display("After ASCII-EBCDIC conversion", converted_to_ebc);
  7456.  
  7457.    delete[] converted_to_asc;
  7458.    delete[] converted_to_ebc;
  7459.  
  7460.    return 0;
  7461. }
  7462.  
  7463. #include <iostream.h>
  7464. #include <iomanip.h>
  7465.  
  7466. void display(char* title, char* text)  {
  7467.   cout << "\n" << title <<":   \n";
  7468.   cout << "  Hex:   " << hex;
  7469.   for (int i=0; text[i] != 0x00; i++)    {
  7470.      cout << (int)text[i] << " ";
  7471.   }
  7472.   cout << dec << endl;
  7473. }
  7474.  
  7475. The program produces the following output: 
  7476.  
  7477.  
  7478. To convert:
  7479.   Hex:   24 37 20 20 28 3d 44 6f 6c 6c 61 72 20 73 65 76 65 6e 29
  7480.  
  7481. After EBCDIC-ASCII conversion:
  7482.   Hex:   86 4 81 81 89 15 eb 3f 25 25 2f 94 81 b0 dd fc dd 3e 91
  7483.  
  7484. After ASCII-EBCDIC conversion:
  7485.   Hex:   5b f7 40 40 4d 7e c4 96 93 93 81 99 40 a2 85 a5 85 95 5d
  7486.  
  7487.  
  7488. ΓòÉΓòÉΓòÉ 3.11. Priority Queue ΓòÉΓòÉΓòÉ
  7489.  
  7490. A priority queue is a key sorted bag with restricted access.  It is an ordered 
  7491. collection of zero or more elements. Keys and multiple elements are supported. 
  7492. Element equality is not supported. 
  7493.  
  7494. When an element is added, it is placed in the queue according to its key value 
  7495. or priority.  You can only remove the element with the highest key value. 
  7496.  
  7497. A priority queue has a largest-in, first-out behavior. 
  7498.  
  7499. Note:  All member functions of priority queue are described under "List of 
  7500. Functions". 
  7501.  
  7502.  
  7503. ΓòÉΓòÉΓòÉ 3.11.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  7504.  
  7505. IPriorityQueue, the first class in the table below, is the default 
  7506. implementation variant. If you want to use polymorphism, you can replace the 
  7507. following class implementation variants by the reference class. 
  7508.  
  7509. Class Name            Header File Based On
  7510.  
  7511. IPriorityQueue        iprioqu.h   KeySortedBag on LinkedSequence
  7512. IGPriorityQueue       iprioqu.h   KeySortedBag on LinkedSequence
  7513. IPriorityQueueOn-     ipqusts.h   KeySortedBag on TabularSequence
  7514.  SortedTabularSequence
  7515. IGPriorityQueueOn-    ipqusts.h   KeySortedBag on TabularSequence
  7516.  SortedTabularSequence
  7517. IPriorityQueueOn-     ipqusds.h   KeySortedBag on DilutedSequence
  7518.  SortedDilutedSequence
  7519. IGPriorityQueueOn-    ipqusds.h   KeySortedBag on DilutedSequence
  7520.  SortedDilutedSequence
  7521.  
  7522.  
  7523. ΓòÉΓòÉΓòÉ 3.11.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  7524.  
  7525. The following implementation variants are defined for priority queues: 
  7526.  
  7527. o Priority Queue 
  7528. o Priority Queue on Sorted Tabular Sequence 
  7529. o Priority Queue on Sorted Diluted Sequence 
  7530.  
  7531.  
  7532. ΓòÉΓòÉΓòÉ 3.11.2.1. Priority Queue ΓòÉΓòÉΓòÉ
  7533.  
  7534. IPriorityQueue  <Element, Key>
  7535. IGPriorityQueue <Element, Key, KCOps>
  7536.  
  7537. The implementation of the class IPriorityQueue requires the following element 
  7538. and key functions: 
  7539.  
  7540. Element Type 
  7541.  
  7542. o Copy constructor 
  7543. o Destructor 
  7544. o Assignment 
  7545. o Key access 
  7546.  
  7547. Key Type 
  7548.  
  7549. Ordering relation 
  7550.  
  7551.  
  7552. ΓòÉΓòÉΓòÉ 3.11.2.2. Priority Queue on Sorted Tabular Sequence ΓòÉΓòÉΓòÉ
  7553.  
  7554. IPriorityQueueOnSortedTabularSequence  <Element, Key>
  7555. IGPriorityQueueOnSortedTabularSequence <Element, Key, KCOps>
  7556.  
  7557. The implementation of the class IPriorityQueueOnSortedTabularSequence requires 
  7558. the following element and key functions: 
  7559.  
  7560. Element Type 
  7561.  
  7562. o Default constructor 
  7563. o Copy constructor 
  7564. o Destructor 
  7565. o Assignment 
  7566. o Key access 
  7567.  
  7568. Key Type 
  7569.  
  7570. Ordering relation 
  7571.  
  7572.  
  7573. ΓòÉΓòÉΓòÉ 3.11.2.3. Priority Queue on Sorted Diluted Sequence ΓòÉΓòÉΓòÉ
  7574.  
  7575. IPriorityQueueOnSortedDilutedSequence  <Element, Key>
  7576. IGPriorityQueueOnSortedDilutedSequence <Element, Key, KCOps>
  7577.  
  7578. The implementation of the class IPriorityQueueOnSortedDilutedSequence requires 
  7579. the following element/key functions: 
  7580.  
  7581. Element Type 
  7582.  
  7583. o Default constructor 
  7584. o Copy constructor 
  7585. o Destructor 
  7586. o Assignment 
  7587. o Key access 
  7588.  
  7589. Key Type 
  7590.  
  7591. Ordering relation 
  7592.  
  7593.  
  7594. ΓòÉΓòÉΓòÉ 3.11.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  7595.  
  7596. For polymorphism, you can use the corresponding abstract class, 
  7597. IAPriorityQueue, which is found in the iaprioqu.h header file, or the 
  7598. corresponding reference class, IRPriorityQueue, which is found in the 
  7599. irprioqu.h header file. See Polymorphic Use of Collections for further 
  7600. information. 
  7601.  
  7602.  
  7603. ΓòÉΓòÉΓòÉ 3.11.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  7604.  
  7605. IAPriorityQueue <Element, Key>
  7606. IRPriorityQueue <Element, Key, ConcreteBase>
  7607.  
  7608. The concrete base class is one of the classes defined above. 
  7609.  
  7610. The required functions are the same as the required functions of the concrete 
  7611. base class. 
  7612.  
  7613.  
  7614. ΓòÉΓòÉΓòÉ 3.11.4. Declarations for Priority Queue ΓòÉΓòÉΓòÉ
  7615.  
  7616. template < class Element, class Key >
  7617. class IPriorityQueue {
  7618. public:
  7619.   class Cursor : ICursor {
  7620.     Element& element ();
  7621.     void setToLast ();
  7622.     void setToPrevious ();
  7623.     Boolean operator== (Cursor const& cursor);
  7624.     Boolean operator!= (Cursor const& cursor);
  7625.   };
  7626.                   IPriorityQueue    (INumber numberOfElements = 100);
  7627.                   IPriorityQueue    (IPriorityQueue < Element, Key > const&);
  7628.    IPriorityQueue < Element, Key >&
  7629.                   operator =        (IPriorityQueue < Element, Key > const&);
  7630.                   ~IPriorityQueue   ();
  7631.    Boolean        add               (Element const&);
  7632.    Boolean        add               (Element const&, ICursor&);
  7633.    void           addAllFrom        (IPriorityQueue < Element, Key > const&);
  7634.    Element const& elementAt         (ICursor const&) const;
  7635.    Element const& anyElement        () const;
  7636.    void           removeAll         ();
  7637.    Boolean        isBounded         () const;
  7638.    INumber        maxNumberOfElements () const;
  7639.    INumber        numberOfElements  () const;
  7640.    Boolean        isEmpty           () const;
  7641.    Boolean        isFull            () const;
  7642.    ICursor*       newCursor         () const;
  7643.    Boolean        setToFirst        (ICursor&) const;
  7644.    Boolean        setToNext         (ICursor&) const;
  7645.    Boolean        allElementsDo     (Boolean (*function) (Element const&, void*),
  7646.                                      void* additionalArgument = 0) const;
  7647.    Boolean        allElementsDo     (IConstantIterator <Element>&) const;
  7648.    Boolean        isConsistent      () const;
  7649.    Key const&     key               (Element const&) const;
  7650.    Boolean        containsElementWithKey      (Key const&) const;
  7651.    Boolean        containsAllKeysFrom         (IPriorityQueue
  7652.                                                < Element, Key > const&) const;
  7653.    Boolean        locateElementWithKey        (Key const&, ICursor&) const;
  7654.    Boolean        locateOrAddElementWithKey   (Element const&);
  7655.    Boolean        locateOrAddElementWithKey   (Element const&, ICursor&);
  7656.    Element const& elementWithKey              (Key const&) const;
  7657.    INumber        numberOfElementsWithKey     (Key const&) const;
  7658.    Boolean        locateNextElementWithKey    (Key const&, ICursor&) const;
  7659.    INumber        numberOfDifferentKeys       () const;
  7660.    Boolean        setToNextWithDifferentKey   (ICursor&) const;
  7661.    void           removeFirst       ();
  7662.    Element const& firstElement      () const;
  7663.    Element const& lastElement       () const;
  7664.    Element const& elementAtPosition (IPosition) const;
  7665.    Boolean        setToLast         (ICursor&) const;
  7666.    Boolean        setToPrevious     (ICursor&) const;
  7667.    void           setToPosition     (IPosition, ICursor&) const;
  7668.    Boolean        isFirst           (ICursor const&) const;
  7669.    Boolean        isLast            (ICursor const&) const;
  7670.    long           compare           (IPriorityQueue < Element, Key > const&,
  7671.                                      long (*comparisonFunction)
  7672.                                         (Element const&, Element const&)) const;
  7673.    void           enqueue           (Element const&);
  7674.    void           enqueue           (Element const&,
  7675.                                      ICursor&);
  7676.    void           dequeue           ();
  7677.    void           dequeue           (Element&);
  7678. };
  7679.  
  7680.  
  7681. ΓòÉΓòÉΓòÉ 3.12. Queue ΓòÉΓòÉΓòÉ
  7682.  
  7683. A queue is a sequence with restricted access.  It is an ordered collection of 
  7684. elements with no key and no element equality.  The elements are arranged so 
  7685. that each collection has a first and a last element, each element except the 
  7686. last has a next element, and each element but the first has a previous element. 
  7687. The type and value of the elements are irrelevant, and have no effect on the 
  7688. behavior of the collection. 
  7689.  
  7690. You can only add an element as the last element, and you can only remove the 
  7691. first element.  Consequently, the elements of a queue are in chronological 
  7692. order. 
  7693.  
  7694. A queue is characterized by a first-in, first-out (FIFO) behavior. 
  7695.  
  7696. Note:  All member functions of queue are described under "List of Functions". 
  7697.  
  7698.  
  7699. ΓòÉΓòÉΓòÉ 3.12.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  7700.  
  7701. IQueue, the first class in the table below, is the default implementation 
  7702. variant. If you want to use polymorphism, you can replace the following class 
  7703. implementation variants by the reference class. 
  7704.  
  7705. Class Name               Header File   Based On
  7706.  
  7707. IQueue                   iqueue.h      LinkedSequence
  7708. IGQueue                  iqueue.h      LinkedSequence
  7709. IQueueOnTabularSequence  iquets.h      TabularSequence
  7710. IGQueueOnTabularSequence iquets.h      TabularSequence
  7711. IQueueOnDilutedSequence  iqueds.h      DilutedSequence
  7712. IGQueueOnDilutedSequence iqueds.h      DilutedSequence
  7713.  
  7714.  
  7715. ΓòÉΓòÉΓòÉ 3.12.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  7716.  
  7717. The following implementation variants are defined for queues: 
  7718.  
  7719. o Queue 
  7720. o Queue on Tabular Sequence 
  7721. o Queue on Diluted Sequence 
  7722.  
  7723.  
  7724. ΓòÉΓòÉΓòÉ 3.12.2.1. Queue ΓòÉΓòÉΓòÉ
  7725.  
  7726. IQueue  <Element>
  7727. IGQueue <Element, StdOps>
  7728.  
  7729. The default implementation of the class IQueue requires the following element 
  7730. functions: 
  7731.  
  7732. Element Type 
  7733.  
  7734. o Copy constructor 
  7735. o Destructor 
  7736. o Assignment 
  7737.  
  7738.  
  7739. ΓòÉΓòÉΓòÉ 3.12.2.2. Queue on Tabular Sequence ΓòÉΓòÉΓòÉ
  7740.  
  7741. IQueueOnTabularSequence  <Element>
  7742. IGQueueOnTabularSequence <Element, StdOps>
  7743.  
  7744. The implementation of the class IDequeOnTabularSequence requires the following 
  7745. element functions: 
  7746.  
  7747. Element Type 
  7748.  
  7749. o Default constructor 
  7750. o Copy constructor 
  7751. o Destructor 
  7752. o Assignment 
  7753.  
  7754.  
  7755. ΓòÉΓòÉΓòÉ 3.12.2.3. Queue on Diluted Sequence ΓòÉΓòÉΓòÉ
  7756.  
  7757. IQueueOnDilutedSequence  <Element>
  7758. IGQueueOnDilutedSequence <Element, StdOps>
  7759.  
  7760. The implementation of the class IQueueOnDilutedSequence requires the following 
  7761. element functions: 
  7762.  
  7763. Element Type 
  7764.  
  7765. o Default constructor 
  7766. o Copy constructor 
  7767. o Destructor 
  7768. o Assignment 
  7769.  
  7770.  
  7771. ΓòÉΓòÉΓòÉ 3.12.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  7772.  
  7773. For polymorphism, you can use the corresponding abstract class, IAQueue, which 
  7774. is found in the iaqueue.h header file, or the corresponding reference class, 
  7775. IRQueue, which is found in the irqueue.h header file. See Polymorphic Use of 
  7776. Collections for further information. 
  7777.  
  7778.  
  7779. ΓòÉΓòÉΓòÉ 3.12.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  7780.  
  7781. IAQueue <Element>
  7782. IRQueue <Element, ConcreteBase>
  7783.  
  7784. The concrete base class is one of the classes defined above. 
  7785.  
  7786. The required functions are the same as the required functions of the concrete 
  7787. base class. 
  7788.  
  7789.  
  7790. ΓòÉΓòÉΓòÉ 3.12.4. Declarations for Queue ΓòÉΓòÉΓòÉ
  7791.  
  7792. template < class Element >
  7793. class IQueue  {
  7794. public:
  7795.   class Cursor : ICursor {
  7796.     Element& element ();
  7797.     void setToLast ();
  7798.     void setToPrevious ();
  7799.     Boolean operator== (Cursor const& cursor);
  7800.     Boolean operator!= (Cursor const& cursor);
  7801.   };
  7802.                   IQueue         (INumber numberOfElements = 100);
  7803.                   IQueue         (IQueue < Element > const&);
  7804.    IQueue < Element >&
  7805.                   operator =     (IQueue < Element > const&);
  7806.                   ~IQueue        ();
  7807.    Boolean        add            (Element const&);
  7808.    Boolean        add            (Element const&, ICursor&);
  7809.    void           addAllFrom     (IQueue < Element > const&);
  7810.    Element const& elementAt      (ICursor const&) const;
  7811.    Element const& anyElement     () const;
  7812.    void           removeAll      ();
  7813.    Boolean        isBounded      () const;
  7814.    INumber        maxNumberOfElements
  7815.                                  () const;
  7816.    INumber        numberOfElements
  7817.                                  () const;
  7818.    Boolean        isEmpty        () const;
  7819.    Boolean        isFull         () const;
  7820.    ICursor*       newCursor      () const;
  7821.    Boolean        setToFirst     (ICursor&) const;
  7822.    Boolean        setToNext      (ICursor&) const;
  7823.    Boolean        allElementsDo  (Boolean (*function) (Element const&, void*),
  7824.                                   void* additionalArgument = 0) const;
  7825.    Boolean        allElementsDo  (IConstantIterator <Element>&) const;
  7826.    Boolean        isConsistent   () const;
  7827.    void           removeFirst    ();
  7828.    Element const& firstElement   () const;
  7829.    Element const& lastElement    () const;
  7830.    Element const& elementAtPosition
  7831.                                  (IPosition) const;
  7832.    Boolean        setToLast      (ICursor&) const;
  7833.    Boolean        setToPrevious  (ICursor&) const;
  7834.    void           setToPosition  (IPosition, ICursor&) const;
  7835.    Boolean        isFirst        (ICursor const&) const;
  7836.    Boolean        isLast         (ICursor const&) const;
  7837.    long           compare        (IQueue < Element > const&,
  7838.                                   long (*comparisonFunction)
  7839.                                      (Element const&,
  7840.                                      Element const&)) const;
  7841.    void           addAsLast      (Element const&);
  7842.    void           addAsLast      (Element const&, ICursor&);
  7843.    void           enqueue        (Element const&);
  7844.    void           enqueue        (Element const&, ICursor&);
  7845.    void           dequeue        ();
  7846.    void           dequeue        (Element&);
  7847. };
  7848.  
  7849.  
  7850. ΓòÉΓòÉΓòÉ 3.13. Relation ΓòÉΓòÉΓòÉ
  7851.  
  7852. A relation is an unordered collection of zero or more elements that have a key. 
  7853. Element equality is supported and the values of the elements are relevant. 
  7854.  
  7855. The keys of the elements are not unique.  You can add an element whether or not 
  7856. there is already an element in the collection with the same key. 
  7857.  
  7858. Behavior of add for Unique and Multiple Collections illustrates the differences 
  7859. in behavior between map, relation, key set, and key bag when adding identical 
  7860. elements and elements with the same key. 
  7861.  
  7862. Combination of Flat Collection Properties gives an overview of the properties 
  7863. of a relation and its relationship to other flat collections. 
  7864.  
  7865. Note:  All member functions of relation are described under "List of 
  7866. Functions". 
  7867.  
  7868.  
  7869. ΓòÉΓòÉΓòÉ 3.13.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  7870.  
  7871. IRelation is the default implementation variant.  IGRelation is the default 
  7872. implementation with generic operations class.  Both variants are declared in 
  7873. the header file irel.h. If you want to use polymorphism, you can replace these 
  7874. class implementation variants by the reference class. 
  7875.  
  7876.  
  7877. ΓòÉΓòÉΓòÉ 3.13.2. Template Arguments and Required Functions for Relation ΓòÉΓòÉΓòÉ
  7878.  
  7879. IRelation  <Element, Key>
  7880. IGRelation <Element, Key, EKCOps>
  7881.  
  7882. The default implementation of the class IRelation requires the following 
  7883. element functions: 
  7884.  
  7885. Element Type 
  7886.  
  7887. o Copy constructor 
  7888. o Destructor 
  7889. o Assignment 
  7890. o Key access 
  7891. o Equality test 
  7892.  
  7893. Key Type 
  7894.  
  7895. o Equality test 
  7896. o Hash function 
  7897.  
  7898.  
  7899. ΓòÉΓòÉΓòÉ 3.13.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  7900.  
  7901. For polymorphism, you can use the corresponding abstract class, IARelation, 
  7902. which is found in the iarel.h header file, or the corresponding reference 
  7903. class, IRRelation, which is found in the irrel.h header file. See Polymorphic 
  7904. Use of Collections for further information. 
  7905.  
  7906.  
  7907. ΓòÉΓòÉΓòÉ 3.13.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  7908.  
  7909. IARel <Element, Key>
  7910. IRRel <Element, Key, ConcreteBase>
  7911.  
  7912. The concrete base class is one of the classes defined above. 
  7913.  
  7914. The required functions are the same as the required functions of the concrete 
  7915. base class. 
  7916.  
  7917.  
  7918. ΓòÉΓòÉΓòÉ 3.13.4. Declarations for Relation ΓòÉΓòÉΓòÉ
  7919.  
  7920. template < class Element, class Key >
  7921. class IRelation {
  7922. public:
  7923.   class Cursor : ICursor {
  7924.     Element& element ();
  7925.     Boolean operator== (Cursor const& cursor);
  7926.     Boolean operator!= (Cursor const& cursor);
  7927.   };
  7928.                   IRelation       (INumber numberOfElements = 100);
  7929.                   IRelation       (IRelation < Element, Key > const&);
  7930.    IRelation < Element, Key >&
  7931.                   operator =      (IRelation < Element, Key > const&);
  7932.                   ~IRelation      ();
  7933.    Boolean        add             (Element const&);
  7934.    Boolean        add             (Element const&, ICursor&);
  7935.    void           addAllFrom      (IRelation < Element, Key > const&);
  7936.    Element const& elementAt       (ICursor const&) const;
  7937.    Element&       elementAt       (ICursor const&);
  7938.    Element const& anyElement      () const;
  7939.    void           removeAt        (ICursor const&);
  7940.    INumber        removeAll       (Boolean (*property)
  7941.                                    (Element const&, void*),
  7942.                                    void* additionalArgument = 0);
  7943.    void           replaceAt       (ICursor const&, Element const&);
  7944.    void           removeAll       ();
  7945.    Boolean        isBounded       () const;
  7946.    INumber        maxNumberOfElements () const;
  7947.    INumber        numberOfElements() const;
  7948.    Boolean        isEmpty         () const;
  7949.    Boolean        isFull          () const;
  7950.    ICursor*       newCursor       () const;
  7951.    Boolean        setToFirst      (ICursor&) const;
  7952.    Boolean        setToNext       (ICursor&) const;
  7953.    Boolean        allElementsDo   (Boolean (*function) (Element&, void*),
  7954.                                    void* additionalArgument = 0);
  7955.    Boolean        allElementsDo   (IIterator <Element>&);
  7956.    Boolean        allElementsDo   (Boolean (*function)
  7957.                                    (Element const&, void*),
  7958.                                    void* additionalArgument = 0)
  7959.                                    const;
  7960.    Boolean        allElementsDo   (IConstantIterator
  7961.                                       <Element>&) const;
  7962.    Boolean        isConsistent    () const;
  7963.    Boolean        contains        (Element const&) const;
  7964.    Boolean        containsAllFrom (IRelation < Element, Key > const&) const;
  7965.    Boolean        locate          (Element const&, ICursor&)
  7966.                                    const;
  7967.    Boolean        locateOrAdd     (Element const&);
  7968.    Boolean        locateOrAdd     (Element const&,
  7969.                                    ICursor&);
  7970.    Boolean        remove          (Element const&);
  7971.    Boolean        operator ==     (IRelation < Element, Key > const&) const;
  7972.    Boolean        operator !=     (IRelation < Element, Key > const&) const;
  7973.    void           unionWith       (IRelation < Element, Key > const&);
  7974.    void           intersectionWith(IRelation < Element, Key > const&);
  7975.    void           differenceWith  (IRelation < Element, Key > const&);
  7976.    void           addUnion        (IRelation < Element, Key > const&,
  7977.                                    IRelation < Element, Key > const&);
  7978.    void           addIntersection (IRelation < Element, Key > const&,
  7979.                                    IRelation < Element, Key > const&);
  7980.    void           addDifference   (IRelation < Element, Key > const&,
  7981.                                    IRelation < Element, Key > const&);
  7982.    Key const&     key             (Element const&) const;
  7983.    Boolean  containsElementWithKey      (Key const&) const;
  7984.    Boolean  containsAllKeysFrom         (IRelation < Element, Key > const&) const;
  7985.    Boolean  locateElementWithKey        (Key const&, ICursor&) const;
  7986.    Boolean  replaceElementWithKey       (Element const&);
  7987.    Boolean  replaceElementWithKey       (Element const&, ICursor&);
  7988.    Boolean  locateOrAddElementWithKey   (Element const&);
  7989.    Boolean  locateOrAddElementWithKey   (Element const&, ICursor&);
  7990.    Boolean  addOrReplaceElementWithKey  (Element const&);
  7991.    Boolean  addOrReplaceElementWithKey  (Element const&, ICursor&);
  7992.    Boolean  removeElementWithKey        (Key const&);
  7993.    Element  const&  elementWithKey      (Key const&) const;
  7994.    Element& elementWithKey              (Key const&);
  7995.    INumber  numberOfElementsWithKey     (Key const&) const;
  7996.    Boolean  locateNextElementWithKey    (Key const&, ICursor&) const;
  7997.    INumber  removeAllElementsWithKey    (Key const&);
  7998.    INumber  numberOfDifferentKeys       () const;
  7999.    Boolean  setToNextWithDifferentKey   (ICursor&) const;
  8000. };
  8001.  
  8002.  
  8003. ΓòÉΓòÉΓòÉ 3.14. Sequence ΓòÉΓòÉΓòÉ
  8004.  
  8005. A sequence is an ordered collection of elements.  The elements are arranged so 
  8006. that each collection has a first and a last element, each element except the 
  8007. last has a next element, and each element but the first has a previous element. 
  8008.  
  8009. The type and value of the elements are irrelevant, and have no effect on the 
  8010. behavior of the collection.  Elements can be added and deleted from any 
  8011. position in the collection.  Elements can be retrieved or replaced.  A sequence 
  8012. does not support element equality or a key. 
  8013.  
  8014. Combination of Flat Collection Properties illustrates the properties of a 
  8015. sequence and its relationship to other flat collections. 
  8016.  
  8017. Note:  All member functions of sequence are described under "List of 
  8018. Functions". 
  8019.  
  8020.  
  8021. ΓòÉΓòÉΓòÉ 3.14.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  8022.  
  8023. ISequence, the first class in the table below, is the default implementation 
  8024. variant. If you need to use polymorphism, you can replace the following class 
  8025. implementation variants by the reference class. 
  8026.  
  8027. Class Name         Header File Description
  8028.  
  8029. ISequence          iseq.h      Linked Sequence
  8030. IGSequence         iseq.h      Linked Sequence
  8031. ILinkedSequence    ilnseq.h    Linked Sequence
  8032. IGLinkedSequence   ilnseq.h    Linked Sequence
  8033. ITabularSequence   itbseq.h    Tabular Sequence
  8034. IGTabularSequence  itbseq.h    Tabular Sequence
  8035. IDilutedSequence   itdseq.h    Tabular Diluted Sequence
  8036. IGDilutedSequence  itdseq.h    Tabular Diluted Sequence
  8037.  
  8038.  
  8039. ΓòÉΓòÉΓòÉ 3.14.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  8040.  
  8041. The following implementation variants are defined for sequences: 
  8042.  
  8043. o Sequence 
  8044. o Linked Sequence 
  8045. o Tabular Sequence 
  8046. o Diluted Sequence 
  8047.  
  8048.  
  8049. ΓòÉΓòÉΓòÉ 3.14.2.1. Sequence ΓòÉΓòÉΓòÉ
  8050.  
  8051. ISequence  <Element>
  8052. IGSequence <Element, StdOps>
  8053.  
  8054. The default implementation of ISequence requires the following element 
  8055. functions: 
  8056.  
  8057. Element Type 
  8058.  
  8059. o Copy constructor. 
  8060. o Destructor 
  8061. o Assignment. 
  8062.  
  8063.  
  8064. ΓòÉΓòÉΓòÉ 3.14.2.2. Linked Sequence ΓòÉΓòÉΓòÉ
  8065.  
  8066. ILinkedSequence  <Element>
  8067. IGLinkedSequence <Element, StdOps>
  8068.  
  8069. The implementation of the class ILinkedSequence requires the following element 
  8070. functions: 
  8071.  
  8072. Element Type 
  8073.  
  8074. o Copy constructor. 
  8075. o Destructor 
  8076. o Assignment. 
  8077.  
  8078.  
  8079. ΓòÉΓòÉΓòÉ 3.14.2.3. Tabular Sequence ΓòÉΓòÉΓòÉ
  8080.  
  8081. ITabularSequence  <Element>
  8082. IGTabularSequence <Element, StdOps>
  8083.  
  8084. The implementation of the class ITabularSequence requires the following element 
  8085. functions: 
  8086.  
  8087. Element Type 
  8088.  
  8089. o Default constructor 
  8090. o Copy constructor. 
  8091. o Destructor 
  8092. o Assignment. 
  8093.  
  8094.  
  8095. ΓòÉΓòÉΓòÉ 3.14.2.4. Diluted Sequence ΓòÉΓòÉΓòÉ
  8096.  
  8097. IDilutedSequence  <Element>
  8098. IGDilutedSequence <Element, StdOps>
  8099.  
  8100. The implementation of the class IDilutedSequence requires the following element 
  8101. functions: 
  8102.  
  8103. Element Type 
  8104.  
  8105. o Default constructor 
  8106. o Copy constructor. 
  8107. o Destructor 
  8108. o Assignment. 
  8109.  
  8110.  
  8111. ΓòÉΓòÉΓòÉ 3.14.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  8112.  
  8113. For polymorphism, you can use the corresponding abstract class, IASequence, 
  8114. which is found in the iaseq.h header file, or the corresponding reference 
  8115. class, IRSequence, which is found in the irseq.h header file. See Polymorphic 
  8116. Use of Collections for further information. 
  8117.  
  8118.  
  8119. ΓòÉΓòÉΓòÉ 3.14.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  8120.  
  8121. IASequence <Element>
  8122. IRSequence <Element, ConcreteBase>
  8123.  
  8124. The concrete base class is one of the sequence classes. 
  8125.  
  8126. The required functions are the same as the required functions of the concrete 
  8127. base class. 
  8128.  
  8129.  
  8130. ΓòÉΓòÉΓòÉ 3.14.4. Declarations for Sequence ΓòÉΓòÉΓòÉ
  8131.  
  8132. template < class Element >
  8133. class ISequence {
  8134. public:
  8135.   class Cursor : ICursor {
  8136.     Element& element    ();
  8137.     void setToLast      ();
  8138.     void setToPrevious  ();
  8139.     Boolean operator==  (Cursor const& cursor);
  8140.     Boolean operator!=  (Cursor const& cursor);
  8141.   };
  8142.                   ISequence           (INumber numberOfElements = 100);
  8143.                   ISequence           (ISequence < Element > const&);
  8144.    ISequence < Element >&
  8145.                   operator =          (ISequence < Element > const&);
  8146.                   ~ISequence          ();
  8147.    Boolean        add                 (Element const&);
  8148.    Boolean        add                 (Element const&, ICursor&);
  8149.    void           addAllFrom          (ISequence < Element > const&);
  8150.    Element const& elementAt           (ICursor const&) const;
  8151.    Element&       elementAt           (ICursor const&);
  8152.    Element const& anyElement          () const;
  8153.    void           removeAt            (ICursor const&);
  8154.    INumber        removeAll           (Boolean (*property)
  8155.                                        (Element const&, void*),
  8156.                                        void* additionalArgument = 0);
  8157.    void           replaceAt           (ICursor const&, Element const&);
  8158.    void           removeAll           ();
  8159.    Boolean        isBounded           () const;
  8160.    INumber        maxNumberOfElements () const;
  8161.    INumber        numberOfElements    () const;
  8162.    Boolean        isEmpty             () const;
  8163.    Boolean        isFull              () const;
  8164.    ICursor*       newCursor           () const;
  8165.    Boolean        setToFirst          (ICursor&) const;
  8166.    Boolean        setToNext           (ICursor&) const;
  8167.    Boolean        allElementsDo       (Boolean (*function) (Element&, void*),
  8168.                                        void* additionalArgument = 0);
  8169.    Boolean        allElementsDo       (IIterator <Element>&);
  8170.    Boolean        allElementsDo       (Boolean (*function)
  8171.                                        (Element const&, void*),
  8172.                                        void* additionalArgument = 0) const;
  8173.    Boolean        allElementsDo       (IConstantIterator <Element>&) const;
  8174.    Boolean        isConsistent        () const;
  8175.    void           removeFirst         ();
  8176.    void           removeLast          ();
  8177.    void           removeAtPosition    (IPosition);
  8178.    Element const& firstElement        () const;
  8179.    Element const& lastElement         () const;
  8180.    Element const& elementAtPosition   (IPosition) const;
  8181.    Boolean        setToLast           (ICursor&) const;
  8182.    Boolean        setToPrevious       (ICursor&) const;
  8183.    void           setToPosition       (IPosition, ICursor&) const;
  8184.    Boolean        isFirst             (ICursor const&) const;
  8185.    Boolean        isLast              (ICursor const&) const;
  8186.    long           compare             (ISequence < Element > const&,
  8187.                                        long (*comparisonFunction)
  8188.                                           (Element const&,
  8189.                                           Element const&)) const;
  8190.    void           addAsFirst          (Element const&);
  8191.    void           addAsFirst          (Element const&, ICursor&);
  8192.    void           addAsLast           (Element const&);
  8193.    void           addAsLast           (Element const&, ICursor&);
  8194.    void           addAsNext           (Element const&, ICursor&);
  8195.    void           addAsPrevious       (Element const&, ICursor&);
  8196.    void           addAtPosition       (IPosition, Element const&);
  8197.    void           addAtPosition       (IPosition, Element const&, ICursor&);
  8198.    void           sort                (long (*comparisonFunction)
  8199.                                        (Element const&,
  8200.                                        Element const&));
  8201. };
  8202.  
  8203.  
  8204. ΓòÉΓòÉΓòÉ 3.14.5. Coding Example for Sequence ΓòÉΓòÉΓòÉ
  8205.  
  8206. The following program creates a sequence using the default sequence class, 
  8207. ISequence, and adds a number of words to it.  The program sorts the words in 
  8208. ascending order and searches the sequence for the word "fox".  Finally, it 
  8209. prints the word that is in position 9. 
  8210.  
  8211. The program uses two types of iteration.  It uses the iterator class, 
  8212. IIterator, when printing the sequence, and it uses cursor iteration when 
  8213. searching for a word.  With the iterator object, the program uses the 
  8214. allElementsDo function. With cursor iteration, it uses the setToFirst, isValid, 
  8215. and setToNext functions. It uses the elementAt and elementAtPosition functions 
  8216. to find words in the sequence. 
  8217.  
  8218. // wordseq.C  -  An example of using a Sequence
  8219. #include <iostream.h>
  8220.               // Get definition and declaration of class Word:
  8221. #include "toyword.h"
  8222.               // Define a compare function to be used for sort:
  8223. inline long wordCompare ( Word const& w1, Word const& w2) {
  8224.    return compare (w1.text(), w2.text());
  8225. }
  8226.  
  8227.              //  We want to use the default Sequence called ISequence
  8228. #include <iseq.h>
  8229.  
  8230. typedef ISequence <Word> WordSeq;
  8231. typedef IIterator <Word> WordIter;
  8232.  
  8233.              // Test variables to put into the Sequence
  8234. char *String[9] = {
  8235.    "the",    "quick",   "brown",   "fox",   "jumps",
  8236.    "over",   "a",       "lazy",    "dog"
  8237. };
  8238.              // Our Iterator class for use with allElementsDo()
  8239. class PrintClass : public WordIter
  8240. {
  8241. public:
  8242.    Boolean applyTo(Word &w)
  8243.       {
  8244.       cout << "\n" << w.text();    // Print the string
  8245.       return(True);
  8246.       }
  8247. };
  8248.  
  8249. int main()  {
  8250.    WordSeq WL;
  8251.    WordSeq::Cursor cursor(WL);
  8252.    PrintClass Print;
  8253.  
  8254.    int i;
  8255.  
  8256.    for (i = 0; i < 9; i ++) {  // Put all strings into Sequence
  8257.       Word aWord(String[i]);   // Fill object with right value
  8258.       WL.addAsLast(aWord);     // Add it to the Sequence at end
  8259.    }
  8260.  
  8261.    cout << "\nSequence in initial order:\n";
  8262.    WL.allElementsDo(Print);
  8263.  
  8264.    WL.sort(wordCompare);       // Sort the Sequence ascending
  8265.    cout << "\n\nSequnce in sorted order:\n";
  8266.    WL.allElementsDo(Print);
  8267.  
  8268.    // Use iteration via cursor now:
  8269.    cout << "\n\nLook for \"fox\" in the Sequence:\n";
  8270.    for (cursor.setToFirst();
  8271.         cursor.isValid() && (WL.elementAt(cursor) != "fox");
  8272.         cursor.setToNext());
  8273.  
  8274.    if (WL.elementAt(cursor) != "fox") {
  8275.        cout << "\n The element was not found.\n";
  8276.    }
  8277.    else {
  8278.        cout << "\n The element was found.\n";
  8279.    }
  8280.  
  8281.    cout << "\n\nThe element at position 9: "
  8282.         <<  WL.elementAtPosition(9).text();
  8283.    return(0);
  8284. }
  8285.  
  8286. The program produces the following output: 
  8287.  
  8288.  
  8289. Sequence in initial order:
  8290.  
  8291. the
  8292. quick
  8293. brown
  8294. fox
  8295. jumps
  8296. over
  8297. a
  8298. lazy
  8299. dog
  8300.  
  8301. Sequence in sorted order:
  8302.  
  8303. a
  8304. brown
  8305. dog
  8306. fox
  8307. jumps
  8308. lazy
  8309. over
  8310. quick
  8311. the
  8312.  
  8313. Look for "fox" in the Sequence:
  8314.  
  8315.  The element was found.
  8316.  
  8317.  
  8318. The element at position 9: the
  8319.  
  8320.  
  8321. ΓòÉΓòÉΓòÉ 3.15. Set ΓòÉΓòÉΓòÉ
  8322.  
  8323. A set is an unordered collection of zero or more elements with no key.  Element 
  8324. equality is supported and the values of the elements are relevant. 
  8325.  
  8326. Only unique elements are supported.  A request to add an element that already 
  8327. exists is ignored. 
  8328.  
  8329. Combination of Flat Collection Properties gives an overview of the properties 
  8330. of a set and its relationship to other flat collections. 
  8331.  
  8332. The set also offers typical set functions such as union, intersection, and 
  8333. difference. 
  8334.  
  8335. Note:  All member functions of set are described under "List of Functions". 
  8336.  
  8337.  
  8338. ΓòÉΓòÉΓòÉ 3.15.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  8339.  
  8340. ISet, the first class in the table below, is the default implementation 
  8341. variant. If you want to use polymorphism, you can replace the following class 
  8342. implementation variants by the reference class. 
  8343.  
  8344. Class Name                   Header File  Based On
  8345.  
  8346. ISet                         iset.h       AVL KeySortedSet
  8347. IGSet                        iset.h       AVL KeySortedSet
  8348. ISetOnBSTKeySortedSet        isetbst.h    B* KeySortedSet
  8349. IGSetOnBSTKeySortedSet       isetbst.h    B* KeySortedSet
  8350. ISetOnSortedLinkedSequence   isetsls.h    LinkedSequence
  8351. IGSetOnSortedLinkedSequence  isetsls.h    LinkedSequence
  8352. ISetOnSortedTabularSequence  isetsts.h    TabularSequence
  8353. IGSetOnSortedTabularSequence isetsts.h    TabularSequence
  8354. ISetOnSortedDilutedSequence  isetsds.h    DilutedSequence
  8355. IGSetOnSortedDilutedSequence isetsds.h    DilutedSequence
  8356. ISetOnHashKeySet             isethks.h    Hash KeySet
  8357. IGSetOnHashKeySet            isethks.h    Hash KeySet
  8358.  
  8359.  
  8360. ΓòÉΓòÉΓòÉ 3.15.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  8361.  
  8362. The following implementation variants are defined for sets: 
  8363.  
  8364. o Set 
  8365. o Set on B* Key Sorted Set 
  8366. o Set on Sorted linked Sequence 
  8367. o Set on Sorted Tabular Sequence 
  8368. o Set on Sorted Diluted Sequence 
  8369. o Set on Hash Key Set 
  8370.  
  8371.  
  8372. ΓòÉΓòÉΓòÉ 3.15.2.1. Set ΓòÉΓòÉΓòÉ
  8373.  
  8374. ISet  <Element>
  8375. IGSet <Element, ECOps>
  8376.  
  8377. The default implementation of the class ISet requires the following element 
  8378. functions: 
  8379.  
  8380. Element Type 
  8381.  
  8382. o Copy constructor 
  8383. o Destructor 
  8384. o Assignment 
  8385. o Equality test 
  8386. o Ordering relation 
  8387.  
  8388.  
  8389. ΓòÉΓòÉΓòÉ 3.15.2.2. Set on B* Key Sorted Set ΓòÉΓòÉΓòÉ
  8390.  
  8391. ISetOnBSTKeySortedSet  <Element>
  8392. IGSetOnBSTKeySortedSet <Element, ECOps>
  8393.  
  8394. The default implementation of the class ISetOnBSTKeySortedSet requires the 
  8395. following element functions: 
  8396.  
  8397. Element Type 
  8398.  
  8399. o Default constructor 
  8400. o Copy constructor 
  8401. o Destructor 
  8402. o Assignment 
  8403. o Equality test 
  8404. o Ordering relation 
  8405.  
  8406.  
  8407. ΓòÉΓòÉΓòÉ 3.15.2.3. Set on Sorted linked Sequence ΓòÉΓòÉΓòÉ
  8408.  
  8409. ISetOnSortedLinkedSequence  <Element>
  8410. IGSetOnSortedLinkedSequence <Element, ECOps>
  8411.  
  8412. The implementation of the class ISetOnSortedLinkedSequence requires the 
  8413. following element functions: 
  8414.  
  8415. Element Type 
  8416.  
  8417. o Copy constructor 
  8418. o Destructor 
  8419. o Assignment 
  8420. o Equality test 
  8421. o Ordering relation 
  8422.  
  8423.  
  8424. ΓòÉΓòÉΓòÉ 3.15.2.4. Set on Sorted Tabular Sequence ΓòÉΓòÉΓòÉ
  8425.  
  8426. ISetOnSortedTabularSequence  <Element>
  8427. IGSetOnSortedTabularSequence <Element, ECOps>
  8428.  
  8429. The implementation of the class ISetOnSortedTabularSequence requires the 
  8430. following element functions: 
  8431.  
  8432. Element Type 
  8433.  
  8434. o Default constructor 
  8435. o Copy constructor 
  8436. o Destructor 
  8437. o Assignment 
  8438. o Equality test 
  8439. o Ordering relation 
  8440.  
  8441.  
  8442. ΓòÉΓòÉΓòÉ 3.15.2.5. Set on Sorted Diluted Sequence ΓòÉΓòÉΓòÉ
  8443.  
  8444. ISetOnSortedDilutedSequence  <Element>
  8445. IGSetOnSortedDilutedSequence <Element, ECOps>
  8446.  
  8447. The implementation of the class ISetOnSortedDilutedSequence requires the 
  8448. following element functions: 
  8449.  
  8450. Element Type 
  8451.  
  8452. o Default constructor 
  8453. o Copy constructor 
  8454. o Destructor 
  8455. o Assignment 
  8456. o Equality test 
  8457. o Ordering relation 
  8458.  
  8459.  
  8460. ΓòÉΓòÉΓòÉ 3.15.2.6. Set on Hash Key Set ΓòÉΓòÉΓòÉ
  8461.  
  8462. ISetOnHashKeySet  <Element>
  8463. IGSetOnHashKeySet <Element, EHOps>
  8464.  
  8465. The implementation of the classISetOnHashKeySet requires the following element 
  8466. functions: 
  8467.  
  8468. Element Type 
  8469.  
  8470. o Copy constructor 
  8471. o Destructor 
  8472. o Assignment 
  8473. o Equality test 
  8474. o Hash function 
  8475.  
  8476.  
  8477. ΓòÉΓòÉΓòÉ 3.15.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  8478.  
  8479. For polymorphism, you can use the corresponding abstract class, IASet, which is 
  8480. found in the iaset.h header file, or the corresponding reference class, IRSet, 
  8481. which is found in the irset.h header file. See Polymorphic Use of Collections 
  8482. for further information. 
  8483.  
  8484.  
  8485. ΓòÉΓòÉΓòÉ 3.15.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  8486.  
  8487. IASet <Element>
  8488. IRSet <Element, ConcreteBase>
  8489.  
  8490. The concrete base class is one of the classes defined above. 
  8491.  
  8492. The required functions are the same as the required functions of the concrete 
  8493. base class. 
  8494.  
  8495.  
  8496. ΓòÉΓòÉΓòÉ 3.15.4. Declarations for Set ΓòÉΓòÉΓòÉ
  8497.  
  8498. template < class Element >
  8499. class ISet {
  8500. public:
  8501.   class Cursor : ICursor {
  8502.     Element& element ();
  8503.     Boolean operator== (Cursor const& cursor);
  8504.     Boolean operator!= (Cursor const& cursor);
  8505.   };
  8506.                   ISet               (INumber numberOfElements = 100);
  8507.                   ISet               (ISet < Element > const&);
  8508.    ISet < Element >&
  8509.                   operator =         (ISet < Element > const&);
  8510.                   ~ISet              ();
  8511.    Boolean        add                (Element const&);
  8512.    Boolean        add                (Element const&, ICursor&);
  8513.    void           addAllFrom         (ISet < Element > const&);
  8514.    Element const& elementAt          (ICursor const&) const;
  8515.    Element&       elementAt          (ICursor const&);
  8516.    Element const& anyElement         () const;
  8517.    void           removeAt           (ICursor const&);
  8518.    INumber        removeAll          (Boolean (*property)
  8519.                                       (Element const&, void*),
  8520.                                       void* additionalArgument = 0);
  8521.    void           replaceAt          (ICursor const&, Element const&);
  8522.    void           removeAll          ();
  8523.    Boolean        isBounded          () const;
  8524.    INumber        maxNumberOfElements() const;
  8525.    INumber        numberOfElements   () const;
  8526.    Boolean        isEmpty            () const;
  8527.    Boolean        isFull             () const;
  8528.    ICursor*       newCursor          () const;
  8529.    Boolean        setToFirst         (ICursor&) const;
  8530.    Boolean        setToNext          (ICursor&) const;
  8531.    Boolean        allElementsDo      (Boolean (*function) (Element&, void*),
  8532.                                       void* additionalArgument = 0);
  8533.    Boolean        allElementsDo      (IIterator <Element>&);
  8534.    Boolean        allElementsDo      (Boolean (*function)
  8535.                                       (Element const&, void*),
  8536.                                       void* additionalArgument = 0) const;
  8537.    Boolean        allElementsDo      (IConstantIterator <Element>&) const;
  8538.    Boolean        isConsistent       () const;
  8539.    Boolean        contains           (Element const&) const;
  8540.    Boolean        containsAllFrom    (ISet < Element > const&) const;
  8541.    Boolean        locate             (Element const&, ICursor&) const;
  8542.    Boolean        locateOrAdd        (Element const&);
  8543.    Boolean        locateOrAdd        (Element const&, ICursor&);
  8544.    Boolean        remove             (Element const&);
  8545.    Boolean        operator ==        (ISet < Element > const&) const;
  8546.    Boolean        operator !=        (ISet < Element > const&) const;
  8547.    void           unionWith          (ISet < Element > const&);
  8548.    void           intersectionWith   (ISet < Element > const&);
  8549.    void           differenceWith     (ISet < Element > const&);
  8550.    void           addUnion           (ISet < Element > const&,
  8551.                                       ISet < Element > const&);
  8552.    void           addIntersection    (ISet < Element > const&,
  8553.                                       ISet < Element > const&);
  8554.    void           addDifference      (ISet < Element > const&,
  8555.                                       ISet < Element > const&);
  8556. };
  8557.  
  8558.  
  8559. ΓòÉΓòÉΓòÉ 3.15.5. Coding Example for Set ΓòÉΓòÉΓòÉ
  8560.  
  8561. The follow program creates sets using the default class, ISet. The odd set 
  8562. contains all odd numbers less than ten. The prime set contains all prime 
  8563. numbers less than ten.  The program creates a set, oddPrime, that contains all 
  8564. the prime numbers less than ten that are odd, by using the intersection of odd 
  8565. and prime. It creates another set, evenPrime, that contains all the prime 
  8566. numbers less than ten that are even, by using the difference of prime and 
  8567. oddPrime. 
  8568.  
  8569. When printing the sets, the program uses the iterator class, IIterator. It uses 
  8570. the add function to build the odd and prime sets.  It uses the addIntersection 
  8571. and addDifference functions to create the oddPrime and evenPrime sets, 
  8572. respectively. 
  8573.  
  8574. //  evenodd.C  -  An example of using a Set
  8575.  
  8576. #include <iostream.h>
  8577.  
  8578. #include <iset.h>        // Take the defaults for the Set and for
  8579.                          // the required functions for integer
  8580. typedef ISet <int> IntSet;
  8581.  
  8582. // For iteration we want to use an object of an iterator class z
  8583. class PrintClass : public IIterator<int>  {
  8584.   public:
  8585.     virtual Boolean applyTo(int& i)
  8586.       { cout << " " << i << " "; return True;}
  8587. };
  8588.  
  8589. // Local prototype for the function to display an IntSet
  8590. void    List(char *, IntSet &);
  8591.  
  8592. int main ()  {
  8593.    IntSet odd, prime;
  8594.    IntSet oddPrime, evenPrime;
  8595.    int One = 1, Two = 2, Three = 3, Five = 5, Seven = 7, Nine = 9;
  8596.  
  8597. // Fill odd set with odd integers < 10
  8598.    odd.add( One );
  8599.    odd.add( Three );
  8600.    odd.add( Five );
  8601.    odd.add( Seven );
  8602.    odd.add( Nine );
  8603.    List("Odds less than 10:  ", odd);
  8604.  
  8605. // Fill prime set with primes < 10
  8606.    prime.add( Two );
  8607.    prime.add( Three );
  8608.    prime.add( Five );
  8609.    prime.add( Seven );
  8610.    List("Primes less than 10:  ", prime);
  8611.  
  8612. // Intersect 'Odd' and 'Prime' to give 'OddPrime'
  8613.    oddPrime.addIntersection( odd, prime);
  8614.    List("Odd primes less than 10:  ", oddPrime);
  8615.  
  8616. // Subtract all 'Odd' from 'Prime' to give 'EvenPrime'
  8617.    evenPrime.addDifference( prime, oddPrime);
  8618.    List("Even primes less than 10:  ", evenPrime);
  8619.  
  8620.    return(0);
  8621. }
  8622.  
  8623. // Local function to display an IntSet
  8624. void List(char *Message, IntSet &anIntSet)  {
  8625.    PrintClass Print;
  8626.    cout << Message;
  8627.    anIntSet.allElementsDo(Print);
  8628.    cout << "\n";
  8629. }
  8630.  
  8631. The program produces the following output: 
  8632.  
  8633. Odds less than 10:   1  3  5  7  9
  8634. Primes less than 10:   2  3  5  7
  8635. Odd primes less than 10:   3  5  7
  8636. Even primes less than 10:   2
  8637.  
  8638.  
  8639. ΓòÉΓòÉΓòÉ 3.16. Sorted Bag ΓòÉΓòÉΓòÉ
  8640.  
  8641. A sorted bag is an ordered collection of zero or more elements with no key. 
  8642. Both element equality and multiple elements are supported. 
  8643.  
  8644. Combination of Flat Collection Properties gives an overview of the properties 
  8645. of a sorted bag and its relationship to other flat collections. 
  8646.  
  8647. Note:  All member functions are described in Flat Collection Member Functions. 
  8648.  
  8649.  
  8650. ΓòÉΓòÉΓòÉ 3.16.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  8651.  
  8652. ISortedBag, the first class in the table below, is the default implementation 
  8653. variant. If you want to use polymorphism, you can replace the following class 
  8654. implementation variants by the reference class. 
  8655.  
  8656. Class Name                    Header File  Based On
  8657.  
  8658. ISortedBag                    isrtbag.h    AVL KeySortedSet
  8659. IGSortedBag                   isrtbag.h    AVL KeySortedSet
  8660. ISortedBagOnBSTKeySortedSet   isbbst.h     B* KeySortedSet
  8661. IGSortedBagOnBSTKeySortedSet  isbbst.h     B* KeySortedSet
  8662. ISortedBagOn-                 isbsls.h     LinkedSequence
  8663.  SortedLinkedSequence
  8664. IGSortedBagOn                 isbsls.h     LinkedSequence
  8665.  SortedLinkedSequence
  8666. ISortedBagOn-                 isbsts.h     TabularSequence
  8667.  SortedTabularSequence
  8668. IGSortedBagOn-                isbsts.h     TabularSequence
  8669.  SortedTabularSequence
  8670. ISortedBagOn-                 isbsds.h     DilutedSequence
  8671.  SortedDilutedSequence
  8672. IGSortedBagOn-                isbsds.h     DilutedSequence
  8673.  SortedDilutedSequence
  8674.  
  8675.  
  8676. ΓòÉΓòÉΓòÉ 3.16.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  8677.  
  8678. The following implementation variants are defined for sorted bags: 
  8679.  
  8680. o Sorted Bag 
  8681. o Sorted Bag on B* Key Sorted Set 
  8682. o Sorted Bag on Sorted Linked Sequence 
  8683. o Sorted Bag on Sorted Tabular Sequence 
  8684. o Sorted Bag on Sorted Diluted Sequence 
  8685.  
  8686.  
  8687. ΓòÉΓòÉΓòÉ 3.16.2.1. Sorted Bag ΓòÉΓòÉΓòÉ
  8688.  
  8689. ISortedBag  <Element>
  8690. IGSortedBag <Element, ECOps>
  8691.  
  8692. The default implementation of the class ISortedBag requires the following 
  8693. element functions: 
  8694.  
  8695. Element Type 
  8696.  
  8697. o Copy constructor 
  8698. o Destructor 
  8699. o Assignment 
  8700. o Equality test 
  8701. o Ordering relation 
  8702.  
  8703.  
  8704. ΓòÉΓòÉΓòÉ 3.16.2.2. Sorted Bag on B* Key Sorted Set ΓòÉΓòÉΓòÉ
  8705.  
  8706. ISortedBagOnBSTKeySortedSet  <Element>
  8707. IGSortedBagOnBSTKeySortedSet <Element, ECOps>
  8708.  
  8709. The default implementation of the class ISortedBagOnBSTKeySortedSet requires 
  8710. the following element functions: 
  8711.  
  8712. Element Type 
  8713.  
  8714. o Default constructor 
  8715. o Copy constructor 
  8716. o Destructor 
  8717. o Assignment 
  8718. o Equality test 
  8719. o Ordering relation 
  8720.  
  8721.  
  8722. ΓòÉΓòÉΓòÉ 3.16.2.3. Sorted Bag on Sorted Linked Sequence ΓòÉΓòÉΓòÉ
  8723.  
  8724. ISortedBagOnSortedLinkedSequence  <Element>
  8725. IGSortedBagOnSortedLinkedSequence <Element, ECOps>
  8726.  
  8727. The default implementation of the class ISortedBagOnSortedLinkedSequence 
  8728. requires the following element functions: 
  8729.  
  8730. Element Type 
  8731.  
  8732. o Constructor 
  8733. o Assignment 
  8734. o Equality test 
  8735. o Ordering relation 
  8736.  
  8737.  
  8738. ΓòÉΓòÉΓòÉ 3.16.2.4. Sorted Bag on Sorted Tabular Sequence ΓòÉΓòÉΓòÉ
  8739.  
  8740. ISortedBagOnSortedTabularSequence  <Element>
  8741. IGSortedBagOnSortedTabularSequence <Element, ECOps>
  8742.  
  8743. The default implementation of the class ISortedBagOnSortedTabularSequence 
  8744. requires the following element functions: 
  8745.  
  8746. Element Type 
  8747.  
  8748. o Default constructor 
  8749. o Copy constructor 
  8750. o Destructor 
  8751. o Assignment 
  8752. o Equality test 
  8753. o Ordering relation 
  8754.  
  8755.  
  8756. ΓòÉΓòÉΓòÉ 3.16.2.5. Sorted Bag on Sorted Diluted Sequence ΓòÉΓòÉΓòÉ
  8757.  
  8758. ISortedBagOnSortedDilutedSequence  <Element>
  8759. IGSortedBagOnSortedDilutedSequence <Element, ECOps>
  8760.  
  8761. The default implementation of the class ISortedBagOnSortedDilutedSequence 
  8762. requires the following element functions: 
  8763.  
  8764. Element Type 
  8765.  
  8766. o Default constructor 
  8767. o Copy constructor 
  8768. o Destructor 
  8769. o Assignment 
  8770. o Equality test 
  8771. o Ordering relation 
  8772.  
  8773.  
  8774. ΓòÉΓòÉΓòÉ 3.16.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  8775.  
  8776. For polymorphism, you can use the corresponding abstract class, IASBag, which 
  8777. is found in the iasbag.h header file, or the corresponding reference class, 
  8778. IRSBag, which is found in the irsbag.h header file. See Polymorphic Use of 
  8779. Collections for further information. 
  8780.  
  8781.  
  8782. ΓòÉΓòÉΓòÉ 3.16.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  8783.  
  8784. IASBag <Element>
  8785. IRSBag <Element, ConcreteBase>
  8786.  
  8787. The concrete base class is one of the classes defined above. 
  8788.  
  8789. The required functions are the same as the required functions of the concrete 
  8790. base class. 
  8791.  
  8792.  
  8793. ΓòÉΓòÉΓòÉ 3.16.4. Declarations for Sorted Bag ΓòÉΓòÉΓòÉ
  8794.  
  8795. template < class Element >
  8796. class ISortedBag {
  8797. public:
  8798.   class Cursor : ICursor {
  8799.     Element& element ();
  8800.     void setToLast ();
  8801.     void setToPrevious ();
  8802.     Boolean operator== (Cursor const& cursor);
  8803.     Boolean operator!= (Cursor const& cursor);
  8804.   };
  8805.                   ISortedBag         (INumber numberOfElements = 100);
  8806.                   ISortedBag         (ISortedBag < Element > const&);
  8807.    ISortedBag < Element >&
  8808.                   operator =         (ISortedBag < Element > const&);
  8809.                   ~ISortedBag        ();
  8810.    Boolean        add                (Element const&);
  8811.    Boolean        add                (Element const&, ICursor&);
  8812.    void           addAllFrom         (ISortedBag < Element > const&);
  8813.    Element const& elementAt          (ICursor const&) const;
  8814.    Element&       elementAt          (ICursor const&);
  8815.    Element const& anyElement         () const;
  8816.    void           removeAt           (ICursor const&);
  8817.    INumber        removeAll          (Boolean (*property)
  8818.                                       (Element const&, void*),
  8819.                                       void* additionalArgument = 0);
  8820.    void           replaceAt          (ICursor const&, Element const&);
  8821.    void           removeAll          ();
  8822.    Boolean        isBounded          () const;
  8823.    INumber        maxNumberOfElements() const;
  8824.    INumber        numberOfElements   () const;
  8825.    Boolean        isEmpty            () const;
  8826.    Boolean        isFull             () const;
  8827.    ICursor*       newCursor          () const;
  8828.    Boolean        setToFirst         (ICursor&) const;
  8829.    Boolean        setToNext          (ICursor&) const;
  8830.    Boolean        allElementsDo      (Boolean (*function) (Element&, void*),
  8831.                                       void* additionalArgument = 0);
  8832.    Boolean        allElementsDo      (IIterator <Element>&);
  8833.    Boolean        allElementsDo      (Boolean (*function)
  8834.                                       (Element const&, void*),
  8835.                                       void* additionalArgument = 0) const;
  8836.    Boolean        allElementsDo      (IConstantIterator <Element>&) const;
  8837.    Boolean        isConsistent       () const;
  8838.    Boolean        contains           (Element const&) const;
  8839.    Boolean        containsAllFrom    (ISortedBag < Element > const&) const;
  8840.    Boolean        locate             (Element const&, ICursor&) const;
  8841.    Boolean        locateOrAdd        (Element const&);
  8842.    Boolean        locateOrAdd        (Element const&, ICursor&);
  8843.    Boolean        remove             (Element const&);
  8844.    INumber        numberOfOccurrences(Element const&) const;
  8845.    Boolean        locateNext         (Element const&, ICursor&) const;
  8846.    INumber        removeAllOccurrences        (Element const&);
  8847.    INumber        numberOfDifferentElements   () const;
  8848.    Boolean        setToNextDifferentElement   (ICursor&) const;
  8849.    Boolean        operator ==        (ISortedBag < Element > const&) const;
  8850.    Boolean        operator !=        (ISortedBag < Element > const&) const;
  8851.    void           unionWith          (ISortedBag < Element > const&);
  8852.    void           intersectionWith   (ISortedBag < Element > const&);
  8853.    void           differenceWith     (ISortedBag < Element > const&);
  8854.    void           addUnion           (ISortedBag < Element > const&,
  8855.                                       ISortedBag < Element > const&);
  8856.    void           addIntersection    (ISortedBag < Element > const&,
  8857.                                       ISortedBag < Element > const&);
  8858.    void           addDifference      (ISortedBag < Element > const&,
  8859.                                       ISortedBag < Element > const&);
  8860.    void           removeFirst        ();
  8861.    void           removeLast         ();
  8862.    void           removeAtPosition   (IPosition);
  8863.    Element const& firstElement       () const;
  8864.    Element const& lastElement        () const;
  8865.    Element const& elementAtPosition  (IPosition) const;
  8866.    Boolean        setToLast          (ICursor&) const;
  8867.    Boolean        setToPrevious      (ICursor&) const;
  8868.    void           setToPosition      (IPosition, ICursor&) const;
  8869.    Boolean        isFirst            (ICursor const&) const;
  8870.    Boolean        isLast             (ICursor const&) const;
  8871.    long           compare            (ISortedBag < Element > const&,
  8872.                                       long (*comparisonFunction)
  8873.                                          (Element const&,
  8874.                                          Element const&)) const;
  8875. };
  8876.  
  8877.  
  8878. ΓòÉΓòÉΓòÉ 3.17. Sorted Map ΓòÉΓòÉΓòÉ
  8879.  
  8880. A sorted map is an ordered collection of zero or more elements that have a key. 
  8881. Element equality is supported and the values of the elements are relevant. 
  8882. Elements are sorted by the value of their keys. 
  8883.  
  8884. Only elements with unique keys are supported.  A request to add an element 
  8885. whose key already exists in another element of the collection is ignored. 
  8886.  
  8887. Combination of Flat Collection Properties gives an overview of the properties 
  8888. of a sorted map and its relationship to other flat collections. 
  8889.  
  8890. Note:  All member functions of sorted map are described under "List of 
  8891. Functions". 
  8892.  
  8893.  
  8894. ΓòÉΓòÉΓòÉ 3.17.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  8895.  
  8896. ISortedMap, the first class in the table below, is the default implementation 
  8897. variant. If you want to use polymorphism, you can replace the following class 
  8898. implementation variants by the reference class. 
  8899.  
  8900. Class Name                   Header File  Based On
  8901.  
  8902. ISortedMap                   isrtmap.h    AVL KeySortedSet
  8903. IGSortedMap                  isrtmap.h    AVL KeySortedSet
  8904. ISortedMapOnBSTKeySortedSet  ismbst.h     B* KeySortedSet
  8905. IGSortedMapOnBSTKeySortedSet ismbst.h     B* KeySortedSet
  8906. ISortedMapOn-                ismsls.h     LinkedSequence
  8907.  SortedLinkedSequence
  8908. IGSortedMapOn-               ismsls.h     LinkedSequence
  8909.  SortedLinkedSequence
  8910. ISortedMapOn-                ismsts.h     TabularSequence
  8911.  SortedTabularSequence
  8912. IGSortedMapOn-               ismsts.h     TabularSequence
  8913.  SortedTabularSequence
  8914. ISortedMapOn-                ismsds.h     DilutedSequence
  8915.  SortedDilutedSequence
  8916. IGSortedMapOn-               ismsds.h     DilutedSequence
  8917.  SortedDilutedSequence
  8918.  
  8919.  
  8920. ΓòÉΓòÉΓòÉ 3.17.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  8921.  
  8922. The following implementation variants are defined for sorted maps: 
  8923.  
  8924. o Sorted Map 
  8925. o Sorted Map on B* Key Sorted Set 
  8926. o Sorted Map on Sorted Linked Sequence 
  8927. o Sorted Map on Sorted Tabular Sequence 
  8928. o Sorted Map on Sorted Diluted Sequence 
  8929.  
  8930.  
  8931. ΓòÉΓòÉΓòÉ 3.17.2.1. Sorted Map ΓòÉΓòÉΓòÉ
  8932.  
  8933. ISortedMap  <Element, Key>
  8934. IGSortedMap <Element, Key, EKCOps>
  8935.  
  8936. The implementation of the class ISortedMap requires the following element and 
  8937. key functions: 
  8938.  
  8939. Element Type 
  8940.  
  8941. o Copy constructor 
  8942. o Destructor 
  8943. o Assignment 
  8944. o Key access 
  8945. o Equality test 
  8946.  
  8947. Key Type 
  8948.  
  8949. Ordering relation 
  8950.  
  8951.  
  8952. ΓòÉΓòÉΓòÉ 3.17.2.2. Sorted Map on B* Key Sorted Set ΓòÉΓòÉΓòÉ
  8953.  
  8954. ISortedMapOnBSTKeySortedSet  <Element, Key>
  8955. IGSortedMapOnBSTKeySortedSet <Element, Key, EKCOps>
  8956.  
  8957. The implementation of the class ISortedMapOnBSTKeySortedSet requires the 
  8958. following element and key functions: 
  8959.  
  8960. Element Type 
  8961.  
  8962. o Default constructor 
  8963. o Copy constructor 
  8964. o Destructor 
  8965. o Assignment 
  8966. o Key access 
  8967. o Equality test 
  8968.  
  8969. Key Type 
  8970.  
  8971. Ordering relation 
  8972.  
  8973.  
  8974. ΓòÉΓòÉΓòÉ 3.17.2.3. Sorted Map on Sorted Linked Sequence ΓòÉΓòÉΓòÉ
  8975.  
  8976. ISortedMapOnSortedLinkedSequence  <Element, Key>
  8977. IGSortedMapOnSortedLinkedSequence <Element, Key, EKCOps>
  8978.  
  8979. The implementation of the class ISortedMapOnSortedLinkedSequence requires the 
  8980. following element and key functions: 
  8981.  
  8982. Element Type 
  8983.  
  8984. o Copy constructor 
  8985. o Destructor 
  8986. o Assignment 
  8987. o Key access 
  8988. o Equality test 
  8989.  
  8990. Key Type 
  8991.  
  8992. Ordering relation 
  8993.  
  8994.  
  8995. ΓòÉΓòÉΓòÉ 3.17.2.4. Sorted Map on Sorted Tabular Sequence ΓòÉΓòÉΓòÉ
  8996.  
  8997. ISortedMapOnSortedTabularSequence  <Element, Key>
  8998. IGSortedMapOnSortedTabularSequence <Element, Key, EKCOps>
  8999.  
  9000. The implementation of the class ISortedMapOnSortedTabularSequence requires the 
  9001. following element and key functions: 
  9002.  
  9003. Element Type 
  9004.  
  9005. o Default constructor 
  9006. o Copy constructor 
  9007. o Destructor 
  9008. o Assignment 
  9009. o Key access 
  9010. o Equality test 
  9011.  
  9012. Key Type 
  9013.  
  9014. Ordering relation 
  9015.  
  9016.  
  9017. ΓòÉΓòÉΓòÉ 3.17.2.5. Sorted Map on Sorted Diluted Sequence ΓòÉΓòÉΓòÉ
  9018.  
  9019. ISortedMapOnSortedDilutedSequence  <Element, Key>
  9020. IGSortedMapOnSortedDilutedSequence <Element, Key, EKCOps>
  9021.  
  9022. The implementation of the class ISortedMapOnSortedDilutedSequence requires the 
  9023. following element and key functions: 
  9024.  
  9025. Element Type 
  9026.  
  9027. o Default constructor 
  9028. o Copy constructor 
  9029. o Destructor 
  9030. o Assignment 
  9031. o Key access 
  9032. o Equality test 
  9033.  
  9034. Key Type 
  9035.  
  9036. Ordering relation 
  9037.  
  9038.  
  9039. ΓòÉΓòÉΓòÉ 3.17.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  9040.  
  9041. For polymorphism, you can use the corresponding abstract class, IASortedMap, 
  9042. which is found in the iasrtmap.h header file, or the corresponding reference 
  9043. class, IRSortedMap, which is found in the irsrtmap.h header file. See 
  9044. Polymorphic Use of Collections for further information. 
  9045.  
  9046.  
  9047. ΓòÉΓòÉΓòÉ 3.17.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  9048.  
  9049. IASortedMap <Element, Key>
  9050. IRSortedMap <Element, Key, ConcreteBase>
  9051.  
  9052. The concrete base class is one of the classes defined above. 
  9053.  
  9054. The required functions are the same as the required functions of the concrete 
  9055. base class. 
  9056.  
  9057.  
  9058. ΓòÉΓòÉΓòÉ 3.17.4. Declarations for Sorted Map ΓòÉΓòÉΓòÉ
  9059.  
  9060. template < class Element, class Key >
  9061. class ISortedMap {
  9062. public:
  9063.   class Cursor : ICursor {
  9064.     Element& element ();
  9065.     void setToLast ();
  9066.     void setToPrevious ();
  9067.     Boolean operator== (Cursor const& cursor);
  9068.     Boolean operator!= (Cursor const& cursor);
  9069.   };
  9070.                   ISortedMap         (INumber numberOfElements = 100);
  9071.                   ISortedMap         (ISortedMap < Element, Key > const&);
  9072.    ISortedMap < Element, Key >&
  9073.                   operator =         (ISortedMap < Element, Key > const&);
  9074.                   ~ISortedMap        ();
  9075.    Boolean        add                (Element const&);
  9076.    Boolean        add                (Element const&, ICursor&);
  9077.    void           addAllFrom         (ISortedMap < Element, Key > const&);
  9078.    Element const& elementAt          (ICursor const&) const;
  9079.    Element&       elementAt          (ICursor const&);
  9080.    Element const& anyElement         () const;
  9081.    void           removeAt           (ICursor const&);
  9082.    INumber        removeAll          (Boolean (*property) (Element const&, void*),
  9083.                                       void* additionalArgument = 0);
  9084.    void           replaceAt          (ICursor const&, Element const&);
  9085.    void           removeAll          ();
  9086.    Boolean        isBounded          () const;
  9087.    INumber        maxNumberOfElements() const;
  9088.    INumber        numberOfElements   () const;
  9089.    Boolean        isEmpty            () const;
  9090.    Boolean        isFull             () const;
  9091.    ICursor*       newCursor          () const;
  9092.    Boolean        setToFirst         (ICursor&) const;
  9093.    Boolean        setToNext          (ICursor&) const;
  9094.    Boolean        allElementsDo      (Boolean (*function) (Element&, void*),
  9095.                                       void* additionalArgument = 0);
  9096.    Boolean        allElementsDo      (IIterator <Element>&);
  9097.    Boolean        allElementsDo      (Boolean (*function) (Element const&, void*),
  9098.                                       void* additionalArgument = 0) const;
  9099.    Boolean        allElementsDo      (IConstantIterator <Element>&) const;
  9100.    Boolean        isConsistent       () const;
  9101.    Boolean        contains           (Element const&) const;
  9102.    Boolean        containsAllFrom    (ISortedMap < Element, Key > const&) const;
  9103.    Boolean        locate             (Element const&, ICursor&) const;
  9104.    Boolean        locateOrAdd        (Element const&);
  9105.    Boolean        locateOrAdd        (Element const&, ICursor&);
  9106.    Boolean        remove             (Element const&);
  9107.    Boolean        operator ==        (ISortedMap < Element, Key > const&) const;
  9108.    Boolean        operator !=        (ISortedMap < Element, Key > const&) const;
  9109.    void           unionWith          (ISortedMap < Element, Key > const&);
  9110.    void           intersectionWith   (ISortedMap < Element, Key > const&);
  9111.    void           differenceWith     (ISortedMap < Element, Key > const&);
  9112.    void           addUnion           (ISortedMap < Element, Key > const&,
  9113.                                       ISortedMap < Element, Key > const&);
  9114.    void           addIntersection    (ISortedMap < Element, Key > const&,
  9115.                                       ISortedMap < Element, Key > const&);
  9116.    void           addDifference      (ISortedMap < Element, Key > const&,
  9117.                                       ISortedMap < Element, Key > const&);
  9118.    Key const&     key                (Element const&) const;
  9119.  
  9120.    Boolean        containsElementWithKey    (Key const&) const;
  9121.    Boolean        containsAllKeysFrom       (ISortedMap
  9122.                                              < Element, Key > const&) const;
  9123.    Boolean        locateElementWithKey      (Key const&, ICursor&) const;
  9124.    Boolean        replaceElementWithKey     (Element const&);
  9125.    Boolean        replaceElementWithKey     (Element const&, ICursor&);
  9126.    Boolean        locateOrAddElementWithKey (Element const&);
  9127.    Boolean        locateOrAddElementWithKey (Element const&, ICursor&);
  9128.    Boolean        addOrReplaceElementWithKey(Element const&);
  9129.    Boolean        addOrReplaceElementWithKey(Element const&, ICursor&);
  9130.    Boolean        removeElementWithKey      (Key const&);
  9131.  
  9132.    Element const& elementWithKey     (Key const&) const;
  9133.    Element&       elementWithKey     (Key const&);
  9134.    void           removeFirst        ();
  9135.    void           removeLast         ();
  9136.    void           removeAtPosition   (IPosition);
  9137.    Element const& firstElement       () const;
  9138.    Element const& lastElement        () const;
  9139.    Element const& elementAtPosition  (IPosition) const;
  9140.    Boolean        setToLast          (ICursor&) const;
  9141.    Boolean        setToPrevious      (ICursor&) const;
  9142.    void           setToPosition      (IPosition, ICursor&) const;
  9143.    Boolean        isFirst            (ICursor const&) const;
  9144.    Boolean        isLast             (ICursor const&) const;
  9145.    long           compare            (ISortedMap < Element, Key > const&,
  9146.                                       long (*comparisonFunction)
  9147.                                          (Element const&,
  9148.                                          Element const&)) const;
  9149. };
  9150.  
  9151.  
  9152. ΓòÉΓòÉΓòÉ 3.17.5. Coding Example for Sorted Map ΓòÉΓòÉΓòÉ
  9153.  
  9154. The following program uses a sorted map and a sorted relation to display sorted 
  9155. lists of the name and size of files contained on a disk. It uses the default 
  9156. classes, ISortedMap and ISortedRelation, to implement the collections. The 
  9157. program uses the sorted map to store the name of the file because all elements 
  9158. in a sorted map are unique and all names on a disk are unique.  It uses a 
  9159. sorted relation for the file size because there may be identical file sizes, 
  9160. and identical values are permissible in sorted relations. 
  9161.  
  9162. The program uses the add function to fill both collections.  To print the 
  9163. collections, it uses the forCursor macro and the allElementsDo function. 
  9164.  
  9165. The program produces a list of files sorted by name (in ascending order) and a 
  9166. list of the same files sorted by file size (in descending order).  Because the 
  9167. output varies depending on the file system in use when it is run, no output is 
  9168. shown here. 
  9169.  
  9170. //  dskusage.C -  An example of using a Sorted Map and a Sorted Relation
  9171.   #include "dsur.h"
  9172.                        // Our own common exit for all errors:
  9173.   void errorExit(int, char*, char* = "");
  9174.  
  9175.                        // Use the default Sorted Map as is:
  9176.   #include <isrtmap.h>
  9177.                        // Use the default Sorted Relation as is:
  9178.   #include <isrtrel.h>
  9179.  
  9180.   int main (int argc, char* argv[])
  9181.   {
  9182.       char* fspec = "dsu.dat"; // Default for input file
  9183.  
  9184.       if (argc > 1)   fspec = argv[1];
  9185.  
  9186.       ifstream  inputfile(fspec);
  9187.       if (!inputfile)
  9188.           errorExit(20, "Unable to open input file", fspec);
  9189.  
  9190.       ISortedMap     <DiskSpaceUR, char*> dsurByName;
  9191.       ISortedMap     <DiskSpaceUR, char*>::Cursor
  9192.                                            curByName(dsurByName);
  9193.  
  9194.       IGSortedRelation <DiskSpaceUR, int, DSURBySpaceOps>
  9195.          dsurBySpace;
  9196.       IGSortedRelation <DiskSpaceUR, int, DSURBySpaceOps>::Cursor
  9197.          curBySpace(dsurBySpace);
  9198.  
  9199.                            // Read all records into dsurByName
  9200.       while (inputfile.good())
  9201.       {
  9202.          DiskSpaceUR dsur(inputfile);
  9203.          if (dsur.isValid())
  9204.          {
  9205.             dsurByName.add(dsur);
  9206.             dsurBySpace.add(dsur);
  9207.          }
  9208.       }
  9209.       if (! inputfile.eof())
  9210.                errorExit(39, "Error during read of", fspec);
  9211.  
  9212.       cout << "\n\nAll Disk Space Usage records "
  9213.            << "sorted (ascending) by name:\n\n";
  9214.  
  9215.       forCursor(curByName)
  9216.          cout << "  " << dsurByName.elementAt(curByName) << "\n";
  9217.  
  9218.       cout << "\n\nAll Disk Space Usage records "
  9219.            << "sorted (descending) by space:\n\n";
  9220.  
  9221.       forCursor(curBySpace)
  9222.          cout << "  " << dsurBySpace.elementAt(curBySpace) << "\n";
  9223.  
  9224.       return 0;
  9225.   }
  9226.  
  9227.   #include <stdlib.h>
  9228.                                       // for exit() definition
  9229.  
  9230.   void errorExit (int rc, char* s1, char* s2)
  9231.   {
  9232.  
  9233.       cerr << s1 << " " << s2 << "\n";
  9234.       exit(rc);
  9235.   }
  9236.  
  9237.  
  9238. ΓòÉΓòÉΓòÉ 3.18. Sorted Relation ΓòÉΓòÉΓòÉ
  9239.  
  9240. A sorted relation is an unordered collection of zero or more elements that have 
  9241. a key.  The elements are sorted by the value of their key.  Element equality is 
  9242. supported and the values of the elements are relevant. 
  9243.  
  9244. The keys of the elements are not unique.  You can add an element whether or not 
  9245. there is already an element in the collection with the same key. 
  9246.  
  9247. Combination of Flat Collection Properties gives an overview of the properties 
  9248. of a sorted relation and its relationship to other flat collections. 
  9249.  
  9250. Note:  All member functions of sorted relation are described under "List of 
  9251. Functions". 
  9252.  
  9253.  
  9254. ΓòÉΓòÉΓòÉ 3.18.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  9255.  
  9256. ISortedRelation, the first class in the table below, is the default 
  9257. implementation variant. If you want to use polymorphism, you can replace the 
  9258. following class implementation variants by the reference class. 
  9259.  
  9260. Note:  In the table, some class names have been hyphenated to fit in their 
  9261. column.  In your code you should not include these hyphens in the class names. 
  9262.  
  9263. Class Name              Header File  Based On
  9264.  
  9265. ISortedRelation         isrtrel.h    KeySortedBag on LinkedSequence
  9266. IGSortedRelation        isrtrel.h    KeySortedBag on LinkedSequence
  9267. ISortedRelationOn-      isrsts.h     KeySortedBag on TabularSequence
  9268.  SortedTabularSequence
  9269. IGSortedRelationOn-     isrsts.h     KeySortedBag on TabularSequence
  9270.  SortedTabularSequence
  9271. ISortedRelationOn-      isrsds.h     KeySortedBag on DilutedSequence
  9272.  SortedDilutedSequence
  9273. IGSortedRelationOn-     isrsds.h     KeySortedBag on DilutedSequence
  9274.  SortedDilutedSequence
  9275.  
  9276.  
  9277. ΓòÉΓòÉΓòÉ 3.18.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  9278.  
  9279. The following implementation variants are defined for sorted relations: 
  9280.  
  9281. o Sorted Relation 
  9282. o Sorted Relation on Sorted Tabular Sequence 
  9283. o Sorted Relation on Sorted Diluted Sequence 
  9284.  
  9285.  
  9286. ΓòÉΓòÉΓòÉ 3.18.2.1. Sorted Relation ΓòÉΓòÉΓòÉ
  9287.  
  9288. ISortedRelation  <Element, Key>
  9289. IGSortedRelation <Element, Key, EKCOps>
  9290.  
  9291. The default implementation of the class ISortedRelation requires the following 
  9292. element and key functions: 
  9293.  
  9294. Element Type 
  9295.  
  9296. o Copy constructor 
  9297. o Destructor 
  9298. o Assignment 
  9299. o Key access 
  9300. o Equality test 
  9301.  
  9302. Key Type 
  9303.  
  9304. Ordering relation 
  9305.  
  9306.  
  9307. ΓòÉΓòÉΓòÉ 3.18.2.2. Sorted Relation on Sorted Tabular Sequence ΓòÉΓòÉΓòÉ
  9308.  
  9309. ISortedRelationOnSortedTabularSequence  <Element, Key>
  9310. IGSortedRelationOnSortedTabularSequence <Element, Key, EKCOps>
  9311.  
  9312. The implementation of ISortedRelationOnSortedTabularSequence requires the 
  9313. following element and key functions: 
  9314.  
  9315. Element Type 
  9316.  
  9317. o Default constructor 
  9318. o Copy constructor 
  9319. o Destructor 
  9320. o Assignment 
  9321. o Key access 
  9322. o Equality test 
  9323.  
  9324. Key Type 
  9325.  
  9326. Ordering relation 
  9327.  
  9328.  
  9329. ΓòÉΓòÉΓòÉ 3.18.2.3. Sorted Relation on Sorted Diluted Sequence ΓòÉΓòÉΓòÉ
  9330.  
  9331. ISortedRelationOnSortedDilutedSequence  <Element, Key>
  9332. IGSortedRelationOnSortedDilutedSequence <Element, Key, EKCOps>
  9333.  
  9334. The implementation of ISortedRelationOnSortedDilutedSequence requires the 
  9335. following element and key functions: 
  9336.  
  9337. Element Type 
  9338.  
  9339. o Default constructor 
  9340. o Copy constructor 
  9341. o Destructor 
  9342. o Assignment 
  9343. o Key access 
  9344. o Equality test 
  9345.  
  9346. Key Type 
  9347.  
  9348. Ordering relation 
  9349.  
  9350.  
  9351. ΓòÉΓòÉΓòÉ 3.18.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  9352.  
  9353. For polymorphism, you can use the corresponding abstract class, 
  9354. IASortedRelation, which is found in the iasrtrel.h header file, or the 
  9355. corresponding reference class, IRSortedRelation, which is found in the 
  9356. irsrtrel.h header file. See Polymorphic Use of Collections for further 
  9357. information. 
  9358.  
  9359.  
  9360. ΓòÉΓòÉΓòÉ 3.18.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  9361.  
  9362. IASortedRelation <Element, Key>
  9363. IRSortedRelation <Element, Key,ConcreteBase>
  9364.  
  9365. The concrete base class is one of the classes defined above. 
  9366.  
  9367. The required functions are the same as the required functions of the concrete 
  9368. base class. 
  9369.  
  9370.  
  9371. ΓòÉΓòÉΓòÉ 3.18.4. Declarations for Sorted Relation ΓòÉΓòÉΓòÉ
  9372.  
  9373. template < class Element, class Key >
  9374. class ISortedRelation {
  9375. public:
  9376.   class Cursor : ICursor {
  9377.     Element& element ();
  9378.     void setToLast ();
  9379.     void setToPrevious ();
  9380.     Boolean operator== (Cursor const& cursor);
  9381.     Boolean operator!= (Cursor const& cursor);
  9382.   };
  9383.                   ISortedRelation    (INumber numberOfElements = 100);
  9384.                   ISortedRelation    (ISortedRelation < Element, Key > const&);
  9385.    ISortedRelation < Element, Key >&
  9386.                   operator =         (ISortedRelation < Element, Key > const&);
  9387.                   ~ISortedRelation   ();
  9388.    Boolean        add                (Element const&);
  9389.    Boolean        add                (Element const&, ICursor&);
  9390.    void           addAllFrom         (ISortedRelation < Element, Key > const&);
  9391.    Element const& elementAt          (ICursor const&) const;
  9392.    Element&       elementAt          (ICursor const&);
  9393.    Element const& anyElement         () const;
  9394.    void           removeAt           (ICursor const&);
  9395.    INumber        removeAll          (Boolean (*property)
  9396.                                       (Element const&, void*),
  9397.                                       void* additionalArgument = 0);
  9398.    void           replaceAt          (ICursor const&, Element const&);
  9399.    void           removeAll          ();
  9400.    Boolean        isBounded          () const;
  9401.    INumber        maxNumberOfElements() const;
  9402.    INumber        numberOfElements   () const;
  9403.    Boolean        isEmpty            () const;
  9404.    Boolean        isFull             () const;
  9405.    ICursor*       newCursor          () const;
  9406.    Boolean        setToFirst         (ICursor&) const;
  9407.    Boolean        setToNext          (ICursor&) const;
  9408.    Boolean        allElementsDo      (Boolean (*function) (Element&, void*),
  9409.                                       void* additionalArgument = 0);
  9410.    Boolean        allElementsDo      (IIterator <Element>&);
  9411.    Boolean        allElementsDo      (Boolean (*function)(Element const&, void*),
  9412.                                       void* additionalArgument = 0) const;
  9413.    Boolean        allElementsDo      (IConstantIterator <Element>&) const;
  9414.    Boolean        isConsistent       () const;
  9415.    Boolean        contains           (Element const&) const;
  9416.    Boolean        containsAllFrom    (ISortedRelation < Element, Key > const&)
  9417.                                      const;
  9418.    Boolean        locate             (Element const&, ICursor&) const;
  9419.    Boolean        locateOrAdd        (Element const&);
  9420.    Boolean        locateOrAdd        (Element const&, ICursor&);
  9421.    Boolean        remove             (Element const&);
  9422.    Boolean        operator ==        (ISortedRelation < Element, Key > const&)
  9423.                                      const;
  9424.    Boolean        operator !=        (ISortedRelation < Element, Key > const&)
  9425.                                      const;
  9426.    void           unionWith          (ISortedRelation < Element, Key > const&);
  9427.    void           intersectionWith   (ISortedRelation < Element, Key > const&);
  9428.    void           differenceWith     (ISortedRelation < Element, Key > const&);
  9429.    void           addUnion           (ISortedRelation < Element, Key > const&,
  9430.                                       ISortedRelation < Element, Key > const&);
  9431.    void           addIntersection    (ISortedRelation < Element, Key > const&,
  9432.                                       ISortedRelation < Element, Key > const&);
  9433.    void           addDifference      (ISortedRelation < Element, Key > const&,
  9434.                                       ISortedRelation < Element, Key > const&);
  9435.    Key const&     key                (Element const&) const;
  9436.  
  9437.    Boolean  containsElementWithKey      (Key const&) const;
  9438.    Boolean  containsAllKeysFrom         (ISortedRelation < Element, Key > const&)
  9439.                                         const;
  9440.    Boolean  locateElementWithKey        (Key const&, ICursor&) const;
  9441.    Boolean  replaceElementWithKey       (Element const&);
  9442.    Boolean  replaceElementWithKey       (Element const&, ICursor&);
  9443.    Boolean  locateOrAddElementWithKey   (Element const&);
  9444.    Boolean  locateOrAddElementWithKey   (Element const&, ICursor&);
  9445.    Boolean  addOrReplaceElementWithKey  (Element const&);
  9446.    Boolean  addOrReplaceElementWithKey  (Element const&, ICursor&);
  9447.    Boolean  removeElementWithKey        (Key const&);
  9448.    Element  const& elementWithKey       (Key const&) const;
  9449.    Element& elementWithKey              (Key const&);
  9450.    INumber  numberOfElementsWithKey     (Key const&) const;
  9451.    Boolean  locateNextElementWithKey    (Key const&, ICursor&) const;
  9452.    INumber  removeAllElementsWithKey    (Key const&);
  9453.    INumber  numberOfDifferentKeys       () const;
  9454.    Boolean  setToNextWithDifferentKey   (ICursor&) const;
  9455.  
  9456.    void           removeFirst        ();
  9457.    void           removeLast         ();
  9458.    void           removeAtPosition   (IPosition);
  9459.    Element const& firstElement       () const;
  9460.    Element const& lastElement        () const;
  9461.    Element const& elementAtPosition  (IPosition) const;
  9462.    Boolean        setToLast          (ICursor&) const;
  9463.    Boolean        setToPrevious      (ICursor&) const;
  9464.    void           setToPosition      (IPosition, ICursor&) const;
  9465.    Boolean        isFirst            (ICursor const&) const;
  9466.    Boolean        isLast             (ICursor const&) const;
  9467.    long           compare            (ISortedRelation < Element, Key > const&,
  9468.                                       long (*comparisonFunction)
  9469.                                       (Element const&, Element const&))
  9470.                                       const;
  9471. };
  9472.  
  9473.  
  9474. ΓòÉΓòÉΓòÉ 3.18.5. Coding Example for Sorted Relation ΓòÉΓòÉΓòÉ
  9475.  
  9476. See Coding Example for Sorted Map for an example of a sorted relation. 
  9477.  
  9478.  
  9479. ΓòÉΓòÉΓòÉ 3.19. Sorted Set ΓòÉΓòÉΓòÉ
  9480.  
  9481. A sorted set is an ordered collection of zero or more elements with element 
  9482. equality but no key.  Only unique elements are supported.  A request to add an 
  9483. element that already exists is ignored. The value of the elements is relevant. 
  9484.  
  9485. The elements of a sorted set are ordered such that the value of each element is 
  9486. less than or equal to the value of its successor. 
  9487.  
  9488. The element with the smallest value currently in a sorted set is called the 
  9489. first element.  The element with the largest value is called the last element. 
  9490. When an element is added, it is placed in the sorted set according to the 
  9491. defined ordering relation. 
  9492.  
  9493. Combination of Flat Collection Properties gives an overview of the properties 
  9494. of a sorted set and its relationship to other flat collections. 
  9495.  
  9496. Note:  All member functions of sorted set are described under "List of 
  9497. Functions". 
  9498.  
  9499.  
  9500. ΓòÉΓòÉΓòÉ 3.19.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  9501.  
  9502. ISortedSet, the first class in the table below, is the default implementation 
  9503. variant. If you want to use polymorphism, you can replace the following class 
  9504. implementation variants by the reference class. 
  9505.  
  9506. Class Name            Header File  Based On
  9507.  
  9508. ISortedSet            isrtset.h    AVL KeySortedSet
  9509. IGSortedSet           isrtset.h    AVL KeySortedSet
  9510. ISortedSetOn-         issbst.h     B* KeySortedSet
  9511.  BSTKeySortedSet
  9512. IGSortedSetOn-        issbst.h     B* KeySortedSet
  9513.  BSTKeySortedSet
  9514. ISortedSetOn-         isssls.h     LinkedSequence
  9515.  SortedLinkedSequence
  9516. IGSortedSetOn-        isssls.h     LinkedSequence
  9517.  SortedLinkedSequence
  9518. ISortedSetOn-         isssts.h     TabularSequence
  9519.  SortedTabularSequence
  9520. IGSortedSetOn-        isssts.h     TabularSequence
  9521.  SortedTabularSequence
  9522. ISortedSetOn-         isssds.h     DilutedSequence
  9523.  SortedDilutedSequence
  9524. IGSortedSetOn-        isssds.h     DilutedSequence
  9525.  SortedDilutedSequence
  9526.  
  9527.  
  9528. ΓòÉΓòÉΓòÉ 3.19.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  9529.  
  9530. The following implementation variants are defined for sorted sets: 
  9531.  
  9532. o Sorted Set 
  9533. o Sorted Set on B* Key Sorted Set 
  9534. o Sorted Set on Sorted Linked Sequence 
  9535. o Sorted Set on Sorted Tabular Sequence 
  9536. o Sorted Set on Sorted Diluted Sequence 
  9537.  
  9538.  
  9539. ΓòÉΓòÉΓòÉ 3.19.2.1. Sorted Set ΓòÉΓòÉΓòÉ
  9540.  
  9541. ISortedSet  <Element>
  9542. IGSortedSet <Element, ECOps>
  9543.  
  9544. The default implementation of the class ISortedSet requires the following 
  9545. element functions: 
  9546.  
  9547. Element Type 
  9548.  
  9549. o Copy constructor 
  9550. o Destructor 
  9551. o Assignment 
  9552. o Equality test 
  9553. o Ordering relation 
  9554.  
  9555.  
  9556. ΓòÉΓòÉΓòÉ 3.19.2.2. Sorted Set on B* Key Sorted Set ΓòÉΓòÉΓòÉ
  9557.  
  9558. ISortedSetOnBSTKeySortedSet  <Element>
  9559. IGSortedSetOnBSTKeySortedSet <Element, ECOps>
  9560.  
  9561. The default implementation of the class ISortedSetOnBSTKeySortedSet requires 
  9562. the following element functions: 
  9563.  
  9564. Element Type 
  9565.  
  9566. o Default constructor 
  9567. o Copy constructor 
  9568. o Destructor 
  9569. o Assignment 
  9570. o Equality test 
  9571. o Ordering relation 
  9572.  
  9573.  
  9574. ΓòÉΓòÉΓòÉ 3.19.2.3. Sorted Set on Sorted Linked Sequence ΓòÉΓòÉΓòÉ
  9575.  
  9576. ISortedSetOnSortedLinkedSequence  <Element>
  9577. IGSortedSetOnSortedLinkedSequence <Element, ECOps>
  9578.  
  9579. The implementation of the class ISortedSetOnSortedLinkedSequence requires the 
  9580. following element functions: 
  9581.  
  9582. Element Type 
  9583.  
  9584. o Copy constructor 
  9585. o Assignment 
  9586. o Destructor 
  9587. o Equality test 
  9588. o Ordering relation 
  9589.  
  9590.  
  9591. ΓòÉΓòÉΓòÉ 3.19.2.4. Sorted Set on Sorted Tabular Sequence ΓòÉΓòÉΓòÉ
  9592.  
  9593. ISortedSetOnSortedTabularSequence  <Element>
  9594. IGSortedSetOnSortedTabularSequence <Element, ECOps>
  9595.  
  9596. The implementation of the class ISortedSetOnSortedTabularSequence requires the 
  9597. following element functions: 
  9598.  
  9599. Element Type 
  9600.  
  9601. o Default constructor 
  9602. o Copy constructor 
  9603. o Destructor 
  9604. o Assignment 
  9605. o Equality test 
  9606. o Ordering relation 
  9607.  
  9608.  
  9609. ΓòÉΓòÉΓòÉ 3.19.2.5. Sorted Set on Sorted Diluted Sequence ΓòÉΓòÉΓòÉ
  9610.  
  9611. ISortedSetOnSortedDilutedSequence  <Element>
  9612. IGSortedSetOnSortedDilutedSequence <Element, ECOps>
  9613.  
  9614. The implementation of the class ISortedSetOnSortedDilutedSequence requires the 
  9615. following element functions: 
  9616.  
  9617. Element Type 
  9618.  
  9619. o Default constructor 
  9620. o Copy constructor 
  9621. o Destructor 
  9622. o Assignment 
  9623. o Equality test 
  9624. o Ordering relation 
  9625.  
  9626.  
  9627. ΓòÉΓòÉΓòÉ 3.19.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  9628.  
  9629. For polymorphism, you can use the corresponding abstract class, IASortedSet, 
  9630. which is found in the iasrtset.h header file, or the corresponding reference 
  9631. class, IRSortedSet, which is found in the irsrtset.h header file. See 
  9632. Polymorphic Use of Collections for further information. 
  9633.  
  9634.  
  9635. ΓòÉΓòÉΓòÉ 3.19.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  9636.  
  9637. IASortedSet <Element>
  9638. IRSortedSet <Element, ConcreteBase>
  9639.  
  9640. The concrete base class is one of the classes defined above. 
  9641.  
  9642. The required functions are the same as the required functions of the concrete 
  9643. base class. 
  9644.  
  9645.  
  9646. ΓòÉΓòÉΓòÉ 3.19.4. Declarations for Sorted Set ΓòÉΓòÉΓòÉ
  9647.  
  9648. template < class Element >
  9649. class ISortedSet {
  9650. public:
  9651.   class Cursor : ICursor {
  9652.     Element& element ();
  9653.     void setToLast ();
  9654.     void setToPrevious ();
  9655.     Boolean operator== (Cursor const& cursor);
  9656.     Boolean operator!= (Cursor const& cursor);
  9657.   };
  9658.                   ISortedSet         (INumber numberOfElements = 100);
  9659.                   ISortedSet         (ISortedSet < Element > const&);
  9660.    ISortedSet < Element >&
  9661.                   operator =         (ISortedSet < Element > const&);
  9662.                   ~ISortedSet        ();
  9663.    Boolean        add                (Element const&);
  9664.    Boolean        add                (Element const&, ICursor&);
  9665.    void           addAllFrom         (ISortedSet < Element > const&);
  9666.    Element const& elementAt          (ICursor const&) const;
  9667.    Element&       elementAt          (ICursor const&);
  9668.    Element const& anyElement         () const;
  9669.    void           removeAt           (ICursor const&);
  9670.    INumber        removeAll          (Boolean (*property)
  9671.                                       (Element const&, void*),
  9672.                                       void* additionalArgument = 0);
  9673.    void           replaceAt          (ICursor const&, Element const&);
  9674.    void           removeAll          ();
  9675.    Boolean        isBounded          () const;
  9676.    INumber        maxNumberOfElements() const;
  9677.    INumber        numberOfElements   () const;
  9678.    Boolean        isEmpty            () const;
  9679.    Boolean        isFull             () const;
  9680.    ICursor*       newCursor          () const;
  9681.    Boolean        setToFirst         (ICursor&) const;
  9682.    Boolean        setToNext          (ICursor&) const;
  9683.    Boolean        allElementsDo      (Boolean (*function) (Element&, void*),
  9684.                                       void* additionalArgument = 0);
  9685.    Boolean        allElementsDo      (IIterator <Element>&);
  9686.    Boolean        allElementsDo      (Boolean (*function)
  9687.                                       (Element const&, void*),
  9688.                                       void* additionalArgument = 0) const;
  9689.    Boolean        allElementsDo      (IConstantIterator <Element>&) const;
  9690.    Boolean        isConsistent       () const;
  9691.    Boolean        contains           (Element const&) const;
  9692.    Boolean        containsAllFrom    (ISortedSet < Element > const&) const;
  9693.    Boolean        locate             (Element const&, ICursor&) const;
  9694.    Boolean        locateOrAdd        (Element const&);
  9695.    Boolean        locateOrAdd        (Element const&, ICursor&);
  9696.    Boolean        remove             (Element const&);
  9697.    Boolean        operator ==        (ISortedSet < Element > const&) const;
  9698.    Boolean        operator !=        (ISortedSet < Element > const&) const;
  9699.    void           unionWith          (ISortedSet < Element > const&);
  9700.    void           intersectionWith   (ISortedSet < Element > const&);
  9701.    void           differenceWith     (ISortedSet < Element > const&);
  9702.    void           addUnion           (ISortedSet < Element > const&,
  9703.                                       ISortedSet < Element > const&);
  9704.    void           addIntersection    (ISortedSet < Element > const&,
  9705.                                       ISortedSet < Element > const&);
  9706.    void           addDifference      (ISortedSet < Element > const&,
  9707.                                       ISortedSet < Element > const&);
  9708.    void           removeFirst        ();
  9709.    void           removeLast         ();
  9710.    void           removeAtPosition   (IPosition);
  9711.    Element const& firstElement       () const;
  9712.    Element const& lastElement        () const;
  9713.    Element const& elementAtPosition  (IPosition) const;
  9714.    Boolean        setToLast          (ICursor&) const;
  9715.    Boolean        setToPrevious      (ICursor&) const;
  9716.    void           setToPosition      (IPosition, ICursor&) const;
  9717.    Boolean        isFirst            (ICursor const&) const;
  9718.    Boolean        isLast             (ICursor const&) const;
  9719.    long           compare            (ISortedSet < Element > const&,
  9720.                                       long (*comparisonFunction)
  9721.                                          (Element const&,
  9722.                                          Element const&)) const;
  9723. };
  9724.  
  9725.  
  9726. ΓòÉΓòÉΓòÉ 3.19.5. Coding Example for Sorted Set ΓòÉΓòÉΓòÉ
  9727.  
  9728. The following program uses the default class, ISortedSet, to create sorted 
  9729. lists of planets with different properties. The program stores all planets in 
  9730. our solar system, all heavy planets in our solar system, all bright planets in 
  9731. our solar system, and all heavy or bright planets in our solar system in a 
  9732. number of sorted sets.  Each set sorts the planets by its distance from the 
  9733. sun. 
  9734.  
  9735. The program uses the forCursor macro to create the heavyPlanets and the 
  9736. brightPlanets collections. It uses the allElementsDo function to display the 
  9737. planets in each collection and the unionWith function when creating the 
  9738. bright-or-heavy planets category. 
  9739.  
  9740. //  planets.C  -  An example of using a Sorted Set
  9741.    #include <iostream.h>
  9742.  
  9743.                      // Let's use the Sorted Set Default Variant:
  9744.    #include <isrtset.h>
  9745.  
  9746.                      // Get Class Planet:
  9747.    #include "planet.h"
  9748.  
  9749.  int main()    {
  9750.    ISortedSet<Planet>  allPlanets, heavyPlanets, brightPlanets;
  9751.                        // A cursor to cursor through allPlanets:
  9752.    ISortedSet<Planet>::Cursor aPCursor(allPlanets);
  9753.  
  9754.    SayPlanetName showPlanet;
  9755.  
  9756.    allPlanets.add( Planet("Earth",   149.60f,   1.0000f, 99.9f));
  9757.    allPlanets.add( Planet("Jupiter", 778.3f,  317.818f,  -2.4f));
  9758.    allPlanets.add( Planet("Mars",    227.9f,    0.1078f, -1.9f));
  9759.    allPlanets.add( Planet("Mercury",  57.91f,   0.0558f, -0.2f));
  9760.    allPlanets.add( Planet("Neptune", 4498.f,    17.216f,  +7.6f));
  9761.    allPlanets.add( Planet("Pluto",  5910.f,     0.18f,  +14.7f));
  9762.    allPlanets.add( Planet("Saturn", 1428.f,    95.112f,  +0.8f));
  9763.    allPlanets.add( Planet("Uranus", 2872.f,    14.517f,  +5.8f));
  9764.    allPlanets.add( Planet("Venus",   108.21f,   0.8148f, -4.1f));
  9765.  
  9766.    forCursor(aPCursor)    {
  9767.       if (allPlanets.elementAt(aPCursor).isHeavy())
  9768.          heavyPlanets.add(allPlanets.elementAt(aPCursor));
  9769.  
  9770.       if (allPlanets.elementAt(aPCursor).isBright())
  9771.          brightPlanets.add(allPlanets.elementAt(aPCursor));
  9772.     }
  9773.  
  9774.     cout << "\n\n" << "All Planets: \n";
  9775.     allPlanets.allElementsDo(showPlanet);
  9776.  
  9777.     cout << "\n\n" << "Heavy Planets: \n";
  9778.     heavyPlanets.allElementsDo(showPlanet);
  9779.  
  9780.     cout << "\n\n" << "Bright Planets: \n";
  9781.     brightPlanets.allElementsDo(showPlanet);
  9782.  
  9783.     cout << "\n\n" << "Bright-or-Heavy Planets: \n";
  9784.     brightPlanets.unionWith(heavyPlanets);
  9785.     brightPlanets.allElementsDo(showPlanet);
  9786.  
  9787.     cout << "\n\nDid you notice that all these Sets are sorted"
  9788.          << " in the same order\n"
  9789.          << " (distance of planet from sun) ? \n";
  9790.  
  9791.     return 0;
  9792.  }
  9793.  
  9794. The program produces the following output: 
  9795.  
  9796.  
  9797.  
  9798. All Planets:
  9799.  Mercury  Venus  Earth  Mars  Jupiter  Saturn  Uranus  Neptune  Pluto
  9800.  
  9801. Heavy Planets:
  9802.  Jupiter  Saturn  Uranus  Neptune
  9803.  
  9804. Bright Planets:
  9805.  Mercury  Venus  Mars  Jupiter
  9806.  
  9807. Bright-or-Heavy Planets:
  9808.  Mercury  Venus  Mars  Jupiter  Saturn  Uranus  Neptune
  9809.  
  9810. Did you notice that all these Sets are sorted in the same order
  9811.  (distance of planet from sun) ?
  9812.  
  9813.  
  9814. ΓòÉΓòÉΓòÉ 3.20. Stack ΓòÉΓòÉΓòÉ
  9815.  
  9816. A stack is a sequence with restricted access.  It is an ordered collection of 
  9817. elements with no key and no element equality.  The elements are arranged so 
  9818. that each collection has a first and a last element, each element except the 
  9819. last has a next element, and each element but the first has a previous element. 
  9820. The type and value of the elements are irrelevant and have no effect on the 
  9821. behavior of the stack. 
  9822.  
  9823. Elements are added to and deleted from the top of the stack.  Consequently, the 
  9824. elements of a stack are in reverse chronological order. 
  9825.  
  9826. A stack is characterized by a last-in, first-out (LIFO) behavior. 
  9827.  
  9828. Note:  All member functions of stack are described under "List of Functions". 
  9829.  
  9830.  
  9831. ΓòÉΓòÉΓòÉ 3.20.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  9832.  
  9833. IStack, the first class in the table below, is the default implementation 
  9834. variant. If you need polymorphism you can replace the following class 
  9835. implementation variants by the reference class. 
  9836.  
  9837. Class Name                 Header File  Based On
  9838.  
  9839. IStack                     istack.h     LinkedSequence
  9840. IGStack                    istack.h     LinkedSequence
  9841. IStackOnTabularSequence    istkts.h     TabularSequence
  9842. IGStackOnTabularSequence   istkts.h     TabularSequence
  9843. IStackOnDilutedSequence    istkds.h     DilutedSequence
  9844. IGStackOnDilutedSequence   istkds.h     DilutedSequence
  9845.  
  9846.  
  9847. ΓòÉΓòÉΓòÉ 3.20.2. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  9848.  
  9849. The following implementation variants are defined for stacks: 
  9850.  
  9851. o Stack 
  9852. o Stack on Tabular Sequence 
  9853. o Stack on Diluted Sequence 
  9854.  
  9855.  
  9856. ΓòÉΓòÉΓòÉ 3.20.2.1. Stack ΓòÉΓòÉΓòÉ
  9857.  
  9858. IStack  <Element>
  9859. IGStack <Element, StdOps>
  9860.  
  9861. The default implementation of the class IStack requires the following element 
  9862. functions: 
  9863.  
  9864. Element Type 
  9865.  
  9866. o Copy constructor 
  9867. o Destructor 
  9868. o Assignment 
  9869.  
  9870.  
  9871. ΓòÉΓòÉΓòÉ 3.20.2.2. Stack on Tabular Sequence ΓòÉΓòÉΓòÉ
  9872.  
  9873. IStackOnTabularSequence  <Element>
  9874. IGStackOnTabularSequence <Element, StdOps>
  9875.  
  9876. The implementation of the class IStackOnTabularSequence requires the following 
  9877. element functions: 
  9878.  
  9879. Element Type 
  9880.  
  9881. o Default constructor 
  9882. o Copy constructor 
  9883. o Destructor 
  9884. o Assignment 
  9885.  
  9886.  
  9887. ΓòÉΓòÉΓòÉ 3.20.2.3. Stack on Diluted Sequence ΓòÉΓòÉΓòÉ
  9888.  
  9889. IStackOnDilutedSequence  <Element>
  9890. IGStackOnDilutedSequence <Element, StdOps>
  9891.  
  9892. The implementation of the class IStackOnDilutedSequence requires the following 
  9893. element functions: 
  9894.  
  9895. Element Type 
  9896.  
  9897. o Default constructor 
  9898. o Copy constructor 
  9899. o Destructor 
  9900. o Assignment 
  9901.  
  9902.  
  9903. ΓòÉΓòÉΓòÉ 3.20.3. Abstract Class and Reference Class ΓòÉΓòÉΓòÉ
  9904.  
  9905. For polymorphism, you can use the corresponding abstract class, IAStack, which 
  9906. is found in the iastack.h header file, or the corresponding reference class, 
  9907. IRStack, which is found in the irstack.h header file. See Polymorphic Use of 
  9908. Collections for further information. 
  9909.  
  9910.  
  9911. ΓòÉΓòÉΓòÉ 3.20.3.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  9912.  
  9913. IRStack <Element, ConcreteBase>
  9914. IAStack <Element>
  9915.  
  9916. The concrete base class is one of the classes defined above. 
  9917.  
  9918. The required functions are the same as the required functions of the concrete 
  9919. base class. 
  9920.  
  9921.  
  9922. ΓòÉΓòÉΓòÉ 3.20.4. Declarations for Stack ΓòÉΓòÉΓòÉ
  9923.  
  9924. template < class Element >
  9925. class IStack  {
  9926. public:
  9927.   class Cursor : ICursor {
  9928.     Element& element                   ();
  9929.     void    setToLast                  ();
  9930.     void    setToPrevious              ();
  9931.     Boolean operator==                 (Cursor const& cursor);
  9932.     Boolean operator!=                 (Cursor const& cursor);
  9933.   };
  9934.             IStack                     (INumber numberOfElements = 100);
  9935.             IStack                     (IStack < Element > const&);
  9936.    IStack < Element >& operator =      (IStack < Element > const&);
  9937.             ~IStack                    ();
  9938.    Boolean  add                        (Element const&);
  9939.    Boolean  add                        (Element const&, ICursor&);
  9940.    void     addAllFrom                 (IStack < Element > const&);
  9941.    Element const& elementAt            (ICursor const&) const;
  9942.    Element const& anyElement           () const;
  9943.    void     removeAll                  ();
  9944.    Boolean  isBounded                  () const;
  9945.    INumber  maxNumberOfElements        () const;
  9946.    INumber  numberOfElements           () const;
  9947.    Boolean  isEmpty                    () const;
  9948.    Boolean  isFull                     () const;
  9949.    ICursor* newCursor                  () const;
  9950.    Boolean  setToFirst                 (ICursor&) const;
  9951.    Boolean  setToNext                  (ICursor&) const;
  9952.    Boolean  allElementsDo              (Boolean (*function)
  9953.                                         (Element const&, void*),
  9954.                                         void* additionalArgument = 0) const;
  9955.    Boolean  allElementsDo              (IConstantIterator <Element>&) const;
  9956.    Boolean  isConsistent               () const;
  9957.    void     removeLast                 ();
  9958.    Element const& firstElement         () const;
  9959.    Element const& lastElement          () const;
  9960.    Element const& elementAtPosition    (IPosition) const;
  9961.    Boolean setToLast                   (ICursor&) const;
  9962.    Boolean setToPrevious               (ICursor&) const;
  9963.    void    setToPosition               (IPosition, ICursor&) const;
  9964.    Boolean isFirst                     (ICursor const&) const;
  9965.    Boolean isLast                      (ICursor const&) const;
  9966.    long    compare                     (IStack < Element > const&,
  9967.                                         long (*comparisonFunction)
  9968.                                            (Element const&,
  9969.                                            Element const&)) const;
  9970.    void    addAsLast                   (Element const&);
  9971.    void    addAsLast                   (Element const&, ICursor&);
  9972.    void    push                        (Element const&);
  9973.    void    push                        (Element const&, ICursor&);
  9974.    void    pop                         ();
  9975.    void    pop                         (Element&);
  9976.    Element const& top                  () const;
  9977. };
  9978.  
  9979.  
  9980. ΓòÉΓòÉΓòÉ 3.20.5. Coding Example for Stack ΓòÉΓòÉΓòÉ
  9981.  
  9982. The following program creates two stacks (Stack1 and Stack2) using the default 
  9983. class, IStack. It adds a number of words to Stack1, removes them from Stack1, 
  9984. adds them to Stack2, and finally removes them from Stack2 so that they can be 
  9985. printed.  We use the push and pop functions for adding and removing elements, 
  9986. respectively. 
  9987.  
  9988. Between these stack operations the stacks are printed.  During printing we do 
  9989. not want to change the stack.  Therefore we use the constant version of the 
  9990. iterator class, IConstantIterator with the allElementsDo function. In the end, 
  9991. the words will print in the same order as they were originally added to Stack1. 
  9992.  
  9993. Because of the nature of the stack class, the program must use the constant 
  9994. iterator class, IConstantIterator, when printing the stacks. It uses the push 
  9995. and pop functions for adding and removing elements, respectively.  The 
  9996. allElementsDo function is used when the collection is printed. 
  9997.  
  9998. // pushpop.C  -  An example of using a Stack
  9999. #include <string.h>
  10000. #include <iostream.h>
  10001.                       // Let's use the default stack: IStack
  10002. #include <istack.h>
  10003.  
  10004. typedef IStack <char*> SimpleStack;
  10005.                       // The stack requires iteration to be const.
  10006. typedef IConstantIterator <char*> StackIterator;
  10007.  
  10008. // Test variables to put into our Stack:
  10009.  
  10010. char *String[9] = { "The", "quick", "brown", "fox",
  10011.    "jumps", "over", "a", "lazy", "dog." };
  10012.  
  10013. // A class to display the contents of our Stack:
  10014. class PrintClass : public StackIterator {
  10015. public:
  10016.    Boolean applyTo(char* const& w)    {
  10017.       cout << w << "\n";
  10018.       return(True);
  10019.       }
  10020. };
  10021.  
  10022. int main() {
  10023.    SimpleStack Stack1, Stack2;
  10024.    char *S;
  10025.    PrintClass Print;
  10026.  
  10027.    int i;
  10028.  
  10029.    for (i = 0; i < 9; i ++) {
  10030.       Stack1.push(String[i]);
  10031.       }
  10032.  
  10033.    cout << "Contents of Stack1:\n";
  10034.    Stack1.allElementsDo(Print);
  10035.    cout << "----------------------------\n";
  10036.  
  10037.    while (!Stack1.isEmpty()) {
  10038.       Stack1.pop(S);             // Pop from stack 1
  10039.       Stack2.push(S);            // Add it on top of stack 2
  10040.       }
  10041.  
  10042.    cout << "Contents of Stack2:\n";
  10043.    Stack2.allElementsDo(Print);
  10044.    cout << "----------------------------\n";
  10045.  
  10046.    while (!Stack2.isEmpty()) {
  10047.       Stack2.pop(S);
  10048.       cout << "Popped from Stack 2: " << S << "\n";
  10049.       }
  10050.    return(0);
  10051. }
  10052.  
  10053. This program produces the following output: 
  10054.  
  10055. Contents of Stack1:
  10056. The
  10057. quick
  10058. brown
  10059. fox
  10060. jumps
  10061. over
  10062. a
  10063. lazy
  10064. dog.
  10065. ----------------------------
  10066. Contents of Stack2:
  10067. dog.
  10068. lazy
  10069. a
  10070. over
  10071. jumps
  10072. fox
  10073. brown
  10074. quick
  10075. The
  10076. ----------------------------
  10077. Popped from Stack 2: The
  10078. Popped from Stack 2: quick
  10079. Popped from Stack 2: brown
  10080. Popped from Stack 2: fox
  10081. Popped from Stack 2: jumps
  10082. Popped from Stack 2: over
  10083. Popped from Stack 2: a
  10084. Popped from Stack 2: lazy
  10085. Popped from Stack 2: dog.
  10086.  
  10087.  
  10088. ΓòÉΓòÉΓòÉ 4. Reference Manual - Tree Classes ΓòÉΓòÉΓòÉ
  10089.  
  10090. This section contains the following chapters: 
  10091.  
  10092. Introduction to Trees Introduces the concept of trees. 
  10093. N-ary Tree     Describes N-ary tree, the tree collection of the Collection 
  10094.                Classes. Defines the class implementation variants, template 
  10095.                arguments and required functions for N-ary tree.  Declarations 
  10096.                for N-ary tree are provided, terms are defined, and the public 
  10097.                member functions of N-ary tree are described. 
  10098.  
  10099.  
  10100. ΓòÉΓòÉΓòÉ 4.1. Introduction to Trees ΓòÉΓòÉΓòÉ
  10101.  
  10102. A tree is a collection of nodes that can have an arbitrary number of references 
  10103. to other nodes.  There can be no cycles or short-circuit references. A unique 
  10104. path connects every two nodes. One node is designated as the root of the tree. 
  10105.  
  10106. Formally, a tree can be defined recursively in the following manner: 
  10107.  
  10108.  1. A single node by itself is a tree.  This node is also the root of the tree. 
  10109.  
  10110.  2. If N is a node and T-1, T-2, ..., T-k are trees with roots R-1, R-2, ..., 
  10111.     R-k, respectively, then a new tree can be constructed by making N the 
  10112.     parent of the nodes R-1, R-2, ..., R-k. In this new tree, N is the root and 
  10113.     T-1, T-2, ..., T-k are the subtrees of the root N.  Nodes R-1, R-2, ..., 
  10114.     R-k are called children of node N. 
  10115.  
  10116. Associated with each node is a data item called element. 
  10117.  
  10118. Nodes without children are called leaves or terminals. The number of children 
  10119. in a node is called the degree of that node. The level of a given node is the 
  10120. number of steps in the path from the root to the given node. The root is at 
  10121. level 0 by definition. The height of a tree is the length of the longest path 
  10122. from the root to any node. 
  10123.  
  10124.  
  10125. ΓòÉΓòÉΓòÉ 4.1.1. Defining the Traversal Order of Tree Elements ΓòÉΓòÉΓòÉ
  10126.  
  10127. You can define the order in which nodes of a tree are traversed by specifying a 
  10128. parameter of type ITreeIterationOrder in calls to the following member 
  10129. functions: 
  10130.  
  10131. o setToFirst 
  10132. o setToLast 
  10133. o setToNext 
  10134. o setToPrevious 
  10135. o allElementsDo, allSubtreeElementsDo 
  10136.  
  10137. These functions are described in N-ary Tree. 
  10138.  
  10139. The ITreeIterationOrder parameter can have one of two values: IPreorder or 
  10140. IPostorder. The effect of each of these values is explained below. 
  10141.  
  10142.  
  10143. ΓòÉΓòÉΓòÉ 4.1.1.1. IPreorder ΓòÉΓòÉΓòÉ
  10144.  
  10145. The search begins at the root of the tree, and continues with the leftmost 
  10146. child of the root.  If the child is the root of a subtree, the search continues 
  10147. with the leftmost child of the subtree, and so on, until a terminal node is 
  10148. detected.  The search continues with all siblings of the terminal node, from 
  10149. left to right.  If any of these siblings is the root of a subtree, the subtree 
  10150. is searched the same way as described above for the tree. 
  10151.  
  10152. The preorder method can be summarized by the following recursive rules: 
  10153.  
  10154.  1. Visit the root. 
  10155.  2. Traverse the subtrees from left to right in preorder. 
  10156.  
  10157.  
  10158. ΓòÉΓòÉΓòÉ 4.1.1.2. IPostorder ΓòÉΓòÉΓòÉ
  10159.  
  10160. The IPostorder method is the opposite of IPreorder.  The search begins with the 
  10161. leftmost terminal node in the tree.  Then that node's siblings are searched 
  10162. from left to right.  If any of these siblings is the root of a subtree, the 
  10163. subtree is searched for its leftmost terminal node. 
  10164.  
  10165. The postorder method can be sumarized by the following recursive rules: 
  10166.  
  10167.  1. Traverse the subtrees from left to right in postorder. 
  10168.  2. Visit the root. 
  10169.  
  10170. The following figure shows a tree with 12 nodes, and the order of traversal for 
  10171. both preorder and postorder methods. Numbers indicate the preorder method (node 
  10172. 1 is searched before node 2) while letters indicate the postorder method (node 
  10173. A is searched before node B). 
  10174.  
  10175. Preorder and Postorder Iteration Methods for Trees 
  10176.  
  10177.              ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  10178.              Γöé1   MΓöé
  10179.              ΓööΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÿ
  10180.          ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  10181.        ΓöîΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ  ΓöîΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ  ΓöîΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ
  10182.        Γöé2   DΓöé  Γöé6   GΓöé  Γöé9   LΓöé
  10183.        ΓööΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÿ  ΓööΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÿ  ΓööΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÿ
  10184.        ΓöîΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ    Γöé      Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  10185.        Γöé3   CΓöé    Γöé    ΓöîΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ  ΓöîΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ  ΓöîΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ
  10186.        ΓööΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÿ    Γöé    Γöé10   HΓöé  Γöé11   JΓöé  Γöé13   KΓöé
  10187.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ    Γöé    ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ  ΓööΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÿ  ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  10188.   Γöé         Γöé    ΓööΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ     Γöé
  10189. ΓöîΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ     ΓöîΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ  ΓöîΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ ΓöîΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ ΓöîΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÉ
  10190. Γöé4   AΓöé     Γöé5   BΓöé  Γöé7   EΓöé Γöé8   FΓöé Γöé12   IΓöé
  10191. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ     ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ  ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  10192.  
  10193.  
  10194. ΓòÉΓòÉΓòÉ 4.2. N-ary Tree ΓòÉΓòÉΓòÉ
  10195.  
  10196. An n-ary tree is a special tree where each node can have up to n children. 
  10197.  
  10198. n must be greater than one.  If n is one, the tree is a list.  If n is zero, 
  10199. the structure loses its meaning. 
  10200.  
  10201.  
  10202. ΓòÉΓòÉΓòÉ 4.2.1. Class Implementation Variants ΓòÉΓòÉΓòÉ
  10203.  
  10204. ITree is the default implementation variant based on tabular tree.  IGTree is 
  10205. the default implementation variant with generic operations class.  Both classes 
  10206. are declared in itree.h. No reference class exists for tree classes. 
  10207.  
  10208.  
  10209. ΓòÉΓòÉΓòÉ 4.2.1.1. Template Arguments and Required Functions ΓòÉΓòÉΓòÉ
  10210.  
  10211. ITree  <Element, numberOfChildren>
  10212. IGTree <Element, StdOps, numberOfChildren>
  10213. The default implementation of ITree requires the following element functions: 
  10214.  
  10215.  
  10216. ΓòÉΓòÉΓòÉ 4.2.1.1.1. Element Type ΓòÉΓòÉΓòÉ
  10217.  
  10218. o Copy constructor 
  10219. o Destructor 
  10220. o Assignment 
  10221.  
  10222. The argument value of numberOfElements specifies the maximum number of children 
  10223. for each node. 
  10224.  
  10225.  
  10226. ΓòÉΓòÉΓòÉ 4.2.2. Declarations for N-ary Tree ΓòÉΓòÉΓòÉ
  10227.  
  10228. template < class Element, class ElementOps, INumber pNumberOfChildren >
  10229. class IGTree {
  10230. public :
  10231.   class Cursor : public ITreeCursor {
  10232.   public:
  10233.     Cursor (IGTree < Element, ElementOps,
  10234.                             pNumberOfChildren > const& collection);
  10235.     Boolean setToRoot ();
  10236.     Boolean setToChild (IPosition);
  10237.     Boolean setToFirstExistingChild ();
  10238.     Boolean setToNextExistingChild ();
  10239.     Boolean setToLastExistingChild ();
  10240.     Boolean setToPreviousExistingChild ();
  10241.     Boolean isValid () const;
  10242.     void    invalidate ();
  10243.     Element const& element      ();
  10244.     Boolean operator== (Cursor const& cursor);
  10245.     Boolean operator!= (Cursor const& cursor);
  10246.   };
  10247.             IGTree    ();
  10248.             IGTree    (IGTree < Element, ElementOps,
  10249.                                 pNumberOfChildren > const&);
  10250.             ~IGTree   ();
  10251.    IGTree < Element, ElementOps, pNumberOfChildren >&
  10252.             operator=        (IGTree < Element, ElementOps,
  10253.                                               pNumberOfChildren > const&);
  10254.    void     copy             (IGTree < Element, ElementOps,
  10255.                                               pNumberOfChildren > const&);
  10256.    void     copySubtree      (IGTree < Element, ElementOps,
  10257.                                               pNumberOfChildren > const&,
  10258.                               ITreeCursor const&);
  10259.    void     addAsRoot        (Element const&);
  10260.    void     addAsChild       (ITreeCursor const&, IPosition, Element const&);
  10261.    void     attachAsRoot     (IGTree < Element, ElementOps,
  10262.                                               pNumberOfChildren >&);
  10263.    void     attachAsChild    (ITreeCursor const&, IPosition,
  10264.                               IGTree < Element, ElementOps,
  10265.                                               pNumberOfChildren >&);
  10266.    void     attachSubtreeAsRoot
  10267.                              (IGTree < Element, ElementOps,
  10268.                                               pNumberOfChildren >&,
  10269.                               ITreeCursor const&);
  10270.    void     attachSubtreeAsChild
  10271.                              (ITreeCursor const&, IPosition,
  10272.                               IGTree < Element, ElementOps,
  10273.                                               pNumberOfChildren >&,
  10274.                               ITreeCursor const&);
  10275.    INumber  removeAll        ();
  10276.    INumber  removeSubtree    (ITreeCursor const&);
  10277.    Element const& elementAt  (ITreeCursor const&) const;
  10278.    Element& elementAt        (ITreeCursor const&);
  10279.    void     replaceAt        (ITreeCursor const&,
  10280.                               Element const&);
  10281.    INumber  numberOfChildren () const;
  10282.    INumber  numberOfElements () const;
  10283.    INumber  numberOfSubtreeElements
  10284.                              (ITreeCursor const&) const;
  10285.    INumber  numberOfLeaves   () const;
  10286.    INumber  numberOfSubtreeLeaves
  10287.                              (ITreeCursor const&) const;
  10288.    Boolean  isEmpty          () const;
  10289.    ITreeCursor* newCursor    () const;
  10290.    Boolean  isRoot           (ITreeCursor const&) const;
  10291.    Boolean  isLeaf           (ITreeCursor const&) const;
  10292.    INumber  position         (ITreeCursor const&) const;
  10293.    Boolean  hasChild         (IPosition, ITreeCursor const&) const;
  10294.    Boolean  setToRoot        (ITreeCursor&) const;
  10295.    Boolean  setToChild       (IPosition, ITreeCursor&) const;
  10296.    Boolean  setToParent      (ITreeCursor&) const;
  10297.    Boolean  setToFirstExistingChild     (ITreeCursor&) const;
  10298.    Boolean  setToNextExistingChild      (ITreeCursor&) const;
  10299.    Boolean  setToLastExistingChild      (ITreeCursor&) const;
  10300.    Boolean  setToPreviousExistingChild  (ITreeCursor&) const;
  10301.    Boolean  setToFirst       (ITreeCursor&, ITreeIterationOrder) const;
  10302.    Boolean  setToNext        (ITreeCursor&, ITreeIterationOrder) const;
  10303.    Boolean  setToLast        (ITreeCursor&, ITreeIterationOrder) const;
  10304.    Boolean  setToPrevious    (ITreeCursor&, ITreeIterationOrder) const;
  10305.    Boolean  allElementsDo    (Boolean (*function) (Element&, void*),
  10306.                               ITreeIterationOrder,
  10307.                               void* additionalArgument = 0);
  10308.    Boolean  allElementsDo    (IIterator <Element>&, ITreeIterationOrder);
  10309.    Boolean  allElementsDo    (Boolean (*function) (Element const&, void*),
  10310.                               ITreeIterationOrder,
  10311.                               void* additionalArgument = 0) const;
  10312.    Boolean  allElementsDo    (IConstantIterator <Element>&,
  10313.                               ITreeIterationOrder) const;
  10314.    Boolean  allSubtreeElementsDo (ITreeCursor const&,
  10315.                                   Boolean (*function) (Element&, void*),
  10316.                                   ITreeIterationOrder,
  10317.                                   void* additionalArgument = 0);
  10318.    Boolean  allSubtreeElementsDo (ITreeCursor const&, IIterator <Element>&,
  10319.                                   ITreeIterationOrder);
  10320.    Boolean  allSubtreeElementsDo (ITreeCursor const&,
  10321.                                   Boolean (*function) (Element const&, void*),
  10322.                                   ITreeIterationOrder,
  10323.                                   void* additionalArgument = 0) const;
  10324.    Boolean  allSubtreeElementsDo (ITreeCursor const&,
  10325.                                   IConstantIterator <Element>&,
  10326.                                   ITreeIterationOrder) const;
  10327. };
  10328.  
  10329.  
  10330. ΓòÉΓòÉΓòÉ 4.2.3. Terms Used ΓòÉΓòÉΓòÉ
  10331.  
  10332. Some of the terms used in this chapter are defined below. You can also use the 
  10333. Glossary to look up terms you are unfamiliar with. 
  10334.  
  10335. this tree           The tree to which a function is applied, in contrast to the 
  10336.                     given tree. 
  10337. given ...           Referring to a tree, element, or function that is given as 
  10338.                     a function argument. 
  10339. returned element    An element returned as a function return value. 
  10340. iteration order     The order in which elements are visited in functions 
  10341.                     allElementsDo, allSubtreeElementsDo, setToNext, and 
  10342.                     setToPrevious. 
  10343.  
  10344.  
  10345. ΓòÉΓòÉΓòÉ 4.2.4. Tree Functions ΓòÉΓòÉΓòÉ
  10346.  
  10347. This section lists the public member functions of n-ary trees. The following 
  10348. member functions are described: 
  10349.  
  10350. Constructor
  10351. Copy Constructor
  10352. Destructor
  10353. operator=
  10354. addAsChild
  10355. addAsRoot
  10356. allElementsDo
  10357. allElementsDo
  10358. allSubtreeElementsDo
  10359. allSubtreeElementsDo
  10360. attachAsChild
  10361. attachSubtreeAsChild
  10362. attachAsRoot
  10363. attachSubtreeAsRoot
  10364. copy
  10365. copySubtree
  10366. elementAt
  10367. hasChild
  10368. isEmpty
  10369. isLeaf
  10370. isRoot
  10371. newCursor
  10372. numberOfChildren
  10373. numberOfElements
  10374. numberOfSubtreeElements
  10375. numberOfLeaves
  10376. numberOfSubtreeLeaves
  10377. position
  10378. removeAll
  10379. removeSubtree
  10380. replaceAt
  10381. setToChild
  10382. setToFirst
  10383. setToFirstExistingChild
  10384. setToLast
  10385. setToLastExistingChild
  10386. setToNext
  10387. setToNextExistingChild
  10388. setToParent
  10389. setToPrevious
  10390. setToPreviousExistingChild
  10391. setToRoot
  10392.  
  10393.  
  10394. ΓòÉΓòÉΓòÉ 4.2.4.1. Constructor ΓòÉΓòÉΓòÉ
  10395.  
  10396. ITree ( ) ;
  10397.  
  10398. Constructs a tree. The tree is initially empty; that is, it contains no node. 
  10399.  
  10400.  
  10401. ΓòÉΓòÉΓòÉ 4.2.4.2. Copy Constructor ΓòÉΓòÉΓòÉ
  10402.  
  10403. ITree (
  10404.    ITree <Element, numberOfChildren> const& tree ) ;
  10405.  
  10406. Constructs a tree by copying all elements from the given tree. 
  10407.  
  10408. Exception 
  10409.  
  10410. IOutOfMemory 
  10411.  
  10412.  
  10413. ΓòÉΓòÉΓòÉ 4.2.4.3. Destructor ΓòÉΓòÉΓòÉ
  10414.  
  10415. ~ITree ( ) ;
  10416.  
  10417. Removes all elements from this tree. 
  10418.  
  10419. Side Effects 
  10420.  
  10421. All cursors of the tree become undefined. 
  10422.  
  10423.  
  10424. ΓòÉΓòÉΓòÉ 4.2.4.4. operator= ΓòÉΓòÉΓòÉ
  10425.  
  10426. ITree <Element, numberOfChildren>& operator= (
  10427.    ITree <Element, numberOfChildren> const& tree ) ;
  10428.  
  10429. Copies all elements of the given tree to this tree. 
  10430.  
  10431. Return Value 
  10432.  
  10433. A reference to this tree. 
  10434.  
  10435. Side Effects 
  10436.  
  10437. All cursors of this tree become undefined. 
  10438.  
  10439. Exception 
  10440.  
  10441. IOutOfMemory 
  10442.  
  10443.  
  10444. ΓòÉΓòÉΓòÉ 4.2.4.5. addAsChild ΓòÉΓòÉΓòÉ
  10445.  
  10446. void addAsChild ( ITreeCursor const& cursor,
  10447.    IPosition position, Element const& element ) ;
  10448.  
  10449. Adds the given element as a child with the given position to the node of this 
  10450. tree denoted by the given cursor. 
  10451.  
  10452. Preconditions 
  10453.  
  10454. o The cursor must point to an element of this tree. 
  10455. o (1 =< position =< numberOfChildren) 
  10456. o The node denoted by the given cursor (of this tree) must not have a child at 
  10457.   the given position. 
  10458.  
  10459. Exceptions 
  10460.  
  10461. o IOutOfMemory 
  10462. o ICursorInvalidException 
  10463. o IPositionInvalidException 
  10464. o IChildAlreadyExistsException 
  10465.  
  10466.  
  10467. ΓòÉΓòÉΓòÉ 4.2.4.6. addAsRoot ΓòÉΓòÉΓòÉ
  10468.  
  10469. void addAsRoot ( Element const& element ) ;
  10470.  
  10471. Adds the given element as root of the tree. 
  10472.  
  10473. Precondition 
  10474.  
  10475. The tree must not have a root; that is, it must be empty. 
  10476.  
  10477. Exceptions 
  10478.  
  10479. o IOutOfMemory 
  10480. o IRootAlreadyExistsException 
  10481.  
  10482.  
  10483. ΓòÉΓòÉΓòÉ 4.2.4.7. allElementsDo, allSubtreeElementsDo ΓòÉΓòÉΓòÉ
  10484.  
  10485. Boolean allElementsDo (
  10486.    Boolean (*function) (Element&, void*),
  10487.    ITreeIterationOrder iterationOrder,
  10488.    void* additionalArgument = 0 ) ;
  10489.  
  10490. Boolean allElementsDo (
  10491.    Boolean (*function) (Element const&, void*),
  10492.    ITreeIterationOrder iterationOrder,
  10493.    void* additionalArgument = 0 ) const;
  10494.  
  10495. Boolean allSubtreeElementsDo ( ITreeCursor const& cursor,
  10496.    Boolean (*function) (Element const&, void*),
  10497.    ITreeIterationOrder iterationOrder,
  10498.    void* additionalArgument = 0 ) const;
  10499.  
  10500. Boolean allSubtreeElementsDo (
  10501.    ITreeCursor const& cursor,
  10502.    Boolean (*function) (Element&, void*),
  10503.    ITreeIterationOrder iterationOrder,
  10504.    void* additionalArgument = 0 ) ;
  10505.  
  10506. Calls the given function for all elements of the subtree denoted by the given 
  10507. cursor (of this tree) until the given function returns False. The elements are 
  10508. visited in the given iteration order. Additional arguments can be passed to the 
  10509. given function using additionalArgument. The additional argument defaults to 
  10510. zero if no additional argument is given. The allElementsDo function (without a 
  10511. subtree cursor argument) iterates over all elements of the tree. 
  10512.  
  10513. Note:  The given function must not remove elements from or add elements to the 
  10514. tree. 
  10515.  
  10516. Return Value 
  10517.  
  10518. Returns True if the given function returns True for every element it is applied 
  10519. to. 
  10520.  
  10521. Preconditions 
  10522.  
  10523. o The cursor must belong to this tree 
  10524. o The cursor must point to an element of this tree 
  10525.  
  10526. Exception 
  10527.  
  10528. IInvalidCursorException 
  10529.  
  10530.  
  10531. ΓòÉΓòÉΓòÉ 4.2.4.8. allElementsDo, allSubtreeElementsDo ΓòÉΓòÉΓòÉ
  10532.  
  10533. Boolean allElementsDo (
  10534.    IIterator <Element>& iterator,
  10535.    ITreeIterationOrder iterationOrder ) ;
  10536.  
  10537. Boolean allElementsDo (
  10538.    IConstantIterator <Element>& iterator,
  10539.    ITreeIterationOrder iterationOrder ) const;
  10540.  
  10541. Boolean allSubtreeElementsDo ( ITreeCursor const& cursor,
  10542.    IIterator <Element>& iterator,
  10543.    ITreeIterationOrder iterationOrder ) ;
  10544.  
  10545. Boolean allSubtreeElementsDo ( ITreeCursor const& cursor,
  10546.    IConstantIterator <Element>& iterator,
  10547.    ITreeIterationOrder iterationOrder ) const;
  10548.  
  10549. Calls the applyTo function of the given iterator for all elements of the 
  10550. subtree denoted by the given cursor (of this tree) until the applyTo function 
  10551. returns False. The elements are visited in the given iteration order. The 
  10552. allElementsDo function (without a subtree cursor argument) iterates over all 
  10553. elements of the tree. 
  10554.  
  10555. Note:  The applyTo function must not remove elements from or add elements to 
  10556. the tree. 
  10557.  
  10558. Preconditions 
  10559.  
  10560. o The cursor must belong to this tree 
  10561. o The cursor must point to an element of this tree 
  10562.  
  10563. Return Value 
  10564.  
  10565. Returns True if the applyTo function returns True for every element it is 
  10566. applied to. 
  10567.  
  10568. Exceptions 
  10569.  
  10570. IInvalidCursorException 
  10571.  
  10572.  
  10573. ΓòÉΓòÉΓòÉ 4.2.4.9. attachAsChild, attachSubtreeAsChild ΓòÉΓòÉΓòÉ
  10574.  
  10575. void attachAsChild ( ITreeCursor const& cursor,
  10576.    IPosition position,
  10577.    ITree <Element, numberOfChildren>& tree ) ;
  10578.  
  10579. void attachSubtreeAsChild ( ITreeCursor const& cursor,
  10580.    IPosition position,
  10581.    ITree <Element, numberOfChildren>& tree,
  10582.    ITreeCursor const& subTreeCursor ) ;
  10583.  
  10584. Copies the subtree denoted by the given subtree cursor as a child with the 
  10585. given position of the node (of this tree) denoted by the given cursor. Removes 
  10586. this subtree from the given tree. The attachAsChild function (without a subtree 
  10587. cursor argument) copies and removes the whole given tree. 
  10588.  
  10589. Note:  These functions are implemented by copying a pointer to the subtree, 
  10590. rather than by copying all elements in the subtree. 
  10591.  
  10592. Preconditions 
  10593.  
  10594. o The cursor must point to an element of this tree. 
  10595. o The subtree cursor must point to an element of the given tree. 
  10596. o (1 =< position =< numberOfChildren) 
  10597. o The node denoted by the given cursor (of this tree) must not have a child at 
  10598.   the given position. 
  10599.  
  10600. Exceptions 
  10601.  
  10602. o ICursorInvalidException 
  10603. o IPositionInvalidException 
  10604. o IChildAlreadyExistsException 
  10605.  
  10606.  
  10607. ΓòÉΓòÉΓòÉ 4.2.4.10. attachAsRoot, attachSubtreeAsRoot ΓòÉΓòÉΓòÉ
  10608.  
  10609. void attachAsRoot (
  10610.    ITree <Element, numberOfChildren>& tree ) ;
  10611.  
  10612. void attachSubtreeAsRoot (
  10613.    ITree <Element, numberOfChildren>& tree,
  10614.    ITreeCursor const& cursor ) ;
  10615.  
  10616. Copies the subtree denoted by the cursor of the given tree to (the root of) 
  10617. this tree, and removes this subtree from the given tree. The attachAsRoot 
  10618. function (without a cursor argument) copies and removes the whole given tree. 
  10619.  
  10620. Note:  These functions are implemented by copying a pointer to the subtree, 
  10621. rather than by copying all elements in the subtree. 
  10622.  
  10623. Preconditions 
  10624.  
  10625. o The cursor must point to an element of this tree. 
  10626. o The tree must not have a root; that is, it must be empty. 
  10627.  
  10628. Exceptions 
  10629.  
  10630. o ICursorInvalidException 
  10631. o IRootAlreadyExistsException 
  10632.  
  10633.  
  10634. ΓòÉΓòÉΓòÉ 4.2.4.11. copy, copySubtree ΓòÉΓòÉΓòÉ
  10635.  
  10636. void copy (
  10637.    (ITree <Element, numberOfChildren> const& tree ) ;
  10638.  
  10639. void copySubtree (
  10640.    ITree <Element, numberOfChildren> const& tree,
  10641.    ITreeCursor const& cursor ) ;
  10642.  
  10643. Removes all elements from this tree, and copies the subtree denoted by the 
  10644. given cursor of the given tree to (the root of) this tree. The copy function 
  10645. (without a cursor argument) copies the whole given tree. 
  10646.  
  10647. Preconditions 
  10648.  
  10649. The cursor must point to an element of the given tree. 
  10650.  
  10651. Exceptions 
  10652.  
  10653. o IOutOfMemory 
  10654. o ICursorInvalidException 
  10655.  
  10656.  
  10657. ΓòÉΓòÉΓòÉ 4.2.4.12. elementAt ΓòÉΓòÉΓòÉ
  10658.  
  10659. Element const& elementAt (
  10660.    ITreeCursor const& cursor ) const;
  10661.  
  10662. Element& elementAt ( ITreeCursor const& cursor ) ;
  10663.  
  10664. Returns a reference to the element pointed to by the given cursor. 
  10665.  
  10666. Precondition 
  10667.  
  10668. The cursor must point to an element of this tree. 
  10669.  
  10670. Exception 
  10671.  
  10672. ICursorInvalidException 
  10673.  
  10674.  
  10675. ΓòÉΓòÉΓòÉ 4.2.4.13. hasChild ΓòÉΓòÉΓòÉ
  10676.  
  10677. Boolean hasChild ( IPosition position,
  10678.    ITreeCursor const& cursor ) const;
  10679.  
  10680. Returns True if the node pointed to by the given cursor has a child at the 
  10681. given position. 
  10682.  
  10683. Preconditions 
  10684.  
  10685. o The cursor must point to an element of this tree. 
  10686. o (1 =< position =< numberOfChildren) 
  10687.  
  10688. Exceptions 
  10689.  
  10690. o ICursorInvalidException 
  10691. o IPositionInvalidException 
  10692.  
  10693.  
  10694. ΓòÉΓòÉΓòÉ 4.2.4.14. isEmpty ΓòÉΓòÉΓòÉ
  10695.  
  10696. Boolean isEmpty ( ) const;
  10697.  
  10698. Returns True if the tree is empty. 
  10699.  
  10700.  
  10701. ΓòÉΓòÉΓòÉ 4.2.4.15. isLeaf ΓòÉΓòÉΓòÉ
  10702.  
  10703. Boolean isLeaf ( ITreeCursor const& cursor ) const;
  10704.  
  10705. Returns True if the node pointed to by the given cursor is a leaf node of the 
  10706. tree; that is, it has no children. 
  10707.  
  10708. Precondition 
  10709.  
  10710. The cursor must point to an element of this tree. 
  10711.  
  10712. Exception 
  10713.  
  10714. ICursorInvalidException 
  10715.  
  10716.  
  10717. ΓòÉΓòÉΓòÉ 4.2.4.16. isRoot ΓòÉΓòÉΓòÉ
  10718.  
  10719. Boolean isRoot ( ITreeCursor const& cursor ) const;
  10720.  
  10721. Returns True if the node pointed to by the given cursor is the root node of the 
  10722. tree. 
  10723.  
  10724. Precondition 
  10725.  
  10726. The cursor must point to an element of this tree. 
  10727.  
  10728. Exception 
  10729.  
  10730. ICursorInvalidException 
  10731.  
  10732.  
  10733. ΓòÉΓòÉΓòÉ 4.2.4.17. newCursor ΓòÉΓòÉΓòÉ
  10734.  
  10735. ITreeCursor* newCursor ( ) const;
  10736.  
  10737. Creates a cursor for the tree. The cursor is initially invalid. 
  10738.  
  10739. Return Value 
  10740.  
  10741. Pointer to the cursor. 
  10742.  
  10743. Exception 
  10744.  
  10745. IOutOfMemory 
  10746.  
  10747.  
  10748. ΓòÉΓòÉΓòÉ 4.2.4.18. numberOfChildren ΓòÉΓòÉΓòÉ
  10749.  
  10750. INumber numberOfChildren ( ) const;
  10751.  
  10752. Returns the number of children a node can possibly have. The actual number of 
  10753. children of any node will always be less than or equal to this number. 
  10754.  
  10755.  
  10756. ΓòÉΓòÉΓòÉ 4.2.4.19. numberOfElements, numberOfSubtreeElements ΓòÉΓòÉΓòÉ
  10757.  
  10758. INumber numberOfElements ( ) const;
  10759.  
  10760. INumber numberOfSubtreeElements (
  10761.    ITreeCursor const& cursor ) const;
  10762.  
  10763. Returns the number of elements that the subtree denoted by the given cursor 
  10764. contains. The subtree root, inner, and leaf nodes are counted. The 
  10765. numberOfElements function (without a cursor argument) counts the number of 
  10766. elements in the whole tree. 
  10767.  
  10768. Preconditions 
  10769.  
  10770. The cursor must belong to the tree and must point to an element in the tree. 
  10771.  
  10772. Exception 
  10773.  
  10774. ICursorInvalidException 
  10775.  
  10776.  
  10777. ΓòÉΓòÉΓòÉ 4.2.4.20. numberOfLeaves, numberOfSubtreeLeaves ΓòÉΓòÉΓòÉ
  10778.  
  10779. INumber numberOfLeaves ( ) const;
  10780.  
  10781. INumber numberOfSubtreeLeaves (
  10782.    ITreeCursor const& cursor ) const;
  10783.  
  10784. Returns the number of leaf elements that the subtree denoted by the given 
  10785. cursor contains. Leaves are nodes that have no children. The numberOfLeaves 
  10786. function (without a cursor argument) counts the number of leaves in the whole 
  10787. tree. 
  10788.  
  10789. Preconditions 
  10790.  
  10791. The cursor must belong to the tree and must point to an element in the tree. 
  10792.  
  10793. Exception 
  10794.  
  10795. ICursorInvalidException 
  10796.  
  10797.  
  10798. ΓòÉΓòÉΓòÉ 4.2.4.21. position ΓòÉΓòÉΓòÉ
  10799.  
  10800. INumber position (
  10801.    ITreeCursor const& cursor ) const;
  10802.  
  10803. Returns the position of the node pointed to by the given cursor as a child with 
  10804. respect to its parent node. The position of the root node is 1. 
  10805.  
  10806. Precondition 
  10807.  
  10808. The cursor must point to an element of this tree. 
  10809.  
  10810. Exception 
  10811.  
  10812. ICursorInvalidException 
  10813.  
  10814.  
  10815. ΓòÉΓòÉΓòÉ 4.2.4.22. removeAll, removeSubtree ΓòÉΓòÉΓòÉ
  10816.  
  10817. void removeAll ( ) ;
  10818.  
  10819. void removeSubtree ( ITreeCursor const& cursor ) ;
  10820.  
  10821. Removes the subtree denoted by the given cursor (of this tree). The removeAll 
  10822. function (without a cursor argument) removes all elements from this tree. 
  10823.  
  10824. Precondition 
  10825.  
  10826. The cursor must point to an element of this tree. 
  10827.  
  10828. Exception 
  10829.  
  10830. ICursorInvalidException 
  10831.  
  10832.  
  10833. ΓòÉΓòÉΓòÉ 4.2.4.23. replaceAt ΓòÉΓòÉΓòÉ
  10834.  
  10835. void replaceAt ( ITreeCursor const& cursor,
  10836.    Element const& element ) ;
  10837.  
  10838. Replaces the element pointed to by the cursor with the given element. 
  10839.  
  10840. Precondition 
  10841.  
  10842. The cursor must point to an element of this tree. 
  10843.  
  10844. Exception 
  10845.  
  10846. ICursorInvalidException 
  10847.  
  10848.  
  10849. ΓòÉΓòÉΓòÉ 4.2.4.24. setToChild ΓòÉΓòÉΓòÉ
  10850.  
  10851. Boolean setToChild ( IPosition position,
  10852.    ITreeCursor& cursor ) const;
  10853.  
  10854. Sets the cursor to the child with the given position of the node denoted by the 
  10855. given cursor (of this tree). Invalidates the cursor if this child does not 
  10856. exist. 
  10857.  
  10858. Preconditions 
  10859.  
  10860. o The cursor must point to an element of this tree 
  10861. o (1 =< position =< numberOfChildren) 
  10862.  
  10863. Return Value 
  10864.  
  10865. Returns True if the child exists. 
  10866.  
  10867. Exceptions 
  10868.  
  10869. o ICursorInvalidException 
  10870. o IPositionInvalidException 
  10871.  
  10872.  
  10873. ΓòÉΓòÉΓòÉ 4.2.4.25. setToFirst ΓòÉΓòÉΓòÉ
  10874.  
  10875. Boolean setToFirst ( ITreeCursor& cursor,
  10876.    ITreeIterationOrder iterationOrder ) const;
  10877.  
  10878. Sets the cursor to the first node in the given iteration order. Invalidates the 
  10879. cursor if the tree is empty. 
  10880.  
  10881. Precondition 
  10882.  
  10883. The cursor must belong to this tree. 
  10884.  
  10885. Return Value 
  10886.  
  10887. Returns True if the tree is not empty. 
  10888.  
  10889. Exception 
  10890.  
  10891. ICursorInvalidException 
  10892.  
  10893.  
  10894. ΓòÉΓòÉΓòÉ 4.2.4.26. setToFirstExistingChild ΓòÉΓòÉΓòÉ
  10895.  
  10896. Boolean setToFirstExistingChild (
  10897.    ITreeCursor& cursor ) const;
  10898.  
  10899. Sets the cursor to the first child of the node denoted by the given cursor (of 
  10900. this tree). Invalidates the cursor if the node has no child (that is, the node 
  10901. denotes a leaf node of this tree). 
  10902.  
  10903. Preconditions 
  10904.  
  10905. The cursor must point to an element of this tree. 
  10906.  
  10907. Return Value 
  10908.  
  10909. Returns True if the node has a child. 
  10910.  
  10911. Exception 
  10912.  
  10913. ICursorInvalidException 
  10914.  
  10915.  
  10916. ΓòÉΓòÉΓòÉ 4.2.4.27. setToLast ΓòÉΓòÉΓòÉ
  10917.  
  10918. Boolean setToLast ( ITreeCursor& cursor,
  10919.    ITreeIterationOrder iterationOrder ) const;
  10920.  
  10921. Sets the cursor to the last node in the given iteration order. Invalidates the 
  10922. cursor if the tree is empty. 
  10923.  
  10924. Precondition 
  10925.  
  10926. The cursor must belong to this tree. 
  10927.  
  10928. Return Value 
  10929.  
  10930. Returns True if the tree is not empty. 
  10931.  
  10932. Exception 
  10933.  
  10934. ICursorInvalidException 
  10935.  
  10936.  
  10937. ΓòÉΓòÉΓòÉ 4.2.4.28. setToLastExistingChild ΓòÉΓòÉΓòÉ
  10938.  
  10939. Boolean setToLastExistingChild (
  10940.    ITreeCursor& cursor ) const;
  10941.  
  10942. Sets the cursor to the last child of the node denoted by the given cursor (of 
  10943. this tree). Invalidates the cursor if the node has no child (that is, the node 
  10944. denotes a leaf node of this tree). 
  10945.  
  10946. Precondition 
  10947.  
  10948. The cursor must point to an element of this tree. 
  10949.  
  10950. Return Value 
  10951.  
  10952. Returns True if the node has a child. 
  10953.  
  10954. Exception 
  10955.  
  10956. ICursorInvalidException 
  10957.  
  10958.  
  10959. ΓòÉΓòÉΓòÉ 4.2.4.29. setToNext ΓòÉΓòÉΓòÉ
  10960.  
  10961. Boolean setToNext ( ITreeCursor& cursor,
  10962.    ITreeIterationOrder iterationOrder ) const;
  10963.  
  10964. Sets the cursor to the next node in the given iteration order. Invalidates the 
  10965. cursor if there is no next node. 
  10966.  
  10967. Precondition 
  10968.  
  10969. The cursor must point to an element of this tree. 
  10970.  
  10971. Return Value 
  10972.  
  10973. Returns True if the given cursor does not point to the last node (in iteration 
  10974. order). 
  10975.  
  10976. Exception 
  10977.  
  10978. ICursorInvalidException 
  10979.  
  10980.  
  10981. ΓòÉΓòÉΓòÉ 4.2.4.30. setToNextExistingChild ΓòÉΓòÉΓòÉ
  10982.  
  10983. Boolean setToNextExistingChild (
  10984.    ITreeCursor& cursor ) const;
  10985.  
  10986. Sets the cursor to the next existing sibling of the node denoted by the given 
  10987. cursor (of this tree). Invalidates the cursor if the node has no next sibling 
  10988. (that is, the node is the last existing child of its parent). 
  10989.  
  10990. Precondition 
  10991.  
  10992. The cursor must point to an element of this tree. 
  10993.  
  10994. Return Value 
  10995.  
  10996. Returns True if the node has a next sibling. 
  10997.  
  10998. Exception 
  10999.  
  11000. ICursorInvalidException 
  11001.  
  11002.  
  11003. ΓòÉΓòÉΓòÉ 4.2.4.31. setToParent ΓòÉΓòÉΓòÉ
  11004.  
  11005. Boolean setToParent ( ITreeCursor& cursor ) const;
  11006.  
  11007. Sets the cursor to the parent of the node denoted by the given cursor (of this 
  11008. tree). Invalidates the cursor if the node has no parent (that is, the node 
  11009. denotes the root node of this tree). 
  11010.  
  11011. Precondition 
  11012.  
  11013. The cursor must point to an element of this tree. 
  11014.  
  11015. Return Value 
  11016.  
  11017. Returns True if the node has a parent. 
  11018.  
  11019. Exception 
  11020.  
  11021. ICursorInvalidException 
  11022.  
  11023.  
  11024. ΓòÉΓòÉΓòÉ 4.2.4.32. setToPrevious ΓòÉΓòÉΓòÉ
  11025.  
  11026. Boolean setToPrevious ( ITreeCursor& cursor,
  11027.    ITreeIterationOrder iterationOrder ) const;
  11028.  
  11029. Sets the cursor to the previous node in the given iteration order. Invalidates 
  11030. the cursor if there is no previous node. 
  11031.  
  11032. Precondition 
  11033.  
  11034. The cursor must point to an element of this tree. 
  11035.  
  11036. Return Value 
  11037.  
  11038. Returns True if the given cursor does not point to the first node (in iteration 
  11039. order). 
  11040.  
  11041. Exception 
  11042.  
  11043. ICursorInvalidException 
  11044.  
  11045.  
  11046. ΓòÉΓòÉΓòÉ 4.2.4.33. setToPreviousExistingChild ΓòÉΓòÉΓòÉ
  11047.  
  11048. Boolean setToPreviousExistingChild (
  11049.    ITreeCursor& cursor ) const;
  11050.  
  11051. Sets the cursor to the previous existing sibling of the node denoted by the 
  11052. given cursor (of this tree). Invalidates the cursor if the node has no previous 
  11053. sibling (that is, the node is the first existing child of its parent). 
  11054.  
  11055. Precondition 
  11056.  
  11057. The cursor must point to an element of this tree. 
  11058.  
  11059. Return Value 
  11060.  
  11061. Returns True if the node has a previous sibling. 
  11062.  
  11063. Exception 
  11064.  
  11065. ICursorInvalidException 
  11066.  
  11067.  
  11068. ΓòÉΓòÉΓòÉ 4.2.4.34. setToRoot ΓòÉΓòÉΓòÉ
  11069.  
  11070. Boolean setToRoot ( ITreeCursor& cursor ) const;
  11071.  
  11072. Sets the cursor to the root node of the tree. Invalidates the cursor if the 
  11073. tree is empty (that is, if no root node exists). 
  11074.  
  11075. Precondition 
  11076.  
  11077. The cursor must belong to this tree. 
  11078.  
  11079. Return Value 
  11080.  
  11081. Returns True if the tree is not empty. 
  11082.  
  11083. Exception 
  11084.  
  11085. ICursorInvalidException 
  11086.  
  11087.  
  11088. ΓòÉΓòÉΓòÉ 5. Reference Manual - Auxiliary Classes ΓòÉΓòÉΓòÉ
  11089.  
  11090. This section contains the following chapters: 
  11091.  
  11092. Cursor         Describes the declarations and public member functions for the 
  11093.                cursor classes. 
  11094. Tree Cursor    Describes the declarations and public member functions for the 
  11095.                tree cursor classes. 
  11096. Iterator and Constant Iterator Classes Describes the declarations and public 
  11097.                member functions for the classes that define the interface for 
  11098.                iterator objects. 
  11099. Pointer and Managed Pointer Classes Describes the declarations and public 
  11100.                member functions for the classes that allow you to access 
  11101.                collection classes through pointers. 
  11102.  
  11103.  
  11104. ΓòÉΓòÉΓòÉ 5.1. Cursor ΓòÉΓòÉΓòÉ
  11105.  
  11106. Each collection class defines its own nested cursor class. All of these classes 
  11107. are derived from the common base class ICursor. This chapter describes the 
  11108. general methods of the ICursor class as well as the specific methods provided 
  11109. for specific collections. Because ICursor is an abstract class, no objects of 
  11110. type ICursor can be declared. ICursor objects can only be obtained by using the 
  11111. collection method newCursor, which returns a pointer to a newly created cursor 
  11112. object. Each cursor instance is associated with a collection instance; cursor 
  11113. functions just call the corresponding function for this collection. For 
  11114. example, cursor.setToFirst() is the same as collection.setToFirst(cursor) , 
  11115. where collection is the instance associated with cursor. 
  11116.  
  11117. See Cursors for more information on cursors. 
  11118.  
  11119.  
  11120. ΓòÉΓòÉΓòÉ 5.1.1. Declarations for Cursor ΓòÉΓòÉΓòÉ
  11121.  
  11122. class ICursor {
  11123. public:
  11124.   virtual        Boolean setToFirst () = 0;
  11125.   virtual        Boolean setToNext  () = 0;
  11126.   virtual        Boolean isValid    () const = 0;
  11127.   virtual        void    invalidate () = 0;
  11128. };
  11129.  
  11130.  
  11131. ΓòÉΓòÉΓòÉ 5.1.2. Public Member Functions for Cursor ΓòÉΓòÉΓòÉ
  11132.  
  11133. The following member functions are described: 
  11134.  
  11135. o Constructor 
  11136. o isValid 
  11137. o invalidate 
  11138. o element 
  11139. o operator!= 
  11140. o operator== 
  11141. o setToFirst 
  11142. o setToLast 
  11143. o setToNext 
  11144. o setToPrevious 
  11145.  
  11146.  
  11147. ΓòÉΓòÉΓòÉ 5.1.2.1. Constructor ΓòÉΓòÉΓòÉ
  11148.  
  11149. ICursor ( Collection const&  ) ;
  11150.  
  11151. Constructs the cursor and associates it with the given collection. The cursor 
  11152. is initially invalid.  The name of the constructor is that of the nested cursor 
  11153. class, not ICursor. 
  11154.  
  11155.  
  11156. ΓòÉΓòÉΓòÉ 5.1.2.2. isValid ΓòÉΓòÉΓòÉ
  11157.  
  11158. Boolean isValid ( ) const;
  11159.  
  11160. Returns True if the cursor points to an element of the associated collection. 
  11161.  
  11162.  
  11163. ΓòÉΓòÉΓòÉ 5.1.2.3. invalidate ΓòÉΓòÉΓòÉ
  11164.  
  11165. void invalidate ( ) ;
  11166.  
  11167. Invalidates the cursor; that is, it no longer points to an element of the 
  11168. associated collection. 
  11169.  
  11170.  
  11171. ΓòÉΓòÉΓòÉ 5.1.2.4. element ΓòÉΓòÉΓòÉ
  11172.  
  11173. Element const& element ( ) const;
  11174.  
  11175. Returns a constant reference to the element of the associated collection to 
  11176. which the cursor points. 
  11177.  
  11178. Precondition 
  11179.  
  11180. The cursor must point to an element of the associated collection. 
  11181.  
  11182. Exception 
  11183.  
  11184. ICursorInvalidException 
  11185.  
  11186.  
  11187. ΓòÉΓòÉΓòÉ 5.1.2.5. operator!= ΓòÉΓòÉΓòÉ
  11188.  
  11189. Boolean operator!= ( Cursor const& cursor ) const;
  11190.  
  11191. Returns True if the cursor does not point to the same element (of the same 
  11192. collection) as the given cursor. 
  11193.  
  11194.  
  11195. ΓòÉΓòÉΓòÉ 5.1.2.6. operator== ΓòÉΓòÉΓòÉ
  11196.  
  11197. Boolean operator== ( Cursor const& cursor ) const;
  11198.  
  11199. Returns True if the cursor points to the same element (of the same collection) 
  11200. as the given cursor. 
  11201.  
  11202.  
  11203. ΓòÉΓòÉΓòÉ 5.1.2.7. setToFirst ΓòÉΓòÉΓòÉ
  11204.  
  11205. Boolean setToFirst ( ) ;
  11206.  
  11207. Sets the cursor to the first element of the associated collection in iteration 
  11208. order. Invalidates the cursor if the collection is empty (if no first element 
  11209. exists). 
  11210.  
  11211. Return Value 
  11212.  
  11213. Returns True if the associated collection is not empty. 
  11214.  
  11215.  
  11216. ΓòÉΓòÉΓòÉ 5.1.2.8. setToLast ΓòÉΓòÉΓòÉ
  11217.  
  11218. Boolean setToLast ( ) ;
  11219.  
  11220. Sets the cursor to the last element of the associated collection in iteration 
  11221. order. Invalidates the cursor if the collection is empty (no last element 
  11222. exists). Returns True if the associated collection was not empty. 
  11223.  
  11224.  
  11225. ΓòÉΓòÉΓòÉ 5.1.2.9. setToNext ΓòÉΓòÉΓòÉ
  11226.  
  11227. Boolean setToNext ( ) ;
  11228.  
  11229. Sets the cursor to the next element in the associated collection in iteration 
  11230. order. Invalidates the cursor if no more elements are left to be visited. 
  11231. Returns True if there was a next element. 
  11232.  
  11233. Precondition 
  11234.  
  11235. The cursor must point to an element of the associated collection. 
  11236.  
  11237. Exception 
  11238.  
  11239. ICursorInvalidException 
  11240.  
  11241.  
  11242. ΓòÉΓòÉΓòÉ 5.1.2.10. setToPrevious ΓòÉΓòÉΓòÉ
  11243.  
  11244. Boolean setToPrevious ( ) ;
  11245.  
  11246. Sets the cursor to the previous element of the associated collection in 
  11247. iteration order. Invalidates the cursor if no such element exists. 
  11248.  
  11249. Return Value 
  11250.  
  11251. Returns True if a previous element exists. 
  11252.  
  11253. Precondition 
  11254.  
  11255. The cursor must point to an element of the associated collection. 
  11256.  
  11257. Exception 
  11258.  
  11259. ICursorInvalidException 
  11260.  
  11261.  
  11262. ΓòÉΓòÉΓòÉ 5.2. Tree Cursor ΓòÉΓòÉΓòÉ
  11263.  
  11264. For n-ary trees, cursors are used to point to nodes in the tree. Unlike cursors 
  11265. of flat collections, tree cursors stay defined when elements are added to the 
  11266. tree, or when elements other than the one pointed to are removed.  Cursors are 
  11267. used in operations to access the element information stored in a node.  They 
  11268. are also used to designate a subtree of the tree, namely the subtree whose root 
  11269. node the cursor points to. 
  11270.  
  11271. As for flat collections, a distinction is made between the abstract base class 
  11272. ITreeCursor, and Cursor classes local to the tree classes themselves.  The 
  11273. local, or nested, cursor classes are derived from the abstract base class. 
  11274.  
  11275.  
  11276. ΓòÉΓòÉΓòÉ 5.2.1. Declarations for Tree Cursor ΓòÉΓòÉΓòÉ
  11277.  
  11278. class ITreeCursor {
  11279. public:
  11280.   virtual Boolean setToRoot                   () = 0;
  11281.   virtual Boolean setToChild                  (IPosition) = 0;
  11282.   virtual Boolean setToParent                 () = 0;
  11283.   virtual Boolean setToFirstExistingChild     () = 0;
  11284.   virtual Boolean setToNextExistingChild      () = 0;
  11285.   virtual Boolean setToLastExistingChild      () = 0;
  11286.   virtual Boolean setToPreviousExistingChild  () = 0;
  11287.   virtual Boolean isValid                     () const = 0;
  11288.   virtual void    invalidate                  () = 0;
  11289. };
  11290.  
  11291.  
  11292. ΓòÉΓòÉΓòÉ 5.2.2. Public Member Functions of Tree Cursor ΓòÉΓòÉΓòÉ
  11293.  
  11294. The following member functions are described: 
  11295.  
  11296. o Constructor 
  11297. o isValid 
  11298. o invalidate 
  11299. o element 
  11300. o operator!= 
  11301. o operator== 
  11302. o setToChild 
  11303. o setToFirstExistingChild 
  11304. o setToLastExistingChild 
  11305. o setToNextExistingChild 
  11306. o setToParent 
  11307. o setToPreviousExistingChild 
  11308. o setToRoot 
  11309.  
  11310.  
  11311. ΓòÉΓòÉΓòÉ 5.2.2.1. Constructor ΓòÉΓòÉΓòÉ
  11312.  
  11313. Cursor ( Tree const& tree ) ;
  11314.  
  11315. Constructs the cursor and associates it with the given tree. The cursor is 
  11316. initially invalid. 
  11317.  
  11318.  
  11319. ΓòÉΓòÉΓòÉ 5.2.2.2. isValid ΓòÉΓòÉΓòÉ
  11320.  
  11321. Boolean isValid ( ) ;
  11322.  
  11323. Returns True if the cursor points to a node of the associated tree. 
  11324.  
  11325.  
  11326. ΓòÉΓòÉΓòÉ 5.2.2.3. invalidate ΓòÉΓòÉΓòÉ
  11327.  
  11328. void invalidate ( ) ;
  11329.  
  11330. Invalidates the cursor so that it no longer points to a node of the associated 
  11331. tree. 
  11332.  
  11333.  
  11334. ΓòÉΓòÉΓòÉ 5.2.2.4. element ΓòÉΓòÉΓòÉ
  11335.  
  11336. Element const& element ( ) ;
  11337.  
  11338. Returns a reference to the element of the associated tree to which the cursor 
  11339. points. 
  11340.  
  11341. Preconditions 
  11342.  
  11343. The cursor must point to a node of the associated tree. 
  11344.  
  11345. Exception 
  11346.  
  11347. ICursorInvalidException 
  11348.  
  11349.  
  11350. ΓòÉΓòÉΓòÉ 5.2.2.5. operator!= ΓòÉΓòÉΓòÉ
  11351.  
  11352. Boolean operator!= ( Cursor const& cursor ) ;
  11353.  
  11354. Returns True if the cursor does not point to the same node of the same tree as 
  11355. the given cursor. 
  11356.  
  11357.  
  11358. ΓòÉΓòÉΓòÉ 5.2.2.6. operator== ΓòÉΓòÉΓòÉ
  11359.  
  11360. Boolean operator== ( Cursor const& cursor ) ;
  11361.  
  11362. Returns True if the cursor points to the same node of the same tree as the 
  11363. given cursor. 
  11364.  
  11365.  
  11366. ΓòÉΓòÉΓòÉ 5.2.2.7. setToChild ΓòÉΓòÉΓòÉ
  11367.  
  11368. Boolean setToChild ( IPosition position ) ;
  11369.  
  11370. Sets the cursor to the child node with the given position. If the child does 
  11371. not exist, the cursor is invalidated. If the child at the given position 
  11372. exists, setToChild returns True. 
  11373.  
  11374. Preconditions 
  11375.  
  11376. o (1 =< position =< numberOfChildren) 
  11377.  
  11378. o The cursor must point to a node of the associated tree. 
  11379.  
  11380. Exceptions 
  11381.  
  11382. o IPositionInvalidException 
  11383.  
  11384. o ICursorInvalidException 
  11385.  
  11386.  
  11387. ΓòÉΓòÉΓòÉ 5.2.2.8. setToFirstExistingChild ΓòÉΓòÉΓòÉ
  11388.  
  11389. Boolean setToFirstExistingChild ( ) ;
  11390.  
  11391. Sets the cursor to the first existing child of the associated tree. If the node 
  11392. pointed to by the cursor has no children (that is, if the node is a leaf) the 
  11393. cursor is invalidated.  If the node pointed to by the cursor has a child, 
  11394. setToFirstExistingChild returns True. 
  11395.  
  11396.  
  11397. ΓòÉΓòÉΓòÉ 5.2.2.9. setToLastExistingChild ΓòÉΓòÉΓòÉ
  11398.  
  11399. Boolean setToLastExistingChild ( ) ;
  11400.  
  11401. Sets the cursor to the last existing child of the associated tree. If the node 
  11402. pointed to by the cursor has no children (that is, if the node is a leaf) the 
  11403. cursor is invalidated. If the node pointed to by the cursor has a child, 
  11404. setToLastExistingChild returns True. 
  11405.  
  11406.  
  11407. ΓòÉΓòÉΓòÉ 5.2.2.10. setToNextExistingChild ΓòÉΓòÉΓòÉ
  11408.  
  11409. Boolean setToNextExistingChild ( ) ;
  11410.  
  11411. Sets the cursor to the next existing sibling of the node to which the cursor 
  11412. points. If the node to which the cursor points is the last child of its parent, 
  11413. no next existing child exists and the cursor is invalidated. 
  11414.  
  11415. Return Value 
  11416.  
  11417. Returns False if a next existing child exists. 
  11418.  
  11419. Preconditions 
  11420.  
  11421. The cursor must point to a node of the associated tree. 
  11422.  
  11423. Exception 
  11424.  
  11425. ICursorInvalidException 
  11426.  
  11427.  
  11428. ΓòÉΓòÉΓòÉ 5.2.2.11. setToParent ΓòÉΓòÉΓòÉ
  11429.  
  11430. Boolean setToParent ( ) ;
  11431.  
  11432. Sets the cursor to the parent of the node pointed to by the cursor. If the 
  11433. cursor points to the root, the node has no parent, and the cursor is 
  11434. invalidated. 
  11435.  
  11436. Return Value 
  11437.  
  11438. Returns True if the node has a parent. 
  11439.  
  11440. Preconditions 
  11441.  
  11442. The cursor must point to a node of the associated tree. 
  11443.  
  11444. Exception 
  11445.  
  11446. ICursorInvalidException 
  11447.  
  11448.  
  11449. ΓòÉΓòÉΓòÉ 5.2.2.12. setToPreviousExistingChild ΓòÉΓòÉΓòÉ
  11450.  
  11451. Boolean setToPreviousExistingChild ( ) ;
  11452.  
  11453. Sets the cursor to the previous existing sibling of the node to which the 
  11454. cursor points. If the node to which the cursor points is the last child of its 
  11455. parent, no more children exist and the cursor is invalidated. 
  11456.  
  11457. Return Value 
  11458.  
  11459. Returns True if there was a previous child. 
  11460.  
  11461. Precondition 
  11462.  
  11463. The cursor must point to a node of the associated tree. 
  11464.  
  11465. Exception 
  11466.  
  11467. ICursorInvalidException 
  11468.  
  11469.  
  11470. ΓòÉΓòÉΓòÉ 5.2.2.13. setToRoot ΓòÉΓòÉΓòÉ
  11471.  
  11472. Boolean setToRoot ( ) ;
  11473.  
  11474. Sets the cursor to the root of the associated tree. If the collection is empty 
  11475. (if no root element exists), the cursor is invalidated.  Otherwise, setToRoot 
  11476. returns True. 
  11477.  
  11478.  
  11479. ΓòÉΓòÉΓòÉ 5.3. Iterator and Constant Iterator Classes ΓòÉΓòÉΓòÉ
  11480.  
  11481. The classes IIterator and IConstantIterator define the interface for iterator 
  11482. objects. The redefinition of the function applyTo defines the actions that are 
  11483. performed with the allElementsDo.  (See allElementsDo.) Iteration is terminated 
  11484. when applyTo returns False. 
  11485.  
  11486. Iteration Using Iterators explains the concepts and usage of iterations. 
  11487.  
  11488.  
  11489. ΓòÉΓòÉΓòÉ 5.3.1. Declarations for Iterator and Constant Iterator ΓòÉΓòÉΓòÉ
  11490.  
  11491. template < class Element >
  11492. class IIterator {
  11493. public:
  11494.   virtual Boolean applyTo (Element&) = 0;
  11495. };
  11496. template < class Element >
  11497. class IConstantIterator {
  11498. public:
  11499.   virtual Boolean applyTo (Element const&) = 0;
  11500. };
  11501.  
  11502.  
  11503. ΓòÉΓòÉΓòÉ 5.4. Pointer and Managed Pointer Classes ΓòÉΓòÉΓòÉ
  11504.  
  11505. These classes are declared in the header file iptr.h. 
  11506.  
  11507. The classes IPtr and IMgPtr implement C++ pointers for which element operations 
  11508. that are used by the collection classes, like element equality or comparison, 
  11509. are evaluated for the dereferenced pointers instead for the pointers 
  11510. themselves. This allows the use of a pointer to E as element type of a 
  11511. collection where E defines what equality or comparison mean. 
  11512.  
  11513. Managed pointers (IMgPtr) implement an automatic storage management mechanism 
  11514. that deletes the referenced object when no more managed pointers refer to it. 
  11515. Managed pointers are implemented using reference counting. 
  11516.  
  11517. Values and Objects and Automatic Storage Management explain the concepts and 
  11518. usage in detail. 
  11519.  
  11520.  
  11521. ΓòÉΓòÉΓòÉ 5.4.1. Declarations for Pointer and Managed Pointer ΓòÉΓòÉΓòÉ
  11522.  
  11523. template < class Element >
  11524. class IPtr {
  11525. public:
  11526.   IPtr                      ();
  11527.   IPtr                      (Element *ptr);
  11528.   Element&   operator *     () const;
  11529.   Element*   operator->     () const;
  11530.   friend inline Element&
  11531.              elementForOps  (IPtr < Element >& ptr);
  11532.   friend inline Element const&
  11533.              elementForOps  (IPtr < Element > const& ptr);
  11534. };
  11535. template < class Element >
  11536. class IMgPtr {
  11537. public:
  11538.   IMgPtr                    ();
  11539.   IMgPtr                    (Element *ptr);
  11540.   IMgPtr                    (Element const& e);
  11541.   IMgPtr                    (IMgPtr < Element > const& ptr);
  11542.   ~IMgPtr                   ();
  11543.   IMgPtr < Element >& operator=
  11544.                             (IMgPtr < Element > const& ptr);
  11545.   Element&   operator *     () const;
  11546.   Element*   operator->     () const;
  11547.   friend inline Element&
  11548.              elementForOps  (IMgPtr < Element >& ptr);
  11549.   friend inline Element const&
  11550.              elementForOps  (IMgPtr < Element > const& ptr);
  11551. };
  11552.  
  11553.  
  11554. ΓòÉΓòÉΓòÉ 5.4.2. Public Member Functions for Pointer and Managed Pointer ΓòÉΓòÉΓòÉ
  11555.  
  11556. The following member functions are described: 
  11557.  
  11558. o Constructor 
  11559. o Constructor 
  11560. o Default Constructor 
  11561. o Destructor 
  11562. o operator* 
  11563. o operator-> 
  11564. o operator= 
  11565.  
  11566.  
  11567. ΓòÉΓòÉΓòÉ 5.4.2.1. Constructor ΓòÉΓòÉΓòÉ
  11568.  
  11569. IPtr (
  11570.    Element* element ) ;
  11571.  
  11572. IMgPtr (
  11573.    Element* element ) ;
  11574.  
  11575. Constructs an IPtr or IMgPtr that refers to the element referred to by the 
  11576. given element pointer. 
  11577.  
  11578.  
  11579. ΓòÉΓòÉΓòÉ 5.4.2.2. Copy Constructor ΓòÉΓòÉΓòÉ
  11580.  
  11581. IMgPtr (
  11582.    Element const& element ) ;
  11583.  
  11584. Constructs an IMgPtr that refers to a new object that is constructed from the 
  11585. given element. 
  11586.  
  11587.  
  11588. ΓòÉΓòÉΓòÉ 5.4.2.3. Default Constructor ΓòÉΓòÉΓòÉ
  11589.  
  11590. IPtr ( ) ;
  11591.  
  11592. IMgPtr ( ) ;
  11593.  
  11594. Construct an IPtr or IMgPtr that refers to no object. 
  11595.  
  11596.  
  11597. ΓòÉΓòÉΓòÉ 5.4.2.4. Destructor ΓòÉΓòÉΓòÉ
  11598.  
  11599. ~IMgPtr ( ) ;
  11600.  
  11601. Deletes the object to which the IMgPtr refers, unless other IMgPtrs refer to 
  11602. this object. 
  11603.  
  11604.  
  11605. ΓòÉΓòÉΓòÉ 5.4.2.5. operator* ΓòÉΓòÉΓòÉ
  11606.  
  11607. Element& operator* ( ) ;
  11608.  
  11609. Returns a reference to the object to which the IPtr or IMgPtr refers. 
  11610.  
  11611.  
  11612. ΓòÉΓòÉΓòÉ 5.4.2.6. operator-> ΓòÉΓòÉΓòÉ
  11613.  
  11614. Element* operator-> ( ) ;
  11615.  
  11616. Returns a pointer to the object to which the IPtr or IMgPtr refers. 
  11617.  
  11618.  
  11619. ΓòÉΓòÉΓòÉ 5.4.2.7. operator= ΓòÉΓòÉΓòÉ
  11620.  
  11621. operator= IMgPtr <Element>& operator= (IMgPtr <Element> const& ptr);
  11622.  
  11623. Assigns the managed pointer to point to the object to which the given IMgPtr 
  11624. refers. 
  11625.  
  11626.  
  11627. ΓòÉΓòÉΓòÉ 6. Reference Manual - Abstract Classes ΓòÉΓòÉΓòÉ
  11628.  
  11629. This part describes the abstract classes of the library. The following classes 
  11630. are described: 
  11631.  
  11632. o Collection 
  11633. o Equality collection 
  11634. o Key collection 
  11635. o Ordered collection 
  11636. o Sorted collection 
  11637. o Sequential collection 
  11638. o Equality key collection 
  11639. o Key sorted collection 
  11640. o Equality sorted collection 
  11641. o Equality key sorted collection 
  11642.  
  11643.  
  11644. ΓòÉΓòÉΓòÉ 6.1. Collection ΓòÉΓòÉΓòÉ
  11645.  
  11646. Because collection is an abstract class, it cannot be used to create any 
  11647. objects. The following abstract classes are derived from collection: 
  11648.  
  11649. o Key collection 
  11650. o Equality collection 
  11651. o Ordered collection 
  11652.  
  11653. The concrete class Heap is defined by collection. 
  11654.  
  11655. The Abstract Class Hierarchy shows the relationship of collection to the class 
  11656. hierarchy. 
  11657.  
  11658. Collection is declared in the header file iacllct.h. 
  11659.  
  11660.  
  11661. ΓòÉΓòÉΓòÉ 6.1.1. Declarations for Collection ΓòÉΓòÉΓòÉ
  11662.  
  11663. template < class Element >
  11664. class IACollection {
  11665. public:
  11666.  
  11667.   virtual                ~IACollection      ();
  11668.   virtual Boolean        add                (Element const&) = 0;
  11669.   virtual Boolean        add                (Element const&, ICursor&) = 0;
  11670.   virtual void           addAllFrom         (IACollection <Element> const&);
  11671.   virtual void           copy               (IACollection <Element> const&);
  11672.   virtual Element const& elementAt          (ICursor const&) const = 0;
  11673.   virtual Element&       elementAt          (ICursor const&) = 0;
  11674.   virtual Element const& anyElement         () const = 0;
  11675.   virtual void           removeAt           (ICursor const&) = 0;
  11676.   virtual INumber        removeAll          (Boolean (*property)
  11677.                                              (Element const&, void*),
  11678.                                              void* additionalArgument = 0) = 0;
  11679.   virtual void           replaceAt          (ICursor const&, Element const&) = 0;
  11680.   virtual void           removeAll          () = 0;
  11681.   virtual Boolean        isBounded          () const = 0;
  11682.   virtual INumber        maxNumberOfElements() const = 0;
  11683.   virtual INumber        numberOfElements   () const = 0;
  11684.   virtual Boolean        isEmpty            () const = 0;
  11685.   virtual Boolean        isFull             () const = 0;
  11686.   virtual ICursor*       newCursor          () const = 0;
  11687.   virtual Boolean        setToFirst         (ICursor&) const = 0;
  11688.   virtual Boolean        setToNext          (ICursor&) const = 0;
  11689.   virtual Boolean        allElementsDo      (Boolean (*function) (Element&, void*),
  11690.                                              void* additionalArgument = 0) = 0;
  11691.   virtual Boolean        allElementsDo      (IIterator <Element>&) = 0;
  11692.   virtual Boolean        allElementsDo      (Boolean (*function)
  11693.                                              (Element const&, void*),
  11694.                                              void* additionalArgument = 0) const = 0;
  11695.   virtual Boolean        allElementsDo      (IConstantIterator <Element>&) const = 0;
  11696.   virtual Boolean        isConsistent       () const = 0;
  11697. };
  11698.  
  11699.  
  11700. ΓòÉΓòÉΓòÉ 6.2. Equality Collection ΓòÉΓòÉΓòÉ
  11701.  
  11702. Because equality collection is an abstract class, it cannot be used to create 
  11703. any objects. The equality collection inherits from collection.  It defines the 
  11704. interfaces for the property of element equality. The following abstract classes 
  11705. are derived from equality collection: 
  11706.  
  11707. o Equality key collection 
  11708. o Equality sorted collection 
  11709.  
  11710. The following concrete classes are defined by equality collection: 
  11711.  
  11712. o Set 
  11713. o Bag 
  11714. o Equality Sequence 
  11715.  
  11716. The Abstract Class Hierarchy shows the relationship of equality collection to 
  11717. the whole class hierarchy. 
  11718.  
  11719. The equality collection class is declared in the header file iaequal.h. 
  11720.  
  11721.  
  11722. ΓòÉΓòÉΓòÉ 6.2.1. Declarations for Equality Collection ΓòÉΓòÉΓòÉ
  11723.  
  11724. template < class Element >
  11725. class IAEqualityCollection : public virtual IACollection < Element > {
  11726. public:
  11727.   virtual Boolean  contains             (Element const&) const = 0;
  11728.   virtual Boolean  containsAllFrom      (IACollection <Element> const&) const;
  11729.   virtual Boolean  locate               (Element const&, ICursor&) const = 0;
  11730.   virtual Boolean  locateOrAdd          (Element const&) = 0;
  11731.   virtual Boolean  locateOrAdd          (Element const&, ICursor&) = 0;
  11732.   virtual Boolean  remove               (Element const&) = 0;
  11733.   virtual INumber  numberOfOccurrences  (Element const&) const = 0;
  11734.   virtual Boolean  locateNext           (Element const&, ICursor&) const = 0;
  11735.   virtual INumber  removeAllOccurrences (Element const&) = 0;
  11736. };
  11737.  
  11738.  
  11739. ΓòÉΓòÉΓòÉ 6.3. Key Collection ΓòÉΓòÉΓòÉ
  11740.  
  11741. Because key collection is an abstract class, it cannot be used to create any 
  11742. objects. The key collection inherits from collection and defines the interfaces 
  11743. for the key property. The following abstract classes are derived from key 
  11744. collection: 
  11745.  
  11746. o Equality key collection 
  11747. o Key sorted collection 
  11748.  
  11749. The following concrete classes are defined by key collection: 
  11750.  
  11751. o Key set 
  11752. o Key bag 
  11753.  
  11754. The Abstract Class Hierarchy shows the relationship of key collection to the 
  11755. class hierarchy. 
  11756.  
  11757. The key collection class is declared in the header file iakey.h. 
  11758.  
  11759.  
  11760. ΓòÉΓòÉΓòÉ 6.3.1. Declarations for Key Collection ΓòÉΓòÉΓòÉ
  11761.  
  11762. template < class Element, class Key >
  11763. class IAKeyCollection : public virtual IACollection < Element > {
  11764. public:
  11765.   virtual Key const&     key                         (Element const&) const = 0;
  11766.   virtual Boolean        containsElementWithKey      (Key const&) const = 0;
  11767.   virtual Boolean        containsAllKeysFrom         (IACollection <Element>
  11768.                                                       const&) const;
  11769.   virtual Boolean        locateElementWithKey        (Key const&, ICursor&)
  11770.                                                       const = 0;
  11771.   virtual Boolean        replaceElementWithKey       (Element const&) = 0;
  11772.   virtual Boolean        replaceElementWithKey       (Element const&,
  11773.                                                       ICursor&) = 0;
  11774.   virtual Boolean        locateOrAddElementWithKey   (Element const&) = 0;
  11775.   virtual Boolean        locateOrAddElementWithKey   (Element const&,
  11776.                                                       ICursor&) = 0;
  11777.   virtual Boolean        addOrReplaceElementWithKey  (Element const&) = 0;
  11778.   virtual Boolean        addOrReplaceElementWithKey  (Element const&,
  11779.                                                       ICursor&) = 0;
  11780.   virtual Boolean        removeElementWithKey        (Key const&) = 0;
  11781.   virtual Element const& elementWithKey              (Key const&) const = 0;
  11782.   virtual Element&       elementWithKey              (Key const&) = 0;
  11783.   virtual INumber        numberOfElementsWithKey     (Key const&) const = 0;
  11784.   virtual Boolean        locateNextElementWithKey    (Key const&,
  11785.                                                       ICursor&) const = 0;
  11786.   virtual INumber        removeAllElementsWithKey    (Key const&) = 0;
  11787.   virtual INumber        numberOfDifferentKeys       () const = 0;
  11788.   virtual Boolean        setToNextWithDifferentKey   (ICursor&) const = 0;
  11789. };
  11790.  
  11791.  
  11792. ΓòÉΓòÉΓòÉ 6.4. Ordered Collection ΓòÉΓòÉΓòÉ
  11793.  
  11794. Because ordered collection is an abstract class, it cannot be used to create 
  11795. any objects. The ordered collection inherits from collection and defines the 
  11796. interfaces for the property of ordered elements. The following abstract classes 
  11797. are derived from ordered collection: 
  11798.  
  11799. o Sorted collection 
  11800. o Sequential collection 
  11801.  
  11802. The Abstract Class Hierarchy shows the relationship of ordered collection to 
  11803. the whole class hierarchy. 
  11804.  
  11805. The ordered collection class is declared in the header file iaorder.h. 
  11806.  
  11807.  
  11808. ΓòÉΓòÉΓòÉ 6.4.1. Declarations for Ordered Collection ΓòÉΓòÉΓòÉ
  11809.  
  11810. template < class Element >
  11811. class IAOrderedCollection : public virtual IACollection < Element > {
  11812. public:
  11813.   virtual void           removeFirst                 () = 0;
  11814.   virtual void           removeLast                  () = 0;
  11815.   virtual void           removeAtPosition            (IPosition) = 0;
  11816.   virtual Element const& firstElement                () const = 0;
  11817.   virtual Element const& lastElement                 () const = 0;
  11818.   virtual Element const& elementAtPosition           (IPosition) const = 0;
  11819.   virtual Boolean        setToLast                   (ICursor&) const = 0;
  11820.   virtual Boolean        setToPrevious               (ICursor&) const = 0;
  11821.   virtual void           setToPosition               (IPosition,
  11822.                                                       ICursor&) const = 0;
  11823.   virtual Boolean        isFirst                     (ICursor const&) const = 0;
  11824.   virtual Boolean        isLast                      (ICursor const&) const = 0;
  11825. };
  11826.  
  11827.  
  11828. ΓòÉΓòÉΓòÉ 6.5. Sorted Collection ΓòÉΓòÉΓòÉ
  11829.  
  11830. Because sorted collection is an abstract class, it cannot be used to create any 
  11831. objects. The sorted collection inherits from ordered collection and defines the 
  11832. interfaces for the properties of sorted elements. The following abstract 
  11833. classes are derived from sorted collection: 
  11834.  
  11835. o Equality sorted collection 
  11836. o Key sorted collection 
  11837.  
  11838. The Abstract Class Hierarchy shows the relationship of sorted collection to the 
  11839. class hierarchy. 
  11840.  
  11841. The sorted collection class is declared in the header file iasrt.h. 
  11842.  
  11843.  
  11844. ΓòÉΓòÉΓòÉ 6.5.1. Declarations for Sorted Collection ΓòÉΓòÉΓòÉ
  11845.  
  11846. template < class Element >
  11847. class IASortedCollection :
  11848.   public virtual IAOrderedCollection < Element > {
  11849. public:
  11850. };
  11851.  
  11852.  
  11853. ΓòÉΓòÉΓòÉ 6.6. Sequential Collection ΓòÉΓòÉΓòÉ
  11854.  
  11855. Because sequential collection is an abstract class, it cannot be used to create 
  11856. any objects. The sequential collection inherits from ordered collection and 
  11857. defines the interfaces for the properties of ordered elements. The following 
  11858. concrete classes are defined by sequential collection: 
  11859.  
  11860. o Sequence 
  11861. o Equality sequence 
  11862.  
  11863. The Abstract Class Hierarchy shows the relationship of sequential collection to 
  11864. the class hierarchy. 
  11865.  
  11866. The sequential collection class is declared in the header file iasqntl.h. 
  11867.  
  11868.  
  11869. ΓòÉΓòÉΓòÉ 6.6.1. Declarations for Sequential Collection ΓòÉΓòÉΓòÉ
  11870.  
  11871. template < class Element >
  11872. class IASequentialCollection :
  11873.   public virtual IAOrderedCollection < Element > {
  11874.  
  11875. public:
  11876.   virtual    void addAsFirst     (Element const&) = 0;
  11877.   virtual    void addAsFirst     (Element const&, ICursor&) = 0;
  11878.   virtual    void addAsLast      (Element const&) = 0;
  11879.   virtual    void addAsLast      (Element const&, ICursor&) = 0;
  11880.   virtual    void addAsNext      (Element const&, ICursor&) = 0;
  11881.   virtual    void addAsPrevious  (Element const&, ICursor&) = 0;
  11882.   virtual    void addAtPosition  (IPosition, Element const&) = 0;
  11883.   virtual    void addAtPosition  (IPosition, Element const&, ICursor&) = 0;
  11884.   virtual    void sort           (long (*comparisonFunction)
  11885.                                  (Element const&, Element const&)) = 0;
  11886. };
  11887.  
  11888.  
  11889. ΓòÉΓòÉΓòÉ 6.7. Equality Key Collection ΓòÉΓòÉΓòÉ
  11890.  
  11891. Because equality key collection is an abstract class, it cannot be used to 
  11892. create any objects. The equality key collection inherits from equality 
  11893. collection, and key collection. It defines the interfaces for the following 
  11894. properties: 
  11895.  
  11896. o Element equality 
  11897. o Key equality 
  11898.  
  11899. The equality key sorted collection abstract class is derived from equality key 
  11900. collection. The following concrete classes are defined by equality key 
  11901. collection: 
  11902.  
  11903. o Map 
  11904. o Relation 
  11905.  
  11906. The Abstract Class Hierarchy shows the relationship of equality key collection 
  11907. to the whole class hierarchy. 
  11908.  
  11909. The equality key collection class is declared in the header file iaeqey.h. 
  11910.  
  11911.  
  11912. ΓòÉΓòÉΓòÉ 6.7.1. Declarations for Equality Key Collection ΓòÉΓòÉΓòÉ
  11913.  
  11914. template < class Element, class Key >
  11915. class IAEqualityKeyCollection :
  11916.   public virtual IAEqualityCollection < Element >,
  11917.   public virtual IAKeyCollection < Element, Key > {
  11918. public:
  11919.  
  11920. };
  11921.  
  11922.  
  11923. ΓòÉΓòÉΓòÉ 6.8. Key Sorted Collection ΓòÉΓòÉΓòÉ
  11924.  
  11925. Because key sorted collection is an abstract class, it cannot be used to create 
  11926. any objects. The key sorted collection inherits from sorted collection and key 
  11927. collection. It defines the interfaces for the following properties: 
  11928.  
  11929. o Key equality 
  11930. o Sorted elements 
  11931.  
  11932. The equality key sorted collection abstract class is derived from key sorted 
  11933. collection. The following concrete classes are defined by key sorted 
  11934. collection: 
  11935.  
  11936. o Key sorted set 
  11937. o Key sorted bag 
  11938.  
  11939. The Abstract Class Hierarchy shows the relationship of key sorted collection to 
  11940. the whole class hierarchy. 
  11941.  
  11942. The key sorted collection class is declared in the header file iaksrt.h. 
  11943.  
  11944.  
  11945. ΓòÉΓòÉΓòÉ 6.8.1. Declarations for Key Sorted Collection ΓòÉΓòÉΓòÉ
  11946.  
  11947. template < class Element, class Key >
  11948. class IAKeySortedCollection :
  11949.   public virtual IASortedCollection < Element >,
  11950.   public virtual IAKeyCollection < Element, Key > {
  11951. public:
  11952. };
  11953.  
  11954.  
  11955. ΓòÉΓòÉΓòÉ 6.9. Equality Sorted Collection ΓòÉΓòÉΓòÉ
  11956.  
  11957. Because equality sorted collection is an abstract class, it cannot be used to 
  11958. create any objects. The equality sorted collection inherits from equality 
  11959. collection and sorted collection. It defines the interfaces for the following 
  11960. properties: 
  11961.  
  11962. o Element equality 
  11963. o Sorted elements 
  11964.  
  11965. The equality key sorted collection abstract class is derived from equality 
  11966. sorted collection. The following concrete classes are defined by equality 
  11967. sorted collection: 
  11968.  
  11969. o Sorted set 
  11970. o Sorted bag 
  11971.  
  11972. The Abstract Class Hierarchy shows the relationship of equality sorted 
  11973. collection to the whole class hierarchy. 
  11974.  
  11975. The equality sorted collection class is declared in the header file iaeqsrt.h. 
  11976.  
  11977.  
  11978. ΓòÉΓòÉΓòÉ 6.9.1. Declarations for Equality Sorted Collection ΓòÉΓòÉΓòÉ
  11979.  
  11980. template < class Element >
  11981. class IAEqualitySortedCollection :
  11982.   public virtual IAEqualityCollection < Element >,
  11983.   public virtual IASortedCollection < Element > {
  11984. public:
  11985. };
  11986.  
  11987.  
  11988. ΓòÉΓòÉΓòÉ 6.10. Equality Key Sorted Collection ΓòÉΓòÉΓòÉ
  11989.  
  11990. Because equality key sorted collection is an abstract class, it cannot be used 
  11991. to create any objects. The equality key sorted collection inherits from 
  11992. equality key collection, key sorted collection, and equality sorted collection. 
  11993. It defines the interfaces for the following properties: 
  11994.  
  11995. o Element equality 
  11996. o Key equality 
  11997. o Sorted elements 
  11998. The following concrete classes are defined by equality key sorted collection: 
  11999.  
  12000. o Sorted map 
  12001. o Sorted relation 
  12002.  
  12003. The Abstract Class Hierarchy shows the relationship of equality key sorted 
  12004. collection to the whole class hierarchy. 
  12005.  
  12006. The equality key sorted collection class is declared in the header file 
  12007. iaeqksrt.h. 
  12008.  
  12009.  
  12010. ΓòÉΓòÉΓòÉ 6.10.1. Declarations for Equality Key Sorted Collection ΓòÉΓòÉΓòÉ
  12011.  
  12012. template < class Element, class Key >
  12013. class IAEqualityKeySortedCollection :
  12014.   public virtual IAEqualityKeyCollection < Element, Key >,
  12015.   public virtual IAEqualitySortedCollection < Element >,
  12016.   public virtual IAKeySortedCollection < Element, Key > {
  12017. public:
  12018. };
  12019.  
  12020.  
  12021. ΓòÉΓòÉΓòÉ 7. Problem Determination ΓòÉΓòÉΓòÉ
  12022.  
  12023. This appendix helps you solve problems that you may encounter when you use the 
  12024. Collection Classes. The following table provides a short summary of each 
  12025. problem, and directs you to a section containing hints for a solution. 
  12026.  
  12027. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  12028. Γöé PROBLEM AREA          Γöé PROBLEM EFFECT                Γöé
  12029. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  12030. Γöé Cursor Usage          Γöé Unexpected results when using cursors    Γöé
  12031. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  12032. Γöé Element Functions and Key    Γöé Error messages indicating a problem in    Γöé
  12033. Γöé Functions            Γöé istdops.h                  Γöé
  12034. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  12035. Γöé Key  Access Function - How to  Γöé Error messages indicating a problem in    Γöé
  12036. Γöé Return the Key (1)       Γöé istdops.h:  a local variable or compiler   Γöé
  12037. Γöé                 Γöé temporary is being used in a return     Γöé
  12038. Γöé                 Γöé expression                  Γöé
  12039. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  12040. Γöé Key  Access Function - How to  Γöé Unexpected results when adding an element  Γöé
  12041. Γöé Return the Key (2)       Γöé to a unique key collection          Γöé
  12042. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  12043. Γöé Definition of Key Functions   Γöé Link step returns error message EDC3013   Γöé
  12044. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  12045. Γöé Exception Tracing        Γöé Unexpected exception tracing output on    Γöé
  12046. Γöé                 Γöé standard error                Γöé
  12047. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  12048. Γöé Declaration of Template Argu-  Γöé Compiler messages (when templates are being Γöé
  12049. Γöé ments and Element Functions   Γöé processed) indicating that an element type  Γöé
  12050. Γöé (1)               Γöé or one of its required element functions is Γöé
  12051. Γöé                 Γöé not declared                 Γöé
  12052. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  12053. Γöé Declaration of Template Argu-  Γöé Compilation errors from symbols being    Γöé
  12054. Γöé ments and Element Functions   Γöé defined multiple times            Γöé
  12055. Γöé (2)               Γöé                       Γöé
  12056. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  12057. Γöé Declaration of Template Argu-  Γöé Link errors from symbols being defined mul- Γöé
  12058. Γöé ments and Element Functions   Γöé tiple times                 Γöé
  12059. Γöé (3)               Γöé                       Γöé
  12060. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  12061. Γöé Default Constructor       Γöé Compiler error messages indicating a     Γöé
  12062. Γöé                 Γöé problem with constructors          Γöé
  12063. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  12064. Γöé Considerations when Linking   Γöé Unresolved external references during    Γöé
  12065. Γöé with Templates         Γöé linking                   Γöé
  12066. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  12067.  
  12068.  
  12069. ΓòÉΓòÉΓòÉ 7.1. Cursor Usage ΓòÉΓòÉΓòÉ
  12070.  
  12071.  
  12072. Effect 
  12073.  
  12074. You get unexpected results when using cursors. For example, the elementAt 
  12075. function fails for the given cursor or returns an unexpected element. 
  12076.  
  12077.  
  12078. Reason 
  12079.  
  12080. You have used an undefined cursor.  Cursors become undefined when an element is 
  12081. added to or removed from the collection. 
  12082.  
  12083.  
  12084. Solution 
  12085.  
  12086. Cursors that become undefined must be rebuilt with an appropriate operation 
  12087. (for example, locateElement) before they are used again.  Rebuilding is 
  12088. especially important for removing all elements with a given property from a 
  12089. collection.  Elements cannot be removed by coding a cursor iteration. Use the 
  12090. removeAll function that takes a predicate function as its argument. 
  12091.  
  12092. For more information about cursors, see Cursors and Removing Elements. 
  12093.  
  12094.  
  12095. ΓòÉΓòÉΓòÉ 7.2. Element Functions and Key Functions ΓòÉΓòÉΓòÉ
  12096.  
  12097.  
  12098. Effect 
  12099.  
  12100. When compiled, your program causes a compiler error indicating a problem in 
  12101. istdops.h.  The following are examples of such errors: 
  12102.  
  12103. Message if key is missing: 
  12104.  
  12105. j:\...\ibmclass\istdops.h(166:1) : (E) EDC3013:
  12106.   "key" is undefined.
  12107. j:\...\ibmclass\istdops.h(160:1) : informational EDC3207:
  12108.   The previous message applies to the definition of template
  12109.   "IStdKeyOps<Parcel,ToyString>::key(const Parcel&) const".
  12110. Message if hash is missing: 
  12111.  
  12112. j:\...\ibmclass\istdops.h(152:1) : (E) EDC3070:
  12113.   Call does not match any argument list for "::hash".
  12114. j:\...\ibmclass\istdops.h(146:1) : informational EDC3207:
  12115.   The previous message applies to the definition of template
  12116.   "IStdHshOps<ToyString>::hash(const ToyString&,unsigned long) const".
  12117. Message if == is missing: 
  12118.  
  12119. j:\...\ibmclass\istdops.h(81:1) : (E) EDC3054:
  12120.   The "==" operator is not allowed between "const ToyString" and
  12121.   "const ToyString".
  12122. j:\...\ibmclass\istdops.h(80:1) : informational EDC3207:
  12123.   The previous message applies to the definition of template
  12124.   "equal(const ToyString&,const ToyString&)".
  12125. Message if < is missing: 
  12126.  
  12127. j:\...\ibmclass\istdops.h(105:1) : (E) EDC3054:
  12128.   The "<" operator is not allowed between "const ToyString"
  12129.   and "const ToString".
  12130. j:\...\ibmclass\istdops.h(103:1) : informational EDC3206:
  12131.   The previous 2 messages apply to the definition of template
  12132.   "compare(const ToyString&,const ToyString&)".
  12133.  
  12134. Reason 
  12135.  
  12136. Compiler error messages indicating a problem in istdops.h are always related to 
  12137. the element and key functions that you must define for your elements. These 
  12138. functions depend on the collection and implementation variant you are using. 
  12139. The compilation errors listed above occur when the key function, the hash 
  12140. function, the operator ==, or the operator < are required for your elements, 
  12141. but are defined with the wrong interface or not defined at all. Whether 
  12142. arguments are defined as const is significant.  Compiler messages do not always 
  12143. point directly to the incorrect function. For example, a compare function with 
  12144. non-const arguments results in the compilation error: 
  12145.  
  12146. The "<" operator is not allowed between "const ..". 
  12147.  
  12148.  
  12149. Solution 
  12150.  
  12151. Verify which element and key functions are required for the implementation 
  12152. variant of the collection you are using. You can find this information for each 
  12153. collection in the section pertaining to the collection under the heading 
  12154. "Template Arguments and Required Functions". 
  12155.  
  12156. For more information about element and key functions, see Element Functions and 
  12157. Key Functions. 
  12158.  
  12159. Note that the same problem may be produced if function declarations and 
  12160. definitions are not properly separated between .h files and .cpp files. This 
  12161. situation is described in detail in Declaration of Template Arguments and 
  12162. Element Functions (1). 
  12163.  
  12164.  
  12165. ΓòÉΓòÉΓòÉ 7.3. Key Access Function - How to Return the Key (1) ΓòÉΓòÉΓòÉ
  12166.  
  12167.  
  12168. Effect 
  12169.  
  12170. You get a compiler warning similar to: 
  12171.  
  12172. Message if key is passed by value: 
  12173.  
  12174. j:\...\ibmclass\istdops.h(166:1) : warning EDC3285:
  12175.   The address of a local variable or compiler temporary is being used
  12176.   in a return expression.
  12177. j:\...\ibmclass\istdops.h(160:1) : informational EDC3207:
  12178.   The previous message applies to the definition of template
  12179.   "IStdKeyOps<Word,int>::key(const Word&) const".
  12180.  
  12181.  
  12182. Reason 
  12183.  
  12184. Compiler error messages indicating a problem in istdops.h are always related to 
  12185. the element and key functions that you must define for your elements. These 
  12186. functions depend on the collection and implementation variant you are using. 
  12187. Your global name space function key returns the key by value instead of by 
  12188. reference. A temporary variable is created for the key within the 
  12189. operator-class function key. The operator class function key returns the key by 
  12190. reference. Returning a reference to a temporary variable causes unpredictable 
  12191. results. 
  12192.  
  12193.  
  12194. Solution 
  12195.  
  12196. Verify that the global name-space function key correctly returns a key const& 
  12197. instead of key. 
  12198.  
  12199. For more information on element and key functions, see Element Functions and 
  12200. Key Functions. 
  12201.  
  12202.  
  12203. ΓòÉΓòÉΓòÉ 7.4. Key Access Function - How to Return the Key (2) ΓòÉΓòÉΓòÉ
  12204.  
  12205.  
  12206. Effect 
  12207.  
  12208. You are adding an element into a unique key collection such as a key set or a 
  12209. map, and you are sure that the collection does not yet contain an element with 
  12210. the same key. Nevertheless, you get unexpected results: 
  12211. IKeyAlreadyExistsException, or the element is not added and the cursor is 
  12212. positioned to a different element. 
  12213.  
  12214.  
  12215. Reason 
  12216.  
  12217. This problem has the same cause as the problem described in Key Access Function 
  12218. - How to Return the Key (1). However, you did not get the warning message 
  12219. described above, because you compiled with a lower warning level. 
  12220.  
  12221.  
  12222. Solution 
  12223.  
  12224. The solution for this problem is the same as described in Key Access Function - 
  12225. How to Return the Key (1). 
  12226.  
  12227.  
  12228. ΓòÉΓòÉΓòÉ 7.5. Definition of Key Functions ΓòÉΓòÉΓòÉ
  12229.  
  12230.  
  12231. Effect 
  12232.  
  12233. You are using a collection class with a key and you get an error message during 
  12234. the link step indicating a problem in istdops.h. The following are examples of 
  12235. such errors: 
  12236.  
  12237. Message if key function is undefined 
  12238.  
  12239. istdops.h(176): (E) EDC3013: "key" function is undefined.
  12240.  
  12241.  
  12242. Reason 
  12243.  
  12244. You are using a collection class that requires the element class to provide a 
  12245. key and you chose to use the method of using a global key function.  You are 
  12246. using collection class methods in a .cpp file but the .h file with the same 
  12247. name as the .cpp file does not contain a declaration (prototype) of the global 
  12248. key function. 
  12249.  
  12250. While compiling the .cpp file, which uses methods of the collection class, the 
  12251. C++ compiler has created or modified a temporary .cpp file in the tempinc 
  12252. directory. During the link step, this .cpp file is compiled in order to resolve 
  12253. references to template code. The error message you encounter refers to this 
  12254. compilation.  The .cpp file in the tempinc directory contains include 
  12255. directives for the collection class template code. It also contains include 
  12256. directives for a .h file of the same name as the .cpp file that uses the 
  12257. collection class methods. The template code in istdops.h requires that the 
  12258. global key function be known at compilation time. The only file that gets 
  12259. included at this time is the .h file with the same name as your .cpp file.  The 
  12260. problem is that the .cpp file is not included at this time, so a definition or 
  12261. declaration of the global key function in this file is not recognized by the 
  12262. compiler. 
  12263.  
  12264.  
  12265. Solution 
  12266.  
  12267. You must declare the global key function in the .h file with the same name as 
  12268. the .cpp file that uses the collection class methods.  The definition of the 
  12269. global key function should be in the .cpp file. If you are not sure which .h 
  12270. file is meant by the message, look in the .cpp file found in the tempinc 
  12271. directory. 
  12272.  
  12273.  
  12274. ΓòÉΓòÉΓòÉ 7.6. Exception Tracing ΓòÉΓòÉΓòÉ
  12275.  
  12276.  
  12277. Effect 
  12278.  
  12279. You get unexpected exception tracing output on standard error even though the 
  12280. related exception causing the output is caught. 
  12281.  
  12282.  
  12283. Reason 
  12284.  
  12285. For each exception raised, the trace function write of class 
  12286. IException::TraceFn is called and writes information about the raised exception 
  12287. to standard error. This trace function write is called whether the related 
  12288. exception is caught or not. 
  12289.  
  12290.  
  12291. Solution 
  12292.  
  12293. To suppress the trace output, provide your own IException::TraceFn write 
  12294. tracing function by subclassing IException::TraceFn and register the subclass 
  12295. with setTraceFunction. 
  12296.  
  12297. For more information about exception tracing, see the User Interface Class 
  12298. Library Reference. 
  12299.  
  12300.  
  12301. ΓòÉΓòÉΓòÉ 7.7. Declaration of Template Arguments and Element Functions (1) ΓòÉΓòÉΓòÉ
  12302.  
  12303.  
  12304. Effect 
  12305.  
  12306. You get compiler messages when processing templates indicating that an element 
  12307. type or one of its required element functions is not declared. 
  12308.  
  12309.  
  12310. Reason 
  12311.  
  12312. The element type or element function is defined locally to the .cpp file that 
  12313. contains the template instantiation with the element type as its argument. The 
  12314. pre-link phase is executed only by using the header files. Therefore, your 
  12315. declaration local to a .cpp file is not recognized and causes these compilation 
  12316. errors. 
  12317.  
  12318.  
  12319. Solution 
  12320.  
  12321. Move the corresponding declarations to a separate header file and include the 
  12322. header file from the .cpp file. 
  12323.  
  12324.  
  12325. ΓòÉΓòÉΓòÉ 7.8. Declaration of Template Arguments and Element Functions (2) ΓòÉΓòÉΓòÉ
  12326.  
  12327.  
  12328. Effect 
  12329.  
  12330. You get compilation errors from symbols being defined multiple times. 
  12331.  
  12332.  
  12333. Reason 
  12334.  
  12335. The template instantiation needs to include the type declarations it received 
  12336. as arguments. Your header files containing type declarations used in template 
  12337. classes may automatically be included several times. 
  12338.  
  12339.  
  12340. Solution 
  12341.  
  12342. Protect your header files against multiple inclusion by using the following 
  12343. preprocessor macros at the beginning and end of your header files: 
  12344.  
  12345. #ifndef _MYHEADER_H_
  12346. #define _MYHEADER_H_ 1
  12347.    .
  12348.    .
  12349.    .
  12350. #endif
  12351.  
  12352. Where _MYHEADER_H_ is a string, unique to each header file, representing the 
  12353. header file's name. 
  12354.  
  12355.  
  12356. ΓòÉΓòÉΓòÉ 7.9. Declaration of Template Arguments and Element Functions (3) ΓòÉΓòÉΓòÉ
  12357.  
  12358.  
  12359. Effect 
  12360.  
  12361. You get link errors from symbols being defined multiple times. 
  12362.  
  12363.  
  12364. Reason 
  12365.  
  12366. The template instantiation needs to include the type declarations it received 
  12367. as arguments. Your header files containing type declarations used in template 
  12368. classes might automatically be included several times. 
  12369.  
  12370.  
  12371. Solution 
  12372.  
  12373. Verify that you did not define functions in the header files that declare types 
  12374. used in templates. If you did, you must move them from the header file into a 
  12375. separate .cpp file or make them inline. 
  12376.  
  12377.  
  12378. ΓòÉΓòÉΓòÉ 7.10. Default Constructor ΓòÉΓòÉΓòÉ
  12379.  
  12380.  
  12381. Effect 
  12382.  
  12383. You get a compiler error similar to the following: 
  12384.  
  12385. Message for missing default constructor: 
  12386.  
  12387. itbseq.h(25:1) : (E) EDC3222:
  12388. "IGTabularSequence<ToyString,IStdOps<ToyString> >::Node" needs a
  12389. constructor because class member "ivElement" needs a constructor
  12390. initializer.
  12391. Names namesOfExtinct(animals.numberOfDifferentKeys());
  12392. ANIMALS.C(55:57) : informational EDC3207:
  12393. The previous message applies to the definition of template
  12394.  "ITabularSequence<ToyString>".
  12395.  
  12396.  
  12397. Reason 
  12398.  
  12399. Compiler error messages indicating a problem with constructors for a collection 
  12400. are typically related to the constructors defined for your element. Here the 
  12401. default constructor for the element is missing. 
  12402.  
  12403.  
  12404. Solution 
  12405.  
  12406. Define the default constructor for the element class. 
  12407.  
  12408. For more information about element and key functions see Element Functions and 
  12409. Key Functions. The element and key functions required for each collection are 
  12410. listed for each collection type in sections entitled "Template Arguments and 
  12411. Required Functions". 
  12412.  
  12413.  
  12414. ΓòÉΓòÉΓòÉ 7.11. Considerations when Linking with Templates ΓòÉΓòÉΓòÉ
  12415.  
  12416.  
  12417. Effect 
  12418.  
  12419. You get unresolved external references during linking that refer to symbols you 
  12420. cannot explain. 
  12421.  
  12422.  
  12423. Reason 
  12424.  
  12425. A possible reason for unresolved external references during linking is that 
  12426. template code cannot be correctly resolved. 
  12427.  
  12428.  
  12429. Solution 
  12430.  
  12431.  1. Use ICC for linking. ICC knows it has to process templates, LINK386 does 
  12432.     not. 
  12433.  
  12434.  2. Use the -Tdp for linking. This tells ICC it is processing C++ code that 
  12435.     might have templates, so ICC may have to process these templates. 
  12436.  
  12437.  
  12438. ΓòÉΓòÉΓòÉ 8. Glossary ΓòÉΓòÉΓòÉ
  12439.  
  12440.  
  12441. ΓòÉΓòÉΓòÉ 8.1. abstract class ΓòÉΓòÉΓòÉ
  12442.  
  12443. abstract class 
  12444.  
  12445. A class that allows polymorphism.  There can be no objects of an abstract 
  12446. class; they are only used to derive new classes. 
  12447.  
  12448.  
  12449. ΓòÉΓòÉΓòÉ 8.2. abstract data type ΓòÉΓòÉΓòÉ
  12450.  
  12451. abstract data type 
  12452.  
  12453. A mathematical model that includes a structure for storing data and operations 
  12454. that can be performed on that data. Common abstract data types include sets, 
  12455. trees, and heaps. 
  12456.  
  12457.  
  12458. ΓòÉΓòÉΓòÉ 8.3. array implementation ΓòÉΓòÉΓòÉ
  12459.  
  12460. array implementation 
  12461.  
  12462. Implementation of an abstract data type using an array. Also called a tabular 
  12463. implementation. 
  12464.  
  12465.  
  12466. ΓòÉΓòÉΓòÉ 8.4. automatic storage management ΓòÉΓòÉΓòÉ
  12467.  
  12468. automatic storage management 
  12469.  
  12470. The process that automatically allocates and deallocates objects in order to 
  12471. use memory efficiently. 
  12472.  
  12473.  
  12474. ΓòÉΓòÉΓòÉ 8.5. auxiliary classes ΓòÉΓòÉΓòÉ
  12475.  
  12476. auxiliary classes 
  12477.  
  12478. Classes that support other classes. The auxiliary classes include classes for 
  12479. cursors, pointers and iterators. 
  12480.  
  12481.  
  12482. ΓòÉΓòÉΓòÉ 8.6. AVL tree ΓòÉΓòÉΓòÉ
  12483.  
  12484. AVL tree 
  12485.  
  12486. A balanced binary search tree that does not allow the height of two siblings to 
  12487. differ by more than one. 
  12488.  
  12489.  
  12490. ΓòÉΓòÉΓòÉ 8.7. bag ΓòÉΓòÉΓòÉ
  12491.  
  12492. bag 
  12493.  
  12494. An unordered flat collection that allows duplicate elements and has element 
  12495. equality. 
  12496.  
  12497.  
  12498. ΓòÉΓòÉΓòÉ 8.8. base class ΓòÉΓòÉΓòÉ
  12499.  
  12500. base class 
  12501.  
  12502. A class from which other classes are derived. 
  12503.  
  12504.  
  12505. ΓòÉΓòÉΓòÉ 8.9. based on ΓòÉΓòÉΓòÉ
  12506.  
  12507. based on 
  12508.  
  12509. The use of existing classes for implementing new classes. 
  12510.  
  12511.  
  12512. ΓòÉΓòÉΓòÉ 8.10. bounded collection ΓòÉΓòÉΓòÉ
  12513.  
  12514. bounded collection 
  12515.  
  12516. A collection that has an upper limit on the number of elements it can contain. 
  12517.  
  12518.  
  12519. ΓòÉΓòÉΓòÉ 8.11. B*-tree (B star tree) ΓòÉΓòÉΓòÉ
  12520.  
  12521. B*-tree (B star tree) 
  12522.  
  12523. A tree in which only the leaves contain whole elements.  All other nodes 
  12524. contain keys. 
  12525.  
  12526.  
  12527. ΓòÉΓòÉΓòÉ 8.12. child ΓòÉΓòÉΓòÉ
  12528.  
  12529. child 
  12530.  
  12531. A node that is subordinate to another node in a tree structure. Only the root 
  12532. node is not a child. 
  12533.  
  12534.  
  12535. ΓòÉΓòÉΓòÉ 8.13. class ΓòÉΓòÉΓòÉ
  12536.  
  12537. class 
  12538.  
  12539. A user-defined data type that contains both data representations and functions. 
  12540.  
  12541.  
  12542. ΓòÉΓòÉΓòÉ 8.14. class template ΓòÉΓòÉΓòÉ
  12543.  
  12544. class template 
  12545.  
  12546. A blueprint describing how a set of related classes can be constructed. 
  12547.  
  12548.  
  12549. ΓòÉΓòÉΓòÉ 8.15. collection ΓòÉΓòÉΓòÉ
  12550.  
  12551. collection 
  12552.  
  12553.  1. An abstract class without any ordering, element properties, or key 
  12554.     properties. All abstract classes are derived from collection. 
  12555.  
  12556.  2. In a general sense, an implementation of an abstract data type for storing 
  12557.     elements. 
  12558.  
  12559.  
  12560. ΓòÉΓòÉΓòÉ 8.16. concrete class ΓòÉΓòÉΓòÉ
  12561.  
  12562. concrete class 
  12563.  
  12564. A class that implements an abstract data type but does not allow polymorphism. 
  12565.  
  12566.  
  12567. ΓòÉΓòÉΓòÉ 8.17. constructor ΓòÉΓòÉΓòÉ
  12568.  
  12569. constructor 
  12570.  
  12571. A member function that is used to construct class objects.  The constructor 
  12572. function has the same name as the class. 
  12573.  
  12574.  
  12575. ΓòÉΓòÉΓòÉ 8.18. containment function ΓòÉΓòÉΓòÉ
  12576.  
  12577. containment function 
  12578.  
  12579. A function that determines whether a collection contains a given element. 
  12580.  
  12581.  
  12582. ΓòÉΓòÉΓòÉ 8.19. copy constructor ΓòÉΓòÉΓòÉ
  12583.  
  12584. copy constructor 
  12585.  
  12586. A constructor that copies a class object of the same class type. 
  12587.  
  12588.  
  12589. ΓòÉΓòÉΓòÉ 8.20. cursor ΓòÉΓòÉΓòÉ
  12590.  
  12591. cursor 
  12592.  
  12593. A reference to an element at a specific position in a data structure. 
  12594.  
  12595.  
  12596. ΓòÉΓòÉΓòÉ 8.21. cursor iteration ΓòÉΓòÉΓòÉ
  12597.  
  12598. cursor iteration 
  12599.  
  12600. The process of repeatedly moving the cursor to the next element in a collection 
  12601. until some condition is satisfied. 
  12602.  
  12603.  
  12604. ΓòÉΓòÉΓòÉ 8.22. data member ΓòÉΓòÉΓòÉ
  12605.  
  12606. data member 
  12607.  
  12608. The smallest possible piece of complete data.  Elements are composed of data 
  12609. members. 
  12610.  
  12611.  
  12612. ΓòÉΓòÉΓòÉ 8.23. data structure ΓòÉΓòÉΓòÉ
  12613.  
  12614. data structure 
  12615.  
  12616. The internal data representation of an implementation. 
  12617.  
  12618.  
  12619. ΓòÉΓòÉΓòÉ 8.24. data type ΓòÉΓòÉΓòÉ
  12620.  
  12621. data type 
  12622.  
  12623. A category that specifies the interpretation of a data object such as its 
  12624. mathematical qualities and internal representation. 
  12625.  
  12626.  
  12627. ΓòÉΓòÉΓòÉ 8.25. default class ΓòÉΓòÉΓòÉ
  12628.  
  12629. default class 
  12630.  
  12631. A class with preprogrammed definitions that can be used for simple 
  12632. implementations. 
  12633.  
  12634.  
  12635. ΓòÉΓòÉΓòÉ 8.26. default constructor ΓòÉΓòÉΓòÉ
  12636.  
  12637. default constructor 
  12638.  
  12639. A constructor that takes no arguments, or, if it takes arguments, all its 
  12640. arguments have default values. 
  12641.  
  12642.  
  12643. ΓòÉΓòÉΓòÉ 8.27. default implementation ΓòÉΓòÉΓòÉ
  12644.  
  12645. default implementation 
  12646.  
  12647. One of several possible implementation variants offered as the default for a 
  12648. specific abstract data type. 
  12649.  
  12650.  
  12651. ΓòÉΓòÉΓòÉ 8.28. default operation class ΓòÉΓòÉΓòÉ
  12652.  
  12653. default operation class 
  12654.  
  12655. A class with preprogrammed definitions for all required element and key 
  12656. operations for a particular implementation. 
  12657.  
  12658.  
  12659. ΓòÉΓòÉΓòÉ 8.29. degree ΓòÉΓòÉΓòÉ
  12660.  
  12661. degree 
  12662.  
  12663. The number of children of a node. 
  12664.  
  12665.  
  12666. ΓòÉΓòÉΓòÉ 8.30. deque ΓòÉΓòÉΓòÉ
  12667.  
  12668. deque 
  12669.  
  12670. A queue that can have elements added and removed at both ends. A double-ended 
  12671. queue. 
  12672.  
  12673.  
  12674. ΓòÉΓòÉΓòÉ 8.31. dequeue ΓòÉΓòÉΓòÉ
  12675.  
  12676. dequeue 
  12677.  
  12678. An operation that removes the first element of a queue. 
  12679.  
  12680.  
  12681. ΓòÉΓòÉΓòÉ 8.32. derived class ΓòÉΓòÉΓòÉ
  12682.  
  12683. derived class 
  12684.  
  12685. A class that inherits the properties of a base class.  A derived has the data 
  12686. members and member functions of the base class but new data and operations can 
  12687. be defined. 
  12688.  
  12689.  
  12690. ΓòÉΓòÉΓòÉ 8.33. destructor ΓòÉΓòÉΓòÉ
  12691.  
  12692. destructor 
  12693.  
  12694. A member function that destroys an object and frees up storage. The destructor 
  12695. of a class has the same name of the class preceded by a ~ (tilde). 
  12696.  
  12697.  
  12698. ΓòÉΓòÉΓòÉ 8.34. difference ΓòÉΓòÉΓòÉ
  12699.  
  12700. difference 
  12701.  
  12702. Given two sets A and B, the difference (A-B) is the set of all elements 
  12703. contained in A but not in B.. For bags, there is an additional rule for 
  12704. duplicates: If bag P contains an element m times and bag Q contains the same 
  12705. element n times, then, if m>n, the difference contains that element m-n times. 
  12706. If m=<n, the difference contains that element zero times. 
  12707.  
  12708.  
  12709. ΓòÉΓòÉΓòÉ 8.35. diluted array ΓòÉΓòÉΓòÉ
  12710.  
  12711. diluted array 
  12712.  
  12713. An array that only marks an element as deleted when it is removed. A diluted 
  12714. array eliminates the need to shift elements when removing an element, which 
  12715. makes it more efficient than a standard array. 
  12716.  
  12717.  
  12718. ΓòÉΓòÉΓòÉ 8.36. diluted sequence ΓòÉΓòÉΓòÉ
  12719.  
  12720. diluted sequence 
  12721.  
  12722. A sequence implemented using a diluted array. 
  12723.  
  12724.  
  12725. ΓòÉΓòÉΓòÉ 8.37. dynamic allocation ΓòÉΓòÉΓòÉ
  12726.  
  12727. dynamic allocation 
  12728.  
  12729. Assignment of system resources to a program when the program is executed rather 
  12730. than when it is loaded into main storage. 
  12731.  
  12732.  
  12733. ΓòÉΓòÉΓòÉ 8.38. element equality ΓòÉΓòÉΓòÉ
  12734.  
  12735. element equality 
  12736.  
  12737. A relation that determines if two elements are equal. 
  12738.  
  12739.  
  12740. ΓòÉΓòÉΓòÉ 8.39. element function ΓòÉΓòÉΓòÉ
  12741.  
  12742. element function 
  12743.  
  12744. A function, called by a member function, that accesses the elements of a class. 
  12745.  
  12746.  
  12747. ΓòÉΓòÉΓòÉ 8.40. element occurrence ΓòÉΓòÉΓòÉ
  12748.  
  12749. element occurrence 
  12750.  
  12751. A single instance of an element in a collection.  In a unique collection, 
  12752. element occurrence is synonymous with element value. 
  12753.  
  12754.  
  12755. ΓòÉΓòÉΓòÉ 8.41. element value ΓòÉΓòÉΓòÉ
  12756.  
  12757. element value 
  12758.  
  12759. All the instances of an element with a particular value in a collection.  In a 
  12760. nonunique collection, an element value may have more than one occurrence.  In a 
  12761. unique collection, element value is synonymous with element occurrence. 
  12762.  
  12763.  
  12764. ΓòÉΓòÉΓòÉ 8.42. enqueue ΓòÉΓòÉΓòÉ
  12765.  
  12766. enqueue 
  12767.  
  12768. An operation that adds an element as the last element to a queue. 
  12769.  
  12770.  
  12771. ΓòÉΓòÉΓòÉ 8.43. equality collection ΓòÉΓòÉΓòÉ
  12772.  
  12773. equality collection 
  12774.  
  12775.  1. An abstract class with the property of element equality. 
  12776.  
  12777.  2. In general, any collection that has element equality. 
  12778.  
  12779.  
  12780. ΓòÉΓòÉΓòÉ 8.44. equality key collection ΓòÉΓòÉΓòÉ
  12781.  
  12782. equality key collection 
  12783.  
  12784. An abstract class with the properties of element equality and key equality. 
  12785.  
  12786.  
  12787. ΓòÉΓòÉΓòÉ 8.45. equality key sorted collection ΓòÉΓòÉΓòÉ
  12788.  
  12789. equality key sorted collection 
  12790.  
  12791. An abstract class with the properties of element equality, key equality, and 
  12792. sorted elements. 
  12793.  
  12794.  
  12795. ΓòÉΓòÉΓòÉ 8.46. equality sequence ΓòÉΓòÉΓòÉ
  12796.  
  12797. equality sequence 
  12798.  
  12799. A sequentially ordered flat collection with element equality. 
  12800.  
  12801.  
  12802. ΓòÉΓòÉΓòÉ 8.47. equality sorted collection ΓòÉΓòÉΓòÉ
  12803.  
  12804. equality sorted collection 
  12805.  
  12806. An abstract class with the properties of element equality and sorted elements. 
  12807.  
  12808.  
  12809. ΓòÉΓòÉΓòÉ 8.48. exception ΓòÉΓòÉΓòÉ
  12810.  
  12811. exception 
  12812.  
  12813. A user, logic, or system error detected by a function that is not dealt with by 
  12814. the function but is passed to an error handling routine. 
  12815.  
  12816.  
  12817. ΓòÉΓòÉΓòÉ 8.49. FIFO ΓòÉΓòÉΓòÉ
  12818.  
  12819. FIFO 
  12820.  
  12821. (First-In, First-Out) A property that ensures that the elements are removed 
  12822. from a collection in the same order they were added to the collection. For 
  12823. example, the first element added will be the first to be removed. Queues have 
  12824. this property. 
  12825.  
  12826.  
  12827. ΓòÉΓòÉΓòÉ 8.50. first element ΓòÉΓòÉΓòÉ
  12828.  
  12829. first element 
  12830.  
  12831. The element visited first in an iteration over a collection. Each collection 
  12832. has its own definition for first element. For example, the first element of a 
  12833. sorted set is the element with the smallest value. 
  12834.  
  12835.  
  12836. ΓòÉΓòÉΓòÉ 8.51. first-in, first-out (FIFO) ΓòÉΓòÉΓòÉ
  12837.  
  12838. first-in, first-out (FIFO) 
  12839.  
  12840. A property that ensures that the elements are removed from a collection in the 
  12841. same order they were added to the collection. For example, the first element 
  12842. added will be the first to be removed. Queues have this property. 
  12843.  
  12844.  
  12845. ΓòÉΓòÉΓòÉ 8.52. flat collection ΓòÉΓòÉΓòÉ
  12846.  
  12847. flat collection 
  12848.  
  12849. A collection that has no hierarchical structure. 
  12850.  
  12851.  
  12852. ΓòÉΓòÉΓòÉ 8.53. flat collection with restricted access ΓòÉΓòÉΓòÉ
  12853.  
  12854. flat collection with restricted access 
  12855.  
  12856. A collection that has no hierarchical structure and a limited set of functions. 
  12857.  
  12858.  
  12859. ΓòÉΓòÉΓòÉ 8.54. given ... ΓòÉΓòÉΓòÉ
  12860.  
  12861. given ... 
  12862.  
  12863. Referring to a collection, element or function that is given as a function 
  12864. argument. 
  12865.  
  12866.  
  12867. ΓòÉΓòÉΓòÉ 8.55. hash function ΓòÉΓòÉΓòÉ
  12868.  
  12869. hash function 
  12870.  
  12871. A function that determines which category, or bucket, to put an element in.  A 
  12872. hash function is needed when implementing a hash table. 
  12873.  
  12874.  
  12875. ΓòÉΓòÉΓòÉ 8.56. hash table ΓòÉΓòÉΓòÉ
  12876.  
  12877. hash table 
  12878.  
  12879. A data structure that divides all elements into (preferably) equal-sized 
  12880. categories, or buckets, to allow quick access to the elements.  The hash 
  12881. function determines which bucket an element belongs in. 
  12882.  
  12883.  
  12884. ΓòÉΓòÉΓòÉ 8.57. heap ΓòÉΓòÉΓòÉ
  12885.  
  12886. heap 
  12887.  
  12888. An unordered flat collection that allows duplicate elements. 
  12889.  
  12890.  
  12891. ΓòÉΓòÉΓòÉ 8.58. height of a tree ΓòÉΓòÉΓòÉ
  12892.  
  12893. height of a tree 
  12894.  
  12895. The length of the longest path from the root to a leaf. 
  12896.  
  12897.  
  12898. ΓòÉΓòÉΓòÉ 8.59. hierarchy ΓòÉΓòÉΓòÉ
  12899.  
  12900. hierarchy 
  12901.  
  12902. A structure that has different ranks or levels. 
  12903.  
  12904.  
  12905. ΓòÉΓòÉΓòÉ 8.60. implementation class ΓòÉΓòÉΓòÉ
  12906.  
  12907. implementation class 
  12908.  
  12909. A class that implements a concrete class.  Programmers never use the 
  12910. implementation classes directly. 
  12911.  
  12912.  
  12913. ΓòÉΓòÉΓòÉ 8.61. include file ΓòÉΓòÉΓòÉ
  12914.  
  12915. include file 
  12916.  
  12917. A text file that contains declarations used by a group of classes, functions, 
  12918. programs, or users. 
  12919.  
  12920.  
  12921. ΓòÉΓòÉΓòÉ 8.62. indirection ΓòÉΓòÉΓòÉ
  12922.  
  12923. indirection 
  12924.  
  12925. A mechanism for connecting objects by storing, in one object, a reference to 
  12926. another object. 
  12927.  
  12928.  
  12929. ΓòÉΓòÉΓòÉ 8.63. indirection class ΓòÉΓòÉΓòÉ
  12930.  
  12931. indirection class 
  12932.  
  12933. Synonym for reference class. 
  12934.  
  12935.  
  12936. ΓòÉΓòÉΓòÉ 8.64. inheritance ΓòÉΓòÉΓòÉ
  12937.  
  12938. inheritance 
  12939.  
  12940. An technique that allows the use of an existing class as the base for creating 
  12941. other classes. 
  12942.  
  12943.  
  12944. ΓòÉΓòÉΓòÉ 8.65. inline function ΓòÉΓòÉΓòÉ
  12945.  
  12946. inline function 
  12947.  
  12948. A function whose actual code replaces a function call. A function that is both 
  12949. declared and defined in a class definition is an example of a inline function. 
  12950.  
  12951.  
  12952. ΓòÉΓòÉΓòÉ 8.66. instantiate ΓòÉΓòÉΓòÉ
  12953.  
  12954. instantiate 
  12955.  
  12956. To create a particular instance of a data type. 
  12957.  
  12958.  
  12959. ΓòÉΓòÉΓòÉ 8.67. intersection ΓòÉΓòÉΓòÉ
  12960.  
  12961. intersection 
  12962.  
  12963. Given collections A and B, the set of elements that is contained in both A and 
  12964. B. For bags, there is an additional rule for duplicates: If bag P contains an 
  12965. element m times and bag Q contains the same element n times, then the smaller 
  12966. of m and n is the number of times that element appears in the intersection of P 
  12967. and Q. 
  12968.  
  12969.  
  12970. ΓòÉΓòÉΓòÉ 8.68. iteration ΓòÉΓòÉΓòÉ
  12971.  
  12972. iteration 
  12973.  
  12974. The process of repeatedly applying a function to a series of elements in a 
  12975. collection until some condition is satisfied. 
  12976.  
  12977.  
  12978. ΓòÉΓòÉΓòÉ 8.69. iteration order ΓòÉΓòÉΓòÉ
  12979.  
  12980. iteration order 
  12981.  
  12982. The order in which elements are visited when iterating over a collection. In 
  12983. ordered collections, the element at position 1 will be visited first, then the 
  12984. element at position 2, and so on. In sorted collections, the elements are 
  12985. visited according to the ordering relation provided for the element type. In 
  12986. collections that are not ordered the elements are visited in an arbitrary 
  12987. order. Each element is visited exactly once. 
  12988.  
  12989.  
  12990. ΓòÉΓòÉΓòÉ 8.70. iterator ΓòÉΓòÉΓòÉ
  12991.  
  12992. iterator 
  12993.  
  12994. A mechanism used for iteration. 
  12995.  
  12996.  
  12997. ΓòÉΓòÉΓòÉ 8.71. iterator class ΓòÉΓòÉΓòÉ
  12998.  
  12999. iterator class 
  13000.  
  13001. A class that provides iteration functions. 
  13002.  
  13003.  
  13004. ΓòÉΓòÉΓòÉ 8.72. key ΓòÉΓòÉΓòÉ
  13005.  
  13006. key 
  13007.  
  13008. A data member that is used to identify an element.  A key only is a part of a 
  13009. complete element that can be used, for example, to establish the order of 
  13010. elements in a collection. 
  13011.  
  13012.  
  13013. ΓòÉΓòÉΓòÉ 8.73. key access ΓòÉΓòÉΓòÉ
  13014.  
  13015. key access 
  13016.  
  13017. A property that allows elements to be accessed by matching keys. 
  13018.  
  13019.  
  13020. ΓòÉΓòÉΓòÉ 8.74. key bag ΓòÉΓòÉΓòÉ
  13021.  
  13022. key bag 
  13023.  
  13024. An unordered flat collection that uses keys and can contain duplicate elements. 
  13025.  
  13026.  
  13027. ΓòÉΓòÉΓòÉ 8.75. key collection ΓòÉΓòÉΓòÉ
  13028.  
  13029. key collection 
  13030.  
  13031.  1. An abstract class that has the property of key access. 
  13032.  
  13033.  2. In general, any collection that uses keys. 
  13034.  
  13035.  
  13036. ΓòÉΓòÉΓòÉ 8.76. key equality ΓòÉΓòÉΓòÉ
  13037.  
  13038. key equality 
  13039.  
  13040. A relation that determines whether two keys are equal. 
  13041.  
  13042.  
  13043. ΓòÉΓòÉΓòÉ 8.77. key function ΓòÉΓòÉΓòÉ
  13044.  
  13045. key function 
  13046.  
  13047.  1. When used on a flat collection, a function that returns a reference to the 
  13048.     key of an element. 
  13049.  
  13050.  2. In general, a function, called by a member function, that manipulates the 
  13051.     keys of a class. 
  13052.  
  13053.  
  13054. ΓòÉΓòÉΓòÉ 8.78. key set ΓòÉΓòÉΓòÉ
  13055.  
  13056. key set 
  13057.  
  13058. An unordered flat collection that uses keys and does not allow duplicate 
  13059. elements. 
  13060.  
  13061.  
  13062. ΓòÉΓòÉΓòÉ 8.79. key sorted bag ΓòÉΓòÉΓòÉ
  13063.  
  13064. key sorted bag 
  13065.  
  13066. A sorted flat collection that uses keys and allows duplicate elements. 
  13067.  
  13068.  
  13069. ΓòÉΓòÉΓòÉ 8.80. key sorted collection ΓòÉΓòÉΓòÉ
  13070.  
  13071. key sorted collection 
  13072.  
  13073. An abstract class with the properties of key equality and sorted elements. 
  13074.  
  13075.  
  13076. ΓòÉΓòÉΓòÉ 8.81. key sorted set ΓòÉΓòÉΓòÉ
  13077.  
  13078. key sorted set 
  13079.  
  13080. A sorted flat collection that uses keys and does not allow duplicate elements. 
  13081.  
  13082.  
  13083. ΓòÉΓòÉΓòÉ 8.82. largest-in, first-out ΓòÉΓòÉΓòÉ
  13084.  
  13085. largest-in, first-out 
  13086.  
  13087. A property that ensures that the largest element is always removed from a 
  13088. collection before smaller elements are used. Priority queues have this 
  13089. property. 
  13090.  
  13091.  
  13092. ΓòÉΓòÉΓòÉ 8.83. last element ΓòÉΓòÉΓòÉ
  13093.  
  13094. last element 
  13095.  
  13096. The element visited last in an iteration over a collection. Each collection has 
  13097. its own definition for last element. For example, the last element of a sorted 
  13098. set is the element with the largest value. 
  13099.  
  13100.  
  13101. ΓòÉΓòÉΓòÉ 8.84. last-in, first-out (LIFO) ΓòÉΓòÉΓòÉ
  13102.  
  13103. last-in, first-out (LIFO) 
  13104.  
  13105. A property that ensures that the elements are removed from a collection in the 
  13106. reverse order they were added to the collection. For example, the last element 
  13107. added will be the first to be removed. Stacks have this property. 
  13108.  
  13109.  
  13110. ΓòÉΓòÉΓòÉ 8.85. late binding ΓòÉΓòÉΓòÉ
  13111.  
  13112. late binding 
  13113.  
  13114. Allowing the system to determine the specific class of the object and invoke 
  13115. the appropriate function implementations at run time.  Late binding or dynamic 
  13116. binding hides the differences between a group of related classes from the 
  13117. application program. 
  13118.  
  13119.  
  13120. ΓòÉΓòÉΓòÉ 8.86. leaves ΓòÉΓòÉΓòÉ
  13121.  
  13122. leaves 
  13123.  
  13124. Nodes without children.  Synonym for terminals. 
  13125.  
  13126.  
  13127. ΓòÉΓòÉΓòÉ 8.87. level of a node ΓòÉΓòÉΓòÉ
  13128.  
  13129. level of a node 
  13130.  
  13131. The number of steps in the path from the root to the given node. 
  13132.  
  13133.  
  13134. ΓòÉΓòÉΓòÉ 8.88. LIFO ΓòÉΓòÉΓòÉ
  13135.  
  13136. LIFO 
  13137.  
  13138. (Last-In, First-Out) A property that ensures that the elements are removed from 
  13139. a collection in the reverse order they were added to the collection. For 
  13140. example, the last element added will be the first to be removed. Stacks have 
  13141. this property. 
  13142.  
  13143.  
  13144. ΓòÉΓòÉΓòÉ 8.89. linked implementation ΓòÉΓòÉΓòÉ
  13145.  
  13146. linked implementation 
  13147.  
  13148. An implementation in which each element contains a reference to the next 
  13149. element in the collection.  Pointer chains are used to access elements in 
  13150. linked implementations. Linked implementations are also called linked list 
  13151. implementations. 
  13152.  
  13153.  
  13154. ΓòÉΓòÉΓòÉ 8.90. linked sequence ΓòÉΓòÉΓòÉ
  13155.  
  13156. linked sequence 
  13157.  
  13158. A sequence that uses a linked implementation. 
  13159.  
  13160.  
  13161. ΓòÉΓòÉΓòÉ 8.91. map ΓòÉΓòÉΓòÉ
  13162.  
  13163. map 
  13164.  
  13165. An unordered flat collection that uses keys and has element equality. 
  13166.  
  13167.  
  13168. ΓòÉΓòÉΓòÉ 8.92. member function ΓòÉΓòÉΓòÉ
  13169.  
  13170. member function 
  13171.  
  13172. A function that performs operations on a class. 
  13173.  
  13174.  
  13175. ΓòÉΓòÉΓòÉ 8.93. multiple collection ΓòÉΓòÉΓòÉ
  13176.  
  13177. multiple collection 
  13178.  
  13179. A collection that allows duplicate elements. 
  13180.  
  13181.  
  13182. ΓòÉΓòÉΓòÉ 8.94. multiple inheritance ΓòÉΓòÉΓòÉ
  13183.  
  13184. multiple inheritance 
  13185.  
  13186. Occurs when a derived class is based on more than one class. 
  13187.  
  13188.  
  13189. ΓòÉΓòÉΓòÉ 8.95. n-ary tree ΓòÉΓòÉΓòÉ
  13190.  
  13191. n-ary tree 
  13192.  
  13193. A tree that has an upper limit, n, imposed on the number of children allowed 
  13194. for a node. 
  13195.  
  13196.  
  13197. ΓòÉΓòÉΓòÉ 8.96. node ΓòÉΓòÉΓòÉ
  13198.  
  13199. node 
  13200.  
  13201. An element of a tree. 
  13202.  
  13203.  
  13204. ΓòÉΓòÉΓòÉ 8.97. operation class ΓòÉΓòÉΓòÉ
  13205.  
  13206. operation class 
  13207.  
  13208. A class that defines all required element and key operations required by a 
  13209. specific collection implementation. 
  13210.  
  13211.  
  13212. ΓòÉΓòÉΓòÉ 8.98. ordered collection ΓòÉΓòÉΓòÉ
  13213.  
  13214. ordered collection 
  13215.  
  13216.  1. An abstract class that has the property of ordered elements. 
  13217.  
  13218.  2. In general, any collection that has its elements arranges so that there is 
  13219.     always a first element, last element, next element, and previous element. 
  13220.  
  13221.  
  13222. ΓòÉΓòÉΓòÉ 8.99. ordering relation ΓòÉΓòÉΓòÉ
  13223.  
  13224. ordering relation 
  13225.  
  13226. A property that determines how the elements are sorted. Ascending order is an 
  13227. example of an ordering relation. 
  13228.  
  13229.  
  13230. ΓòÉΓòÉΓòÉ 8.100. parent ΓòÉΓòÉΓòÉ
  13231.  
  13232. parent 
  13233.  
  13234. A node that has children in a tree structure. 
  13235.  
  13236.  
  13237. ΓòÉΓòÉΓòÉ 8.101. pointer ΓòÉΓòÉΓòÉ
  13238.  
  13239. pointer 
  13240.  
  13241. A variable that holds the address of a data object or function. 
  13242.  
  13243.  
  13244. ΓòÉΓòÉΓòÉ 8.102. pointer class ΓòÉΓòÉΓòÉ
  13245.  
  13246. pointer class 
  13247.  
  13248. A class that implements pointers. 
  13249.  
  13250.  
  13251. ΓòÉΓòÉΓòÉ 8.103. polymorphism ΓòÉΓòÉΓòÉ
  13252.  
  13253. polymorphism 
  13254.  
  13255. The technique of taking an abstract view of an object or function and using any 
  13256. concrete objects or arguments that are derived from this abstract view. 
  13257.  
  13258.  
  13259. ΓòÉΓòÉΓòÉ 8.104. positioning property ΓòÉΓòÉΓòÉ
  13260.  
  13261. positioning property 
  13262.  
  13263. The property of an element that is used to position the element in a 
  13264. collection.  For example, the value of the key may be used as the positioning 
  13265. property. 
  13266.  
  13267.  
  13268. ΓòÉΓòÉΓòÉ 8.105. precondition ΓòÉΓòÉΓòÉ
  13269.  
  13270. precondition 
  13271.  
  13272. A condition that a function requires to be true when it is called. 
  13273.  
  13274.  
  13275. ΓòÉΓòÉΓòÉ 8.106. predicate function ΓòÉΓòÉΓòÉ
  13276.  
  13277. predicate function 
  13278.  
  13279. A function that returns a Boolean value of True or False. 
  13280.  
  13281.  
  13282. ΓòÉΓòÉΓòÉ 8.107. priority queue ΓòÉΓòÉΓòÉ
  13283.  
  13284. priority queue 
  13285.  
  13286. A queue that has a priority assigned to its elements.  When accessing elements, 
  13287. the element with the highest priority is removed first.  A priority queue has a 
  13288. largest-in, first-out behavior. 
  13289.  
  13290.  
  13291. ΓòÉΓòÉΓòÉ 8.108. profiling ΓòÉΓòÉΓòÉ
  13292.  
  13293. profiling 
  13294.  
  13295. The process of generating a statistical analysis of a program that shows 
  13296. processor time and the percentage of program execution time used by each 
  13297. procedure in the program. 
  13298.  
  13299.  
  13300. ΓòÉΓòÉΓòÉ 8.109. property function ΓòÉΓòÉΓòÉ
  13301.  
  13302. property function 
  13303.  
  13304. A function that is used to determine whether the element it is applied to has a 
  13305. given property or characteristic. A property function can be used, for example, 
  13306. to remove all elements with a given property. 
  13307.  
  13308.  
  13309. ΓòÉΓòÉΓòÉ 8.110. queue ΓòÉΓòÉΓòÉ
  13310.  
  13311. queue 
  13312.  
  13313. A sequence with restricted access in which elements can only be added at the 
  13314. back end (or bottom) and removed from the front end (or top).  A queue is 
  13315. characterized by first-in, first-out behavior and chronological order. 
  13316.  
  13317.  
  13318. ΓòÉΓòÉΓòÉ 8.111. reference class ΓòÉΓòÉΓòÉ
  13319.  
  13320. reference class 
  13321.  
  13322. A class that links a concrete class to an abstract class. Reference classes 
  13323. make polymorphism possible with the Collection Classes. 
  13324.  
  13325.  
  13326. ΓòÉΓòÉΓòÉ 8.112. relation ΓòÉΓòÉΓòÉ
  13327.  
  13328. relation 
  13329.  
  13330. An unordered flat collection class that uses keys, allows for duplicate 
  13331. elements, and has element equality. 
  13332.  
  13333.  
  13334. ΓòÉΓòÉΓòÉ 8.113. returned element ΓòÉΓòÉΓòÉ
  13335.  
  13336. returned element 
  13337.  
  13338. An element returned by a function as the return value. 
  13339.  
  13340.  
  13341. ΓòÉΓòÉΓòÉ 8.114. root ΓòÉΓòÉΓòÉ
  13342.  
  13343. root 
  13344.  
  13345. A node that has no parent.  All other nodes of a tree are descendants of the 
  13346. root. 
  13347.  
  13348.  
  13349. ΓòÉΓòÉΓòÉ 8.115. sequence ΓòÉΓòÉΓòÉ
  13350.  
  13351. sequence 
  13352.  
  13353. A sequentially ordered flat collection. 
  13354.  
  13355.  
  13356. ΓòÉΓòÉΓòÉ 8.116. sequential collection ΓòÉΓòÉΓòÉ
  13357.  
  13358. sequential collection 
  13359.  
  13360. An abstract class with the property of sequentially ordered elements. 
  13361.  
  13362.  
  13363. ΓòÉΓòÉΓòÉ 8.117. set ΓòÉΓòÉΓòÉ
  13364.  
  13365. set 
  13366.  
  13367. An unordered flat collection with element equality. 
  13368.  
  13369.  
  13370. ΓòÉΓòÉΓòÉ 8.118. siblings ΓòÉΓòÉΓòÉ
  13371.  
  13372. siblings 
  13373.  
  13374. All the children of a node are said to be siblings of one another. 
  13375.  
  13376.  
  13377. ΓòÉΓòÉΓòÉ 8.119. smallest-in, first-out ΓòÉΓòÉΓòÉ
  13378.  
  13379. smallest-in, first-out 
  13380.  
  13381. A property that ensures the smallest element is always removed from a 
  13382. collection before larger elements. 
  13383.  
  13384.  
  13385. ΓòÉΓòÉΓòÉ 8.120. sorted bag ΓòÉΓòÉΓòÉ
  13386.  
  13387. sorted bag 
  13388.  
  13389. A sorted flat collection that allows duplicate elements. 
  13390.  
  13391.  
  13392. ΓòÉΓòÉΓòÉ 8.121. sorted collection ΓòÉΓòÉΓòÉ
  13393.  
  13394. sorted collection 
  13395.  
  13396.  1. An abstract class with the property of sorted elements. 
  13397.  
  13398.  2. In general, any collection with sorted elements. 
  13399.  
  13400.  
  13401. ΓòÉΓòÉΓòÉ 8.122. sorted map ΓòÉΓòÉΓòÉ
  13402.  
  13403. sorted map 
  13404.  
  13405. A sorted flat collection with key and element equality. 
  13406.  
  13407.  
  13408. ΓòÉΓòÉΓòÉ 8.123. sorted relation ΓòÉΓòÉΓòÉ
  13409.  
  13410. sorted relation 
  13411.  
  13412. A sorted flat collection that uses keys, has element equality, and allows 
  13413. duplicate elements. 
  13414.  
  13415.  
  13416. ΓòÉΓòÉΓòÉ 8.124. sorted set ΓòÉΓòÉΓòÉ
  13417.  
  13418. sorted set 
  13419.  
  13420. A sorted flat collection with element equality. 
  13421.  
  13422.  
  13423. ΓòÉΓòÉΓòÉ 8.125. stack ΓòÉΓòÉΓòÉ
  13424.  
  13425. stack 
  13426.  
  13427. A sequence with restricted access in which elements are added to the top and 
  13428. removed from the top.  A stack is characterized by last-in, first-out behavior 
  13429. and reverse chronological order. 
  13430.  
  13431.  
  13432. ΓòÉΓòÉΓòÉ 8.126. subset ΓòÉΓòÉΓòÉ
  13433.  
  13434. subset 
  13435.  
  13436. Given two sets A and B, B is a subset of A if and only if all elements of B are 
  13437. also elements of A. 
  13438.  
  13439.  
  13440. ΓòÉΓòÉΓòÉ 8.127. subtree ΓòÉΓòÉΓòÉ
  13441.  
  13442. subtree 
  13443.  
  13444. A tree structure created by arbitrarily denoting a node to be the root node in 
  13445. a tree.  A subtree is always part of a whole tree. 
  13446.  
  13447.  
  13448. ΓòÉΓòÉΓòÉ 8.128. superset ΓòÉΓòÉΓòÉ
  13449.  
  13450. superset 
  13451.  
  13452. Given two sets A and B, A is a superset of B if and only if all elements of B 
  13453. are also elements of A.  That is, A is a superset of B if B is a subset of A. 
  13454.  
  13455.  
  13456. ΓòÉΓòÉΓòÉ 8.129. tabular diluted sequence ΓòÉΓòÉΓòÉ
  13457.  
  13458. tabular diluted sequence 
  13459.  
  13460. A sequence implemented using a diluted array. 
  13461.  
  13462.  
  13463. ΓòÉΓòÉΓòÉ 8.130. tabular implementation ΓòÉΓòÉΓòÉ
  13464.  
  13465. tabular implementation 
  13466.  
  13467. An implementation that stores the location of elements in tables.  Elements in 
  13468. a tabular implementation are accessed by using indices to arrays. 
  13469.  
  13470.  
  13471. ΓòÉΓòÉΓòÉ 8.131. tabular sequence ΓòÉΓòÉΓòÉ
  13472.  
  13473. tabular sequence 
  13474.  
  13475. A sequence that uses a tabular implementation. 
  13476.  
  13477.  
  13478. ΓòÉΓòÉΓòÉ 8.132. terminals ΓòÉΓòÉΓòÉ
  13479.  
  13480. terminals 
  13481.  
  13482. Nodes without children.  Synonym for leaves. 
  13483.  
  13484.  
  13485. ΓòÉΓòÉΓòÉ 8.133. this collection ΓòÉΓòÉΓòÉ
  13486.  
  13487. this collection 
  13488.  
  13489. The collection to which a function is applied. 
  13490.  
  13491.  
  13492. ΓòÉΓòÉΓòÉ 8.134. tree ΓòÉΓòÉΓòÉ
  13493.  
  13494. tree 
  13495.  
  13496. A hierarchical collection of nodes that can have an arbitrary number of 
  13497. references to other nodes.  A unique path connects every two nodes. 
  13498.  
  13499.  
  13500. ΓòÉΓòÉΓòÉ 8.135. typed implementation class ΓòÉΓòÉΓòÉ
  13501.  
  13502. typed implementation class 
  13503.  
  13504. A class that implements a concrete class and provides an interface that is 
  13505. specific to a given element type. This interface allows the compiler to verify 
  13506. that, for example, integers cannot be added to a set of strings. 
  13507.  
  13508.  
  13509. ΓòÉΓòÉΓòÉ 8.136. typeless implementation class ΓòÉΓòÉΓòÉ
  13510.  
  13511. typeless implementation class 
  13512.  
  13513. A class that implements a concrete class and provides an interface that is not 
  13514. specific to a given element type. 
  13515.  
  13516.  
  13517. ΓòÉΓòÉΓòÉ 8.137. unbounded collection ΓòÉΓòÉΓòÉ
  13518.  
  13519. unbounded collection 
  13520.  
  13521. A collection that has no upper limit on the number of elements it can contain. 
  13522.  
  13523.  
  13524. ΓòÉΓòÉΓòÉ 8.138. undefined behavior ΓòÉΓòÉΓòÉ
  13525.  
  13526. undefined behavior 
  13527.  
  13528. Referring to a program or function that may produce erroneous results without 
  13529. warning. 
  13530.  
  13531.  
  13532. ΓòÉΓòÉΓòÉ 8.139. undefined cursor ΓòÉΓòÉΓòÉ
  13533.  
  13534. undefined cursor 
  13535.  
  13536. A cursor that may or may not be valid, and that may or may not refer to a 
  13537. different element of the collection from the element it referred to before the 
  13538. function call that resulted in its becoming undefined.  An undefined cursor may 
  13539. refer to no element of the collection, and still be a valid cursor. 
  13540.  
  13541.  
  13542. ΓòÉΓòÉΓòÉ 8.140. union ΓòÉΓòÉΓòÉ
  13543.  
  13544. union 
  13545.  
  13546. Given the sets A and B, all elements of A, B, or both. For bags, there is an 
  13547. additional rule for duplicates: If bag P contains an element m times and bag Q 
  13548. contains the same element n times, then the union of P and Q contains that 
  13549. element m+n times. 
  13550.  
  13551.  
  13552. ΓòÉΓòÉΓòÉ 8.141. unique collection ΓòÉΓòÉΓòÉ
  13553.  
  13554. unique collection 
  13555.  
  13556. A collection in which the value of an element only occurs once; that is, there 
  13557. are no duplicate elements. 
  13558.  
  13559.  
  13560. ΓòÉΓòÉΓòÉ 8.142. unordered collection ΓòÉΓòÉΓòÉ
  13561.  
  13562. unordered collection 
  13563.  
  13564. A collection that has no order to its elements. 
  13565.  
  13566.  
  13567. ΓòÉΓòÉΓòÉ 8.143. user-defined data type ΓòÉΓòÉΓòÉ
  13568.  
  13569. user-defined data type 
  13570.  
  13571. A mathematical model that includes a structure for storing data and operations 
  13572. that can be performed on that data. Common abstract data types include sets, 
  13573. trees, and heaps. 
  13574.  
  13575.  
  13576. ΓòÉΓòÉΓòÉ 8.144. virtual function ΓòÉΓòÉΓòÉ
  13577.  
  13578. virtual function 
  13579.  
  13580. A function that has its implementation determined at run time.