home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional Developers Kit 1992 November / Disc01 / Disc01.mdf / cppbeta / bbxxk / ihshkb.c__ / IHSHKB.C
Encoding:
C/C++ Source or Header  |  1992-10-26  |  5.7 KB  |  156 lines

  1. /* Copyright (c) IBM Corp. 1992 */
  2. #include <ibexcept.h>
  3.  
  4. template < class Element, class Key, class ElementOps >
  5. Boolean IGHashKeyBag < Element, Key, ElementOps >::Cursor::setToFirst () {
  6.   return ivCollection->setToFirst (*this);
  7. }
  8.  
  9. template < class Element, class Key, class ElementOps >
  10. Boolean IGHashKeyBag < Element, Key, ElementOps >::Cursor::setToNext () {
  11.   return ivCollection->setToNext (*this);
  12. }
  13.  
  14. template < class Element, class Key, class ElementOps >
  15. Boolean IGHashKeyBag < Element, Key, ElementOps >::Cursor::isValid () const {
  16.   return ivImpl.ivNode != 0;
  17. }
  18.  
  19. template < class Element, class Key, class ElementOps >
  20. void IGHashKeyBag < Element, Key, ElementOps >::Cursor::invalidate () {
  21.   ivImpl.ivNode = 0;
  22. }
  23.  
  24. template < class Element, class Key, class ElementOps >
  25. IHashKeyBagImpl::Node* IGHashKeyBag < Element, Key, ElementOps >::Operations::
  26. newNode (void const* element) const {
  27.   Node *result = new Node (*(Element const*) element);
  28.   ICHECK (result != 0, IOutOfMemory, "out of memory");
  29.   return result;
  30. }
  31.  
  32. template < class Element, class Key, class ElementOps >
  33. IHashKeyBagImpl::Node* IGHashKeyBag < Element, Key, ElementOps >::Operations::
  34. copyNode (void const* node) const {
  35.   Node *result = new Node (((Node const*) node)->ivElement);
  36.   ICHECK (result != 0, IOutOfMemory, "out of memory");
  37.   return result;
  38. }
  39.  
  40. template < class Element, class Key, class ElementOps >
  41. void IGHashKeyBag < Element, Key, ElementOps >::Operations::
  42. deleteNode (void* node) const {
  43.   delete (Node*) node;
  44. }
  45.  
  46. template < class Element, class Key, class ElementOps >
  47. void* IGHashKeyBag < Element, Key, ElementOps >::Operations::
  48. newBlock (size_t size) const {
  49.    return cvElementOps.allocate (size);
  50. }
  51.  
  52. template < class Element, class Key, class ElementOps >
  53. void IGHashKeyBag < Element, Key, ElementOps >::Operations::
  54. removeBlock (void* p, size_t size) const {
  55.    cvElementOps.deallocate (p);
  56. }
  57.  
  58. template < class Element, class Key, class ElementOps >
  59. INumber IGHashKeyBag < Element, Key, ElementOps >::Operations::
  60. getHashvalue (void const* key, INumber noEntries) const {
  61.    return cvElementOps.keyOps.hash (*(Key const*) key, noEntries);
  62. }
  63.  
  64. template < class Element, class Key, class ElementOps >
  65. void* IGHashKeyBag < Element, Key, ElementOps >::Operations::
  66. elementAt (void* node) const
  67. { return &((Node*) node)->ivElement;
  68. }
  69.  
  70. template < class Element, class Key, class ElementOps >
  71. void const* IGHashKeyBag < Element, Key, ElementOps >::Operations::
  72. constElementAt (void const* node) const
  73. { return &((Node*) node)->ivElement;
  74. }
  75.  
  76. template < class Element, class Key, class ElementOps >
  77. void const* IGHashKeyBag < Element, Key, ElementOps >::Operations::
  78. keyAt (void const* node) const
  79. { return &cvElementOps.key (((Node*) node)->ivElement);
  80. }
  81.  
  82. template < class Element, class Key, class ElementOps >
  83. Boolean IGHashKeyBag < Element, Key, ElementOps >::Operations::
  84. isKeyEqualTo (void const* node1, void const* node2) const
  85. { return cvElementOps.keyOps.equal
  86.        (cvElementOps.key (((Node const*)node1)->ivElement),
  87.         cvElementOps.key (((Node const*)node2)->ivElement));
  88. }
  89.  
  90. template < class Element, class Key, class ElementOps >
  91. Boolean IGHashKeyBag < Element, Key, ElementOps >::Operations::
  92. isKeyEqualToElement (void const* node, void const* element) const
  93. { return cvElementOps.keyOps.equal
  94.        (cvElementOps.key (((Node const*)node)->ivElement),
  95.         cvElementOps.key (*(Element const*)element));
  96. }
  97.  
  98. template < class Element, class Key, class ElementOps >
  99. Boolean IGHashKeyBag < Element, Key, ElementOps >::Operations::
  100. isKeyEqualToKey (void const* node, void const* key) const
  101. { return cvElementOps.keyOps.equal
  102.        (cvElementOps.key (((Node const*)node)->ivElement),
  103.         (*(Key const*)key));
  104. }
  105.  
  106. template < class Element, class Key, class ElementOps >
  107. void IGHashKeyBag < Element, Key, ElementOps >::Operations::
  108. copyFrom (void* node, void const* element) const
  109. { cvElementOps.assign
  110.     (((Node*)node)->ivElement, *(Element const*)element);
  111. }
  112.  
  113. template < class Element, class Key, class ElementOps >
  114. Boolean IGHashKeyBag < Element, Key, ElementOps >::Operations::
  115. constantFunctionIteration (void *iterationFunction,
  116.                void* env,
  117.                void const* node) {
  118.   return (*(Boolean (*) (Element const&, void*)) iterationFunction)
  119.            (((Node const*)node)->ivElement, env);
  120. }
  121.  
  122. template < class Element, class Key, class ElementOps >
  123. Boolean IGHashKeyBag < Element, Key, ElementOps >::Operations::
  124. functionIteration (void *iterationFunction, void* env, void* node) {
  125.   return (*(Boolean (*) (Element&, void*)) iterationFunction)
  126.            (((Node*)node)->ivElement, env);
  127. }
  128.    
  129. template < class Element, class Key, class ElementOps >
  130. Boolean IGHashKeyBag < Element, Key, ElementOps >::Operations::
  131. constantIteratorIteration (void* iterator, void const* node) {
  132.   return ((IConstantIterator < Element >*)iterator)->
  133.            applyTo (((Node const*)node)->ivElement);
  134. }
  135.  
  136. template < class Element, class Key, class ElementOps >
  137. Boolean IGHashKeyBag < Element, Key, ElementOps >::Operations::
  138. iteratorIteration (void* iterator, void* node) {
  139.   return ((IIterator < Element >*)iterator)->
  140.            applyTo (((Node*)node)->ivElement);
  141. }
  142.    
  143. template < class Element, class Key, class ElementOps >
  144. long IGHashKeyBag < Element, Key, ElementOps >::Operations::
  145. functionComparison (void *comparisonFunction,
  146.                     void const* node1,
  147.             void const* node2) {
  148.   return (*(long (*) (Element const&, Element const&) const)
  149.         comparisonFunction)
  150.            ( ((Node const*)node1)->ivElement,
  151.              ((Node const*)node2)->ivElement );
  152. }
  153.  
  154. template < class Element, class Key, class ElementOps >
  155. ElementOps IGHashKeyBag < Element, Key, ElementOps >::cvElementOps;
  156.