home *** CD-ROM | disk | FTP | other *** search
/ PC World 1997 November / PCWorld_1997-11_cd.bin / software / programy / komix / DATA.Z / PtrDict.hxx < prev    next >
Text File  |  1996-05-31  |  3KB  |  122 lines

  1. /*---------------------------------------------------------------------------
  2.  *
  3.  *      (c)     Westmount Technology    1993
  4.  *
  5.  *      File:        @(#)PtrDict.hxx    1.6
  6.  *      Author:        frmo
  7.  *      Description:    PtrDict (A map of key-value pairs),
  8.  *            value is a pointer
  9.  *---------------------------------------------------------------------------
  10.  SccsId = @(#)PtrDict.hxx    1.6   11 Nov 1993 Copyright 1993 Westmount Technology */
  11.  
  12. #ifndef PTRDICT_HXX
  13. #define PTRDICT_HXX
  14.  
  15. #ifndef TEMPLCONF_HXX
  16. #include "TemplConf.hxx"
  17. #endif
  18.  
  19. #ifndef HASHTBL_HXX
  20. #include "HashTbl.hxx"
  21. #endif
  22.  
  23. // A slot in the dictionary
  24.  
  25. class DictSlot : public Hashable {
  26.     Hashable    *key;
  27.     void        *value;
  28. public:
  29.     DictSlot(Hashable *aKey, void *aValue) :
  30.         key(aKey), value(aValue) {}
  31.  
  32.     ~DictSlot();
  33.  
  34.     unsigned    hash() const;
  35.     int        isEqual(const Hashable &other) const;
  36.  
  37.     Hashable    *getKey() const        { return key; }
  38.     void        *getValue() const    { return value; }
  39.     void        setValue(void *newValue) { value = newValue; }
  40. };
  41.  
  42. #if HAS_TEMPLATES
  43.  
  44. typedef hashTbl<Hashable, DictSlot> DictSlotTbl;
  45.  
  46. #else
  47.  
  48. declare2(HashTbl,Hashable,DictSlot);
  49. typedef hashTbl(Hashable,DictSlot) DictSlotTbl;
  50.  
  51. #endif /* HAS_TEMPLATES */
  52.  
  53. class GenPtrDict: private DictSlotTbl {
  54. public:
  55.     void        set(Hashable *key, void *value);
  56.     void        *get(const Hashable &key) const;
  57.     void        remove(const Hashable &key);
  58.     int        isPresent(const Hashable &key) const;
  59.  
  60.     const Hashable    *firstKey();
  61.     const Hashable    *nextKey();
  62.  
  63.     void        *firstValue();
  64.     void        *nextValue();
  65. };
  66.  
  67. #if HAS_TEMPLATES
  68.  
  69. template<class Key, class Value>
  70. class PtrDict : private GenPtrDict {
  71. public:
  72.     void        set(const Key &key, Value *value)
  73.         { GenPtrDict::set(new Key(key), value); }
  74.     Value        *get(const Key &key) const
  75.         { return (Value *) GenPtrDict::get(key); }
  76.     void        remove(const Key &key)
  77.         { GenPtrDict::remove(key); }
  78.     int        isPresent(const Key &key) const
  79.         { return GenPtrDict::isPresent(key); }
  80.  
  81.     const Key    *firstKey()
  82.         { return (Key *) GenPtrDict::firstKey(); }
  83.     const Key    *nextKey()
  84.         { return (Key *) GenPtrDict::nextKey(); }
  85.  
  86.     Value        *firstValue()
  87.         { return (Value *) GenPtrDict::firstValue(); }
  88.     Value        *nextValue()
  89.         { return (Value *) GenPtrDict::nextValue(); }
  90. };
  91.     
  92. #else
  93.  
  94. #define    PtrDict_(key,value)    name3(key,value,_PtrDict)
  95.  
  96. #define PtrDictdeclare2(Key,Value)                    \
  97. class PtrDict_(Key,Value) : private GenPtrDict {            \
  98. public:                                    \
  99.     void        set(const Key &key, Value *value)        \
  100.         { GenPtrDict::set(new Key(key), value); }        \
  101.     Value        *get(const Key &key) const            \
  102.         { return (Value *) GenPtrDict::get(key); }        \
  103.     void        remove(const Key &key)                \
  104.         { GenPtrDict::remove(key); }                \
  105.     int        isPresent(const Key &key) const            \
  106.         { return GenPtrDict::isPresent(key); }            \
  107.                                     \
  108.     const Key    *firstKey()                    \
  109.         { return (Key *) GenPtrDict::firstKey(); }        \
  110.     const Key    *nextKey()                    \
  111.         { return (Key *) GenPtrDict::nextKey(); }        \
  112.                                     \
  113.     Value        *firstValue()                    \
  114.         { return (Value *) GenPtrDict::firstValue(); }        \
  115.     Value        *nextValue()                    \
  116.         { return (Value *) GenPtrDict::nextValue(); }        \
  117. }
  118.  
  119. #endif /* HAS_TEMPLATES */
  120.  
  121. #endif /* PTRDICT_HXX */
  122.