home *** CD-ROM | disk | FTP | other *** search
/ PC World 1997 November / PCWorld_1997-11_cd.bin / software / programy / komix / DATA.Z / PtrDict.cxx < prev    next >
C/C++ Source or Header  |  1996-07-30  |  3KB  |  113 lines

  1. /*---------------------------------------------------------------------------
  2.  *
  3.  * Copyright (c) 1993 by Westmount Technology B.V., Delft, The Netherlands.
  4.  *
  5.  * This software is furnished under a license and may be used only in
  6.  * accordance with the terms of such license and with the inclusion of
  7.  * the above copyright notice. This software or any other copies thereof
  8.  * may not be provided or otherwise made available to any other person.
  9.  * No title to and ownership of the software is hereby transferred.
  10.  *
  11.  * The information in this software is subject to change without notice
  12.  * and should not be construed as a commitment by Westmount Technology B.V.
  13.  *
  14.  *---------------------------------------------------------------------------
  15.  *
  16.  *    File        : @(#)PtrDict.cxx    /main/hindenburg/1
  17.  *    Author        : frmo
  18.  *    Original date    : 26-2-1993
  19.  *    Description    : PtrDict (A map of key-value pairs),
  20.  *                        value is a pointer
  21.  *
  22.  *---------------------------------------------------------------------------
  23.  */
  24. static const char SccsId[]="@(#)PtrDict.cxx    /main/hindenburg/1    30 Jul 1996 Copyright 1993 Westmount Technology";
  25.  
  26. #ifndef PTRDICT_HXX
  27. #include "PtrDict.hxx"
  28. #endif
  29.  
  30. // Specialized DictSlot used as a search key only
  31.  
  32. class DictKey: public DictSlot {
  33. public:
  34.     DictKey(const Hashable &key) : DictSlot((Hashable *) &key, 0) {}
  35. };
  36.  
  37. DictSlot::~DictSlot()
  38. {
  39. }
  40.  
  41. unsigned DictSlot::hash() const
  42. {
  43.     return key->hash();
  44. }
  45.  
  46. int DictSlot::isEqual(const Hashable &other) const
  47. {
  48.     const DictSlot &otherSlot = (const DictSlot &)other;
  49.     return key->isEqual(*otherSlot.key);
  50. }
  51.  
  52.  
  53. void GenPtrDict::set(Hashable *key, void *value)
  54. {
  55.     DictSlot *slot = new DictSlot(key, value);
  56.     DictSlot *existing = DictSlotTbl::find(*slot);
  57.     if (existing) {
  58.         delete key;
  59.         delete slot;
  60.         existing->setValue(value);
  61.     } else
  62.         DictSlotTbl::add(*slot);
  63. }
  64.  
  65. void *GenPtrDict::get(const Hashable &key) const
  66. {
  67.     DictKey dictKey(key);
  68.     DictSlot *slot = DictSlotTbl::find(dictKey);
  69.     return slot ? slot->getValue() : 0;
  70. }
  71.  
  72. void GenPtrDict::remove(const Hashable &key)
  73. {
  74.     DictKey dictKey(key);
  75.     DictSlot *slot = DictSlotTbl::find(dictKey);
  76.     if (slot) {
  77.         DictSlotTbl::remove(dictKey);
  78.         // key is always copied in "template" instantiations
  79.         delete slot->getKey();
  80.         delete slot;
  81.     }
  82. }
  83.  
  84. int GenPtrDict::isPresent(const Hashable &key) const
  85. {
  86.     DictKey dictKey(key);
  87.     return DictSlotTbl::find(dictKey) != 0;
  88. }
  89.  
  90. const Hashable *GenPtrDict::firstKey()
  91. {
  92.     DictSlot *slot = DictSlotTbl::first();
  93.     return slot ? slot->getKey() : 0;
  94. }
  95.  
  96. const Hashable *GenPtrDict::nextKey()
  97. {
  98.     DictSlot *slot = DictSlotTbl::next();
  99.     return slot ? slot->getKey() : 0;
  100. }
  101.  
  102. void *GenPtrDict::firstValue()
  103. {
  104.     DictSlot *slot = DictSlotTbl::first();
  105.     return slot ? slot->getValue() : 0;
  106. }
  107.  
  108. void *GenPtrDict::nextValue()
  109. {
  110.     DictSlot *slot = DictSlotTbl::next();
  111.     return slot ? slot->getValue() : 0;
  112. }
  113.