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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  h_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_H_ARRAY_H
  12. #define LEDA_H_ARRAY_H
  13. //------------------------------------------------------------------------------
  14. // h_array  
  15. //------------------------------------------------------------------------------ 
  16. #include <LEDA/basic.h> 
  17. #include <LEDA/impl/ch_array.h> 
  18. /*{Manpage {h_array} {I,E} {Hashing Arrays} }*/
  19. template<class I, class E>
  20. class h_array : private ch_array {
  21. /*{Mdefinition
  22. An instance $A$ of the parameterized data type name (hashing array)
  23. is an injective mapping from a hashed data type $I$ (cf. section 
  24. ref{Hashed Types}), called the index type of $A$, to the set of variables 
  25. of arbitrary type $E$, called the element type of $A$. We use $A(i)$ to 
  26. denote the variable indexed by $i$.}*/
  27.  E X;
  28.  int  int_type()           const { return LEDA_INT_TYPE(I); }
  29.  int  hash_fct(GenPtr x)   const { return LEDA_HASH(I,x); }
  30.  void copy_inf(GenPtr& x)  const { LEDA_COPY(E,x);  }
  31.  void clear_inf(GenPtr& x) const { LEDA_CLEAR(E,x); }
  32.  void init_inf(GenPtr& x)  const { x = Copy(X); }
  33.  public:
  34. /*{Mcreation A }*/
  35. h_array(E x, int sz) : ch_array(sz) { X = x; }
  36. h_array(E x) : ch_array(1) { X = x; }
  37. /*{Mcreate 
  38. creates an injective function $a$ from $I$ to the set of unused variables of
  39. type $E$, assigns $x$ to all variables in the range of $a$ and initializes $A$
  40. with $a$. }*/
  41.  
  42.  h_array() { }
  43.  h_array(const h_array<I,E>& A): ch_array((ch_array&)A) { X = A.X; }
  44. ~h_array() { }
  45. /*{Moperations 2 4.5 }*/
  46. E& operator[](I i) { return LEDA_ACCESS(E,access(Convert(i))); }
  47. /*{Marrop        returns the variable $A(i)$}*/
  48. E operator[](I i) const { return LEDA_ACCESS(E,access(Convert(i))); }
  49. bool defined(I i) const { return (lookup(Convert(i)) != nil); }
  50. /*{Mop      returns true if $i in dom(A)$, false otherwise; here
  51.      $dom(A)$ is the set of all $iin I$ for which $A[i]$ has
  52.      already been executed.}*/
  53. // iteration
  54. ch_array_item first_item() const { return ch_array::first_item(); }
  55. void loop_to_succ(GenPtr& x) const 
  56. { x = ch_array::next_item(*(ch_array_item*)&x); }
  57. GenPtr forall_loop_test(GenPtr it, E& x) const
  58. { if (it) x = LEDA_ACCESS(E,ch_array::inf(ch_array_item(it)));
  59.   return it;
  60. }
  61. GenPtr forall_defined_test(GenPtr it, I& x) const
  62. { if (it) x = LEDA_ACCESS(I,ch_array::key(ch_array_item(it)));
  63.   return it;
  64. }
  65. };
  66. /*{Mtext
  67. bigskip
  68. {bf forall_defined}($i,A$) 
  69. ${$ ``the elements from $dom(A)$ are successively assigned to $i$'' $}$ }*/
  70. /*{Mimplementation
  71. Hashing arrays are implemented by hashing with chaining. Access operations 
  72. take expected time $O(1)$. In many cases, hashing arrays are more efficient 
  73. than dictionary arrays (cf. ref{Dictionary Arrays}).}*/
  74. #endif