_d_array.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:3k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _d_array.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef _LEDA_D_ARRAY_H
  12. #define _LEDA_D_ARRAY_H
  13. #include <LEDA/d_array.h>
  14. //------------------------------------------------------------------------------
  15. //
  16. // Dictionary arrays with implementation parameter:
  17. //
  18. //   _d_array<I,E,impl> 
  19. //
  20. //------------------------------------------------------------------------------
  21. /*{Manpage {_d_array} {I,E,impl} {Dictionary Arrays with Implementation Parameter} }*/
  22. /*{Mdefinition
  23. An instance of type name is a dictionary array implemented by data type 
  24. $impl$. $impl$ must be one of the dictionary implementations listed in
  25. section ref{Implementations Dictionaries} or a user defined data structure
  26. fulfilling the specification given in section ref{User Implementations
  27. Dictionaries}. Note that depending on the actual implementation $impl$
  28. the index type $I$ must either be linearly ordered or hashed.
  29. }*/
  30.   
  31. /*{Mtext
  32. {bf Example}\
  33. Using a dictionary array implemented by hashing with chaining  ($ch_hash$)
  34. to count the number of occurences of the elements in a sequence of strings.
  35. begingroup
  36. ttbig
  37. {obeyspacesgdef { }}
  38. ttverbatim
  39. #include <LEDA/_d_array.h>
  40. #include <LEDA/impl/ch_hash.h>
  41. //we first have to define a hash function for strings
  42. int Hash(const string& x) { return (x.length() > 0) ? x[0] : 0; }
  43. main()
  44.   _d_array<string,int,ch_hash> N(0);
  45.   string s;
  46.   while (cin >> s) N[s]++;
  47.   forall_defined(s,N) cout << s << "  " << N[s] << endl;
  48. }
  49. endgroup
  50. }*/
  51. template <class I, class E, class impl> 
  52. class _d_array : private virtual impl, public d_array<I,E>
  53. {
  54. E init;
  55. int  cmp(GenPtr x, GenPtr y) const { return LEDA_COMPARE(I,x,y); }
  56. int  hash_fct(GenPtr x)      const { return LEDA_HASH(I,x); }
  57. void clear_key(GenPtr& x)    const { LEDA_CLEAR(I,x); }
  58. void clear_inf(GenPtr& x)    const { LEDA_CLEAR(E,x); }
  59. void copy_key(GenPtr& x)     const { LEDA_COPY(I,x); }
  60. void copy_inf(GenPtr& x)     const { LEDA_COPY(E,x); }
  61. void print_key(GenPtr x)     const { LEDA_PRINT(I,x,cout); }
  62. void print_inf(GenPtr x)     const { LEDA_PRINT(E,x,cout); }
  63. int  int_type()              const { return LEDA_INT_TYPE(I); }
  64. public:
  65. E& operator[](const I& y)
  66. { d_array_item i=(d_array_item)impl::lookup(Convert(y));
  67.   if (i==nil) i=(d_array_item)impl::insert(Convert(y),Convert(this->init));
  68.   return LEDA_ACCESS(E,impl::info(impl::item(i)));
  69. }
  70. bool defined(I y) const
  71. { return (impl::lookup(Convert(y))!=nil); }
  72. void undefine(I y) { impl::del(Convert(y)); }
  73. // iteration
  74. void loop_to_succ(GenPtr& x) const { x = impl::next_item(impl::item(x)); }
  75. GenPtr forall_defined_test(GenPtr it, I& x) const
  76. { if (it) x = LEDA_ACCESS(I,impl::key(impl::item(it)));
  77.   return it;
  78. }
  79. GenPtr forall_loop_test(GenPtr it, E& x) const
  80. { if (it) x = LEDA_ACCESS(E,impl::inf(impl::item(it)));
  81.   return it;
  82. }
  83. _d_array<I,E,impl>& operator=(const _d_array<I,E,impl>& A)
  84. { impl::operator=(A); this->init=A.init; return *this; }
  85.  _d_array() {}
  86.  _d_array(E i) { this->init=i; }
  87.  _d_array(const _d_array<I,E,impl>& A) : impl(A) { this->init=A.init; }
  88. ~_d_array() { impl::clear(); } 
  89. };
  90. #endif