Dictionary.h
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:12k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: Dictionary.h,v 1.1.1.1 2005/11/11 21:32:03 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1990-1996 Sam Leffler
  4.  * Copyright (c) 1991-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. #ifndef _Dictionary_
  27. #define _Dictionary_
  28. #include "Types.h"
  29. #include "Array.h"
  30. #include "Str.h"
  31. #include "DSmacros.h"
  32. #include "stdlib.h"
  33. class fxDictIter;
  34. class fxDictionary;
  35. /*******************************************
  36. //  fxDictionary interface
  37. class DICT(KEY,VALUE) : public fxDictionary {
  38. public:
  39.     DICT();
  40.     DICT(const DICT &);
  41.     virtual ~DICT();
  42.     u_int size() const;
  43.     u_int getKeySize() const;
  44.     u_int getValueSize() const;
  45.     void operator=(const DICT &);
  46.     void add(const KEY &,const VALUE &);
  47.     void remove(const KEY);
  48.     VALUE *cut(const KEY); // does a find & remove
  49.     const VALUE* find(const KEY&, const KEY** k = 0) const;
  50. // returns null if not found, optionally returns pointer to key
  51.     VALUE& operator[](const KEY &); // creates the key/value if not
  52.     const VALUE& operator[](const KEY &) const; // creates the key/value if not
  53.     fxObj* copy() const;
  54. protected:
  55.     virtual u_long hashKey(const void *) const;
  56.     virtual int compareKeys(const void *, void const *) const; // 0 => equal
  57.     virtual void copyKey(const void *, void *) const;
  58.     virtual void copyValue(const void *, void *) const;
  59.     virtual void destroyKey(void *) const;
  60.     virtual void destroyValue(void *) const;
  61.     virtual void createValue(void *) const;
  62. }
  63. class DICTIter(DICT,KEY,VALUE) : public fxDictIter {
  64. public:
  65.     DICTIter();
  66.     DICTIter(DICT&);
  67.     operator=(DICT&);
  68.     operator++();
  69.     operator++(int);
  70.     operator KEY const &() const
  71.     KEY const& key() const;
  72.     VALUE& value() const;
  73.     bool removed();
  74.     bool notDone();
  75. }
  76. *******************************************/
  77. //----------------------------------------------------------------------
  78. class fxDictBucket {
  79. public:
  80.     fxDictBucket(void* kv,fxDictBucket* n) { kvmem = kv; next = n; }
  81.     ~fxDictBucket();
  82.     void* kvmem;
  83.     fxDictBucket* next;
  84. };
  85. fxDECLARE_PtrArray(fxDictBuckets, fxDictBucket*)
  86. fxDECLARE_PtrArray(fxDictIters, fxDictIter*)
  87. //----------------------------------------------------------------------
  88. #define fxDictVirtuals(HOW)
  89.     virtual u_long hashKey(const void*) const;
  90.     virtual int compareKeys(const void*, const void*) const HOW;
  91.     virtual void copyKey(const void*, void*) const HOW;
  92.     virtual void destroyKey(void*) const;
  93.     virtual void copyValue(const void*, void*) const HOW;
  94.     virtual void destroyValue(void*) const;
  95.     virtual void createValue(void*) const HOW;
  96. __enddef__
  97. //----------------------------------------------------------------------
  98. class fxDictionary : public fxObj {
  99.     friend class fxDictIter;
  100. public:
  101.     u_int size() const { return numItems; }
  102.     u_int getKeySize() const { return keysize; }
  103.     u_int getValueSize() const { return valuesize; }
  104.     virtual char const *className() const = 0;
  105. protected:
  106.     fxDictionary(u_int ksize, u_int vsize, u_int initsize = 0);
  107.     fxDictionary(const fxDictionary&);
  108.     virtual ~fxDictionary();
  109.     void cleanup();
  110.     void operator=(const fxDictionary&);
  111.     const void *find(const void*, const void** k = 0) const;
  112.     void *findCreate(const void*);
  113.     void remove(const void*);
  114.     void *cut(const void*);
  115.     virtual void addInternal(const void*, const void*);
  116.     fxDictVirtuals(= 0)
  117.     void addIter(fxDictIter*);
  118.     void removeIter(fxDictIter*);
  119.     void invalidateIters(const fxDictBucket*);
  120.     u_int numItems;
  121.     u_int keysize;
  122.     u_int valuesize;
  123.     fxDictBuckets buckets;
  124.     fxDictIters iters;
  125. };
  126. //----------------------------------------------------------------------
  127. class fxDictIter {
  128.     friend class fxDictionary;
  129. public:
  130.     fxDictIter();
  131.     ~fxDictIter();
  132.     fxDictIter(fxDictionary&);
  133.     void operator=(fxDictionary&); // not a const argument!
  134.     void operator++()    { increment(); }
  135.     void operator++(int)   { increment(); }
  136.     bool removed() const { return invalid; }
  137.     bool notDone() const { return node != 0; }
  138. protected:
  139.     void* getKey() const;
  140.     void* getValue() const;
  141.     void increment();
  142.     void advanceToValid();
  143.     fxDictionary* dict; // 0 if iterator isn't valid yet.
  144.     u_int bucket;        
  145.     u_int invalid:1; // this is 1 if the element was deleted.
  146.     fxDictBucket* node;  // if "invalid", points to the next node
  147. };
  148. //----------------------------------------------------------------------
  149. // Iterator declaration & implementation macros
  150. #define fxDECLARE_DictIter(DICT,KEY,VALUE)
  151. class fxCAT(DICT,Iter) : public fxDictIter {/*XXX*/
  152. public:
  153.     fxCAT(DICT,Iter)();
  154.     fxCAT(DICT,Iter)(DICT &);
  155.     fxCAT(DICT,Iter)(DICT *);
  156.     void operator=(DICT& d) /* not a const argument! */
  157. { fxDictIter::operator=(d); }
  158.     void operator=(DICT* d) /* not a const argument! */
  159. { fxDictIter::operator=(*d); }
  160.     operator KEY const &() const
  161. { return *(KEY *)fxDictIter::getKey(); }
  162.     KEY const &key() const
  163. { return *(KEY *)fxDictIter::getKey(); }
  164.     VALUE &value() const
  165. { return *(VALUE *)fxDictIter::getValue(); }
  166. };
  167. __enddef__
  168. #define fxIMPLEMENT_DictIter(DICT,KEY,VALUE)
  169.     fxCAT(DICT,Iter)::fxCAT(DICT,Iter)() : fxDictIter() {}
  170.     fxCAT(DICT,Iter)::fxCAT(DICT,Iter)(DICT &d)
  171. : fxDictIter((fxDictionary &)d) {}
  172.     fxCAT(DICT,Iter)::fxCAT(DICT,Iter)(DICT *d)
  173. : fxDictIter(*(fxDictionary *)d) {}
  174. __enddef__
  175. //----------------------------------------------------------------------
  176. // Dictionary declaration macros
  177. #define fxNOTHING
  178. #define fxDECLARE_Dictionary(DICT,KEY,VALUE)
  179. class DICT : public fxDictionary {/*XXX*/
  180. public:
  181.     DICT(u_int initsize=0);
  182.     ~DICT();
  183.     virtual char const *className() const;
  184.     void operator=(const DICT &d)
  185. {fxDictionary::operator=((const fxDictionary &)d);}
  186.     void add(const KEY &k, const VALUE &v) { addInternal(&k,&v); }
  187.     VALUE* cut(const KEY k)
  188. { return (VALUE*)fxDictionary::cut(&k); }
  189.     void remove(const KEY k)
  190. { fxDictionary::remove(&k); }
  191.     const VALUE* find(const KEY& k, const KEY** kp = 0) const
  192. { return (const VALUE*)fxDictionary::find(&k, (const void**)&kp); }
  193.     VALUE& operator[](const KEY& k)
  194. { return *(VALUE*)fxDictionary::findCreate(&k); }
  195. protected:
  196.     fxDictVirtuals(fxNOTHING)
  197. };
  198. fxDECLARE_Ptr(DICT);
  199. fxDECLARE_DictIter(DICT,KEY,VALUE)
  200. __enddef__
  201. // StrDictionary: the key is a fxStr object. The
  202. // user only has to define copyValue and destroyValue.
  203. #define fxDECLARE_StrKeyDictionary(DICT,VALUE) 
  204.     fxDECLARE_Dictionary(DICT,fxStr,VALUE)
  205. #define fxDECLARE_PtrKeyDictionary(DICT,KEY,VALUE) 
  206.     fxDECLARE_Dictionary(DICT,KEY,VALUE)
  207. #define fxDECLARE_ObjKeyDictionary(DICT,KEY,VALUE) 
  208.     fxDECLARE_Dictionary(DICT,KEY,VALUE)
  209. //----------------------------------------------------------------------
  210. // Dictionary method macros.  Used by the implement macros.
  211. #define fxIMPLEMENT_DictionaryMethods(DICT,KEY,VALUE)
  212.     DICT::DICT(u_int initsize) :
  213.         fxDictionary(sizeof(KEY),sizeof(VALUE),initsize) {} 
  214.     DICT::~DICT() { cleanup(); }
  215.     char const *DICT::className() const { return fxQUOTE(DICT); }
  216.     fxIMPLEMENT_DictIter(DICT,KEY,VALUE)
  217. __enddef__
  218. #define fxIMPLEMENT_StrKeyDictionaryMethods(DICT,VALUE)
  219.     fxIMPLEMENT_copyObj(DICT,Key,fxStr)
  220.     fxIMPLEMENT_destroyObj(DICT,Key,fxStr)
  221.     u_long DICT::hashKey(const void* key) const
  222. { return ((const fxStr*)key)->hash(); }
  223.     int DICT::compareKeys(const void* key1, const void* key2) const
  224. { return ::compare(*(const fxStr*)key1,*(const fxStr*)key2); }
  225. __enddef__
  226. #define fxIMPLEMENT_ObjKeyDictionaryMethods(DICT,KEY,VALUE)
  227.     fxIMPLEMENT_copyObj(DICT,Key,KEY)
  228.     fxIMPLEMENT_destroyObj(DICT,Key,KEY)
  229.     int DICT::compareKeys(const void* key1, const void* key2) const
  230. { return ((const KEY*)key1)->compare((const KEY*)key2); }
  231. __enddef__
  232. #define fxIMPLEMENT_PtrKeyDictionaryMethods(DICT,KEY,VALUE)
  233.     fxIMPLEMENT_copyPtr(DICT,Key,KEY)
  234.     fxIMPLEMENT_destroyPtr(DICT,Key,KEY)
  235.     u_long DICT::hashKey(const void* key) const
  236. { return u_long(((*(const u_int*)(key)) >> 2)); }
  237.     int DICT::compareKeys(const void* key1, const void* key2) const
  238. { return (*(const char**)key1 - *(const char**)key2); }
  239. __enddef__
  240. #define fxIMPLEMENT_ObjValueDictionaryMethods(DICT,VALUE)
  241.     fxIMPLEMENT_copyObj(DICT,Value,VALUE)
  242.     fxIMPLEMENT_destroyObj(DICT,Value,VALUE)
  243.     fxIMPLEMENT_createObj(DICT,Value,VALUE)
  244. __enddef__
  245. #define fxIMPLEMENT_PtrValueDictionaryMethods(DICT,VALUE)
  246.     fxIMPLEMENT_copyPtr(DICT,Value,VALUE)
  247.     fxIMPLEMENT_destroyPtr(DICT,Value,VALUE)
  248.     fxIMPLEMENT_createPtr(DICT,Value,VALUE)
  249. __enddef__
  250. //----------------------------------------------------------------------
  251. // Dictionary implementation macros.  These are used by the programmer
  252. // to implement new dictionary types.
  253. #define fxIMPLEMENT_Dictionary(DICT,KEY,VALUE)
  254.     fxIMPLEMENT_DictionaryMethods(DICT,KEY,VALUE)
  255. __enddef__
  256. #define fxIMPLEMENT_StrKeyDictionary(DICT,VALUE)
  257.     fxIMPLEMENT_DictionaryMethods(DICT,fxStr,VALUE)
  258.     fxIMPLEMENT_StrKeyDictionaryMethods(DICT,VALUE)
  259. __enddef__
  260. #define fxIMPLEMENT_ObjKeyDictionary(DICT,KEY,VALUE)
  261.     fxIMPLEMENT_DictionaryMethods(DICT,KEY,VALUE)
  262.     fxIMPLEMENT_ObjKeyDictionaryMethods(DICT,KEY,VALUE)
  263. __enddef__
  264. #define fxIMPLEMENT_PtrKeyDictionary(DICT,KEY,VALUE)
  265.     fxIMPLEMENT_DictionaryMethods(DICT,KEY,VALUE)
  266.     fxIMPLEMENT_PtrKeyDictionaryMethods(DICT,KEY,VALUE)
  267. __enddef__
  268. #define fxIMPLEMENT_ObjValueDictionary(DICT,VALUE)
  269.     fxIMPLEMENT_ObjValueDictionaryMethods(DICT,VALUE)
  270. __enddef__
  271. #define fxIMPLEMENT_PtrValueDictionary(DICT,VALUE)
  272.     fxIMPLEMENT_PtrValueDictionaryMethods(DICT,VALUE)
  273. __enddef__
  274. #define fxIMPLEMENT_ObjKeyObjValueDictionary(DICT,VALUE)
  275.     fxIMPLEMENT_DictionaryMethods(DICT,KEY,VALUE)
  276.     fxIMPLEMENT_ObjKeyDictionaryMethods(DICT, VALUE)
  277.     fxIMPLEMENT_ObjValueDictionaryMethods(DICT, VALUE)
  278. __enddef__
  279. #define fxIMPLEMENT_StrKeyObjValueDictionary(DICT,VALUE)
  280.     fxIMPLEMENT_DictionaryMethods(DICT,fxStr,VALUE)
  281.     fxIMPLEMENT_StrKeyDictionaryMethods(DICT, VALUE)
  282.     fxIMPLEMENT_ObjValueDictionaryMethods(DICT, VALUE)
  283. __enddef__
  284. #define fxIMPLEMENT_StrKeyPtrValueDictionary(DICT,VALUE)
  285.     fxIMPLEMENT_DictionaryMethods(DICT,fxStr,VALUE)
  286.     fxIMPLEMENT_StrKeyDictionaryMethods(DICT,VALUE)
  287.     fxIMPLEMENT_PtrValueDictionaryMethods(DICT,VALUE)
  288. __enddef__
  289. #define fxIMPLEMENT_PtrKeyPtrValueDictionary(DICT,KEY,VALUE)
  290.     fxIMPLEMENT_DictionaryMethods(DICT,KEY,VALUE)
  291.     fxIMPLEMENT_PtrKeyDictionaryMethods(DICT,KEY,VALUE)
  292.     fxIMPLEMENT_PtrValueDictionaryMethods(DICT,VALUE)
  293. __enddef__
  294. #define fxIMPLEMENT_PtrKeyObjValueDictionary(DICT,KEY,VALUE)
  295.     fxIMPLEMENT_DictionaryMethods(DICT,KEY,VALUE)
  296.     fxIMPLEMENT_PtrKeyDictionaryMethods(DICT,KEY,VALUE)
  297.     fxIMPLEMENT_ObjValueDictionaryMethods(DICT,VALUE)
  298. __enddef__
  299. #endif /* _Dictionary_ */