densehashtable.h.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:37k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. // Copyright (c) 2005, Google Inc.
  2. // All rights reserved.
  3. //
  4. // Redistribution and use in source and binary forms, with or without
  5. // modification, are permitted provided that the following conditions are
  6. // met:
  7. //
  8. //     * Redistributions of source code must retain the above copyright
  9. // notice, this list of conditions and the following disclaimer.
  10. //     * Redistributions in binary form must reproduce the above
  11. // copyright notice, this list of conditions and the following disclaimer
  12. // in the documentation and/or other materials provided with the
  13. // distribution.
  14. //     * Neither the name of Google Inc. nor the names of its
  15. // contributors may be used to endorse or promote products derived from
  16. // this software without specific prior written permission.
  17. //
  18. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  19. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  20. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  21. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  22. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  23. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  24. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  28. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. // ---
  30. // Author: Craig Silverstein
  31. //
  32. // A dense hashtable is a particular implementation of
  33. // a hashtable: one that is meant to minimize memory allocation.
  34. // It does this by using an array to store all the data.  We
  35. // steal a value from the key space to indicate "empty" array
  36. // elements (ie indices where no item lives) and another to indicate
  37. // "deleted" elements.
  38. //
  39. // (Note it is possible to change the value of the delete key
  40. // on the fly; you can even remove it, though after that point
  41. // the hashtable is insert_only until you set it again.  The empty
  42. // value however can't be changed.)
  43. //
  44. // To minimize allocation and pointer overhead, we use internal
  45. // probing, in which the hashtable is a single table, and collisions
  46. // are resolved by trying to insert again in another bucket.  The
  47. // most cache-efficient internal probing schemes are linear probing
  48. // (which suffers, alas, from clumping) and quadratic probing, which
  49. // is what we implement by default.
  50. //
  51. // Type requirements: value_type is required to be Copy Constructible
  52. // and Default Constructible. It is not required to be (and commonly
  53. // isn't) Assignable.
  54. //
  55. // You probably shouldn't use this code directly.  Use
  56. // <google/dense_hash_map> or <google/dense_hash_set> instead.
  57. // You can change the following below:
  58. // HT_OCCUPANCY_FLT      -- how full before we double size
  59. // HT_EMPTY_FLT          -- how empty before we halve size
  60. // HT_MIN_BUCKETS        -- default smallest bucket size
  61. //
  62. // How to decide what values to use?
  63. // HT_EMPTY_FLT's default of .4 * OCCUPANCY_FLT, is probably good.
  64. // HT_MIN_BUCKETS is probably unnecessary since you can specify
  65. // (indirectly) the starting number of buckets at construct-time.
  66. // For HT_OCCUPANCY_FLT, you can use this chart to try to trade-off
  67. // expected lookup time to the space taken up.  By default, this
  68. // code uses quadratic probing, though you can change it to linear
  69. // via _JUMP below if you really want to.
  70. //
  71. // From http://www.augustana.ca/~mohrj/courses/1999.fall/csc210/lecture_notes/hashing.html
  72. // NUMBER OF PROBES / LOOKUP       Successful            Unsuccessful
  73. // Quadratic collision resolution   1 - ln(1-L) - L/2    1/(1-L) - L - ln(1-L)
  74. // Linear collision resolution     [1+1/(1-L)]/2         [1+1/(1-L)2]/2
  75. //
  76. // -- HT_OCCUPANCY_FLT --         0.10  0.50  0.60  0.75  0.80  0.90  0.99
  77. // QUADRATIC COLLISION RES.
  78. //    probes/successful lookup    1.05  1.44  1.62  2.01  2.21  2.85  5.11
  79. //    probes/unsuccessful lookup  1.11  2.19  2.82  4.64  5.81  11.4  103.6
  80. // LINEAR COLLISION RES.
  81. //    probes/successful lookup    1.06  1.5   1.75  2.5   3.0   5.5   50.5
  82. //    probes/unsuccessful lookup  1.12  2.5   3.6   8.5   13.0  50.0  5000.0
  83. #ifndef _DENSEHASHTABLE_H_
  84. #define _DENSEHASHTABLE_H_
  85. // The probing method
  86. // Linear probing
  87. // #define JUMP_(key, num_probes)    ( 1 )
  88. // Quadratic-ish probing
  89. #define JUMP_(key, num_probes)    ( num_probes )
  90. // Hashtable class, used to implement the hashed associative containers
  91. // hash_set and hash_map.
  92. #include "sparseconfig.h"
  93. #include <assert.h>
  94. #include <stdlib.h>             // for abort()
  95. #include <algorithm>            // For swap(), eg
  96. #include <iostream>             // For cerr
  97. #include <memory>               // For uninitialized_fill, uninitialized_copy
  98. #include <utility>              // for pair<>
  99. #include <iterator>             // for facts about iterator tags
  100. #include "google_type_traits.h" // for true_type, integral_constant, etc.
  101. _START_GOOGLE_NAMESPACE_
  102. using STL_NAMESPACE::pair;
  103. template <class Value, class Key, class HashFcn,
  104.           class ExtractKey, class EqualKey, class Alloc>
  105. class dense_hashtable;
  106. template <class V, class K, class HF, class ExK, class EqK, class A>
  107. struct dense_hashtable_iterator;
  108. template <class V, class K, class HF, class ExK, class EqK, class A>
  109. struct dense_hashtable_const_iterator;
  110. // We're just an array, but we need to skip over empty and deleted elements
  111. template <class V, class K, class HF, class ExK, class EqK, class A>
  112. struct dense_hashtable_iterator {
  113.  public:
  114.   typedef dense_hashtable_iterator<V,K,HF,ExK,EqK,A>       iterator;
  115.   typedef dense_hashtable_const_iterator<V,K,HF,ExK,EqK,A> const_iterator;
  116.   typedef STL_NAMESPACE::forward_iterator_tag iterator_category;
  117.   typedef V value_type;
  118.   typedef ptrdiff_t difference_type;
  119.   typedef size_t size_type;
  120.   typedef V& reference;                // Value
  121.   typedef V* pointer;
  122.   // "Real" constructor and default constructor
  123.   dense_hashtable_iterator(const dense_hashtable<V,K,HF,ExK,EqK,A> *h,
  124.                            pointer it, pointer it_end, bool advance)
  125.     : ht(h), pos(it), end(it_end)   {
  126.     if (advance)  advance_past_empty_and_deleted();
  127.   }
  128.   dense_hashtable_iterator() { }
  129.   // The default destructor is fine; we don't define one
  130.   // The default operator= is fine; we don't define one
  131.   // Happy dereferencer
  132.   reference operator*() const { return *pos; }
  133.   pointer operator->() const { return &(operator*()); }
  134.   // Arithmetic.  The only hard part is making sure that
  135.   // we're not on an empty or marked-deleted array element
  136.   void advance_past_empty_and_deleted() {
  137.     while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this)) )
  138.       ++pos;
  139.   }
  140.   iterator& operator++()   {
  141.     assert(pos != end); ++pos; advance_past_empty_and_deleted(); return *this;
  142.   }
  143.   iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; }
  144.   // Comparison.
  145.   bool operator==(const iterator& it) const { return pos == it.pos; }
  146.   bool operator!=(const iterator& it) const { return pos != it.pos; }
  147.   // The actual data
  148.   const dense_hashtable<V,K,HF,ExK,EqK,A> *ht;
  149.   pointer pos, end;
  150. };
  151. // Now do it all again, but with const-ness!
  152. template <class V, class K, class HF, class ExK, class EqK, class A>
  153. struct dense_hashtable_const_iterator {
  154.  public:
  155.   typedef dense_hashtable_iterator<V,K,HF,ExK,EqK,A>       iterator;
  156.   typedef dense_hashtable_const_iterator<V,K,HF,ExK,EqK,A> const_iterator;
  157.   typedef STL_NAMESPACE::forward_iterator_tag iterator_category;
  158.   typedef V value_type;
  159.   typedef ptrdiff_t difference_type;
  160.   typedef size_t size_type;
  161.   typedef const V& reference;                // Value
  162.   typedef const V* pointer;
  163.   // "Real" constructor and default constructor
  164.   dense_hashtable_const_iterator(const dense_hashtable<V,K,HF,ExK,EqK,A> *h,
  165.                                  pointer it, pointer it_end, bool advance)
  166.     : ht(h), pos(it), end(it_end)   {
  167.     if (advance)  advance_past_empty_and_deleted();
  168.   }
  169.   dense_hashtable_const_iterator() { }
  170.   // This lets us convert regular iterators to const iterators
  171.   dense_hashtable_const_iterator(const iterator &it)
  172.     : ht(it.ht), pos(it.pos), end(it.end) { }
  173.   // The default destructor is fine; we don't define one
  174.   // The default operator= is fine; we don't define one
  175.   // Happy dereferencer
  176.   reference operator*() const { return *pos; }
  177.   pointer operator->() const { return &(operator*()); }
  178.   // Arithmetic.  The only hard part is making sure that
  179.   // we're not on an empty or marked-deleted array element
  180.   void advance_past_empty_and_deleted() {
  181.     while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this)) )
  182.       ++pos;
  183.   }
  184.   const_iterator& operator++()   {
  185.     assert(pos != end); ++pos; advance_past_empty_and_deleted(); return *this;
  186.   }
  187.   const_iterator operator++(int) { const_iterator tmp(*this); ++*this; return tmp; }
  188.   // Comparison.
  189.   bool operator==(const const_iterator& it) const { return pos == it.pos; }
  190.   bool operator!=(const const_iterator& it) const { return pos != it.pos; }
  191.   // The actual data
  192.   const dense_hashtable<V,K,HF,ExK,EqK,A> *ht;
  193.   pointer pos, end;
  194. };
  195. template <class Value, class Key, class HashFcn,
  196.           class ExtractKey, class EqualKey, class Alloc>
  197. class dense_hashtable {
  198.  public:
  199.   typedef Key key_type;
  200.   typedef Value value_type;
  201.   typedef HashFcn hasher;
  202.   typedef EqualKey key_equal;
  203.   typedef size_t            size_type;
  204.   typedef ptrdiff_t         difference_type;
  205.   typedef value_type*       pointer;
  206.   typedef const value_type* const_pointer;
  207.   typedef value_type&       reference;
  208.   typedef const value_type& const_reference;
  209.   typedef dense_hashtable_iterator<Value, Key, HashFcn,
  210.                                    ExtractKey, EqualKey, Alloc>
  211.   iterator;
  212.   typedef dense_hashtable_const_iterator<Value, Key, HashFcn,
  213.                                           ExtractKey, EqualKey, Alloc>
  214.   const_iterator;
  215.   // How full we let the table get before we resize.  Knuth says .8 is
  216.   // good -- higher causes us to probe too much, though saves memory
  217.   static const float HT_OCCUPANCY_FLT; // = 0.8;
  218.   // How empty we let the table get before we resize lower.
  219.   // (0.0 means never resize lower.)
  220.   // It should be less than OCCUPANCY_FLT / 2 or we thrash resizing
  221.   static const float HT_EMPTY_FLT; // = 0.4 * HT_OCCUPANCY_FLT
  222.   // Minimum size we're willing to let hashtables be.
  223.   // Must be a power of two, and at least 4.
  224.   // Note, however, that for a given hashtable, the initial size is a
  225.   // function of the first constructor arg, and may be >HT_MIN_BUCKETS.
  226.   static const size_t HT_MIN_BUCKETS  = 32;
  227.   // ITERATOR FUNCTIONS
  228.   iterator begin()             { return iterator(this, table,
  229.                                                  table + num_buckets, true); }
  230.   iterator end()               { return iterator(this, table + num_buckets,
  231.                                                  table + num_buckets, true); }
  232.   const_iterator begin() const { return const_iterator(this, table,
  233.                                                        table+num_buckets,true);}
  234.   const_iterator end() const   { return const_iterator(this, table + num_buckets,
  235.                                                        table+num_buckets,true);}
  236.   // ACCESSOR FUNCTIONS for the things we templatize on, basically
  237.   hasher hash_funct() const { return hash; }
  238.   key_equal key_eq() const  { return equals; }
  239.   // Annoyingly, we can't copy values around, because they might have
  240.   // const components (they're probably pair<const X, Y>).  We use
  241.   // explicit destructor invocation and placement new to get around
  242.   // this.  Arg.
  243.  private:
  244.   void set_value(value_type* dst, const value_type& src) {
  245.     dst->~value_type();
  246.     new(dst) value_type(src);
  247.   }
  248.   void destroy_buckets(size_type first, size_type last) {
  249.     for ( ; first != last; ++first)
  250.       table[first].~value_type();
  251.   }
  252.   // DELETE HELPER FUNCTIONS
  253.   // This lets the user describe a key that will indicate deleted
  254.   // table entries.  This key should be an "impossible" entry --
  255.   // if you try to insert it for real, you won't be able to retrieve it!
  256.   // (NB: while you pass in an entire value, only the key part is looked
  257.   // at.  This is just because I don't know how to assign just a key.)
  258.  private:
  259.   void squash_deleted() {           // gets rid of any deleted entries we have
  260.     if ( num_deleted ) {            // get rid of deleted before writing
  261.       dense_hashtable tmp(*this);   // copying will get rid of deleted
  262.       swap(tmp);                    // now we are tmp
  263.     }
  264.     assert(num_deleted == 0);
  265.   }
  266.  public:
  267.   void set_deleted_key(const value_type &val) {
  268.     // the empty indicator (if specified) and the deleted indicator
  269.     // must be different
  270.     assert(!use_empty || !equals(get_key(val), get_key(emptyval)));
  271.     // It's only safe to change what "deleted" means if we purge deleted guys
  272.     squash_deleted();
  273.     use_deleted = true;
  274.     set_value(&delval, val);
  275.   }
  276.   void clear_deleted_key() {
  277.     squash_deleted();
  278.     use_deleted = false;
  279.   }
  280.   // These are public so the iterators can use them
  281.   // True if the item at position bucknum is "deleted" marker
  282.   bool test_deleted(size_type bucknum) const {
  283.     // The num_deleted test is crucial for read(): after read(), the ht values
  284.     // are garbage, and we don't want to think some of them are deleted.
  285.     return (use_deleted && num_deleted > 0 &&
  286.             equals(get_key(delval), get_key(table[bucknum])));
  287.   }
  288.   bool test_deleted(const iterator &it) const {
  289.     return (use_deleted && num_deleted > 0 &&
  290.             equals(get_key(delval), get_key(*it)));
  291.   }
  292.   bool test_deleted(const const_iterator &it) const {
  293.     return (use_deleted && num_deleted > 0 &&
  294.             equals(get_key(delval), get_key(*it)));
  295.   }
  296.   // Set it so test_deleted is true.  true if object didn't used to be deleted
  297.   // See below (at erase()) to explain why we allow const_iterators
  298.   bool set_deleted(const_iterator &it) {
  299.     assert(use_deleted);             // bad if set_deleted_key() wasn't called
  300.     bool retval = !test_deleted(it);
  301.     // &* converts from iterator to value-type
  302.     set_value(const_cast<value_type*>(&(*it)), delval);
  303.     return retval;
  304.   }
  305.   // Set it so test_deleted is false.  true if object used to be deleted
  306.   bool clear_deleted(const_iterator &it) {
  307.     assert(use_deleted);             // bad if set_deleted_key() wasn't called
  308.     // happens automatically when we assign something else in its place
  309.     return test_deleted(it);
  310.   }
  311.   // EMPTY HELPER FUNCTIONS
  312.   // This lets the user describe a key that will indicate empty (unused)
  313.   // table entries.  This key should be an "impossible" entry --
  314.   // if you try to insert it for real, you won't be able to retrieve it!
  315.   // (NB: while you pass in an entire value, only the key part is looked
  316.   // at.  This is just because I don't know how to assign just a key.)
  317.  public:
  318.   // These are public so the iterators can use them
  319.   // True if the item at position bucknum is "empty" marker
  320.   bool test_empty(size_type bucknum) const {
  321.     assert(use_empty);              // we always need to know what's empty!
  322.     return equals(get_key(emptyval), get_key(table[bucknum]));
  323.   }
  324.   bool test_empty(const iterator &it) const {
  325.     assert(use_empty);              // we always need to know what's empty!
  326.     return equals(get_key(emptyval), get_key(*it));
  327.   }
  328.   bool test_empty(const const_iterator &it) const {
  329.     assert(use_empty);              // we always need to know what's empty!
  330.     return equals(get_key(emptyval), get_key(*it));
  331.   }
  332.  private:
  333.   // You can either set a range empty or an individual element
  334.   void set_empty(size_type bucknum) {
  335.     assert(use_empty);
  336.     set_value(&table[bucknum], emptyval);
  337.   }
  338.   void fill_range_with_empty(value_type* table_start, value_type* table_end) {
  339.     // Like set_empty(range), but doesn't destroy previous contents
  340.     STL_NAMESPACE::uninitialized_fill(table_start, table_end, emptyval);
  341.   }
  342.   void set_empty(size_type buckstart, size_type buckend) {
  343.     assert(use_empty);
  344.     destroy_buckets(buckstart, buckend);
  345.     fill_range_with_empty(table + buckstart, table + buckend);
  346.   }
  347.  public:
  348.   // TODO(csilvers): change all callers of this to pass in a key instead,
  349.   //                 and take a const key_type instead of const value_type.
  350.   void set_empty_key(const value_type &val) {
  351.     // Once you set the empty key, you can't change it
  352.     assert(!use_empty);
  353.     // The deleted indicator (if specified) and the empty indicator
  354.     // must be different.
  355.     assert(!use_deleted || !equals(get_key(val), get_key(delval)));
  356.     use_empty = true;
  357.     set_value(&emptyval, val);
  358.     assert(!table);                  // must set before first use
  359.     // num_buckets was set in constructor even though table was NULL
  360.     table = (value_type *) malloc(num_buckets * sizeof(*table));
  361.     assert(table);
  362.     fill_range_with_empty(table, table + num_buckets);
  363.   }
  364.   // FUNCTIONS CONCERNING SIZE
  365.  public:
  366.   size_type size() const      { return num_elements - num_deleted; }
  367.   // Buckets are always a power of 2
  368.   size_type max_size() const  { return (size_type(-1) >> 1U) + 1; }
  369.   bool empty() const          { return size() == 0; }
  370.   size_type bucket_count() const      { return num_buckets; }
  371.   size_type max_bucket_count() const  { return max_size(); }
  372.   size_type nonempty_bucket_count() const { return num_elements; }
  373.  private:
  374.   // Because of the above, size_type(-1) is never legal; use it for errors
  375.   static const size_type ILLEGAL_BUCKET = size_type(-1);
  376.  private:
  377.   // This is the smallest size a hashtable can be without being too crowded
  378.   // If you like, you can give a min #buckets as well as a min #elts
  379.   size_type min_size(size_type num_elts, size_type min_buckets_wanted) {
  380.     size_type sz = HT_MIN_BUCKETS;             // min buckets allowed
  381.     while ( sz < min_buckets_wanted || num_elts >= sz * HT_OCCUPANCY_FLT )
  382.       sz *= 2;
  383.     return sz;
  384.   }
  385.   // Used after a string of deletes
  386.   void maybe_shrink() {
  387.     assert(num_elements >= num_deleted);
  388.     assert((bucket_count() & (bucket_count()-1)) == 0); // is a power of two
  389.     assert(bucket_count() >= HT_MIN_BUCKETS);
  390.     if ( (num_elements-num_deleted) < shrink_threshold &&
  391.          bucket_count() > HT_MIN_BUCKETS ) {
  392.       size_type sz = bucket_count() / 2;    // find how much we should shrink
  393.       while ( sz > HT_MIN_BUCKETS &&
  394.               (num_elements - num_deleted) < sz * HT_EMPTY_FLT )
  395.         sz /= 2;                            // stay a power of 2
  396.       dense_hashtable tmp(*this, sz);       // Do the actual resizing
  397.       swap(tmp);                            // now we are tmp
  398.     }
  399.     consider_shrink = false;                // because we just considered it
  400.   }
  401.   // We'll let you resize a hashtable -- though this makes us copy all!
  402.   // When you resize, you say, "make it big enough for this many more elements"
  403.   void resize_delta(size_type delta, size_type min_buckets_wanted = 0) {
  404.     if ( consider_shrink )                   // see if lots of deletes happened
  405.       maybe_shrink();
  406.     if ( bucket_count() > min_buckets_wanted &&
  407.          (num_elements + delta) <= enlarge_threshold )
  408.       return;                                // we're ok as we are
  409.     const size_type resize_to = min_size(num_elements + delta,
  410.                                          min_buckets_wanted);
  411.     if ( resize_to > bucket_count() ) {      // we don't have enough buckets
  412.       dense_hashtable tmp(*this, resize_to);
  413.       swap(tmp);                             // now we are tmp
  414.     }
  415.   }
  416.   // Increase number of buckets, assuming value_type has trivial copy
  417.   // constructor and destructor.  (Really, we want it to have "trivial
  418.   // move", because that's what realloc does.  But there's no way to
  419.   // capture that using type_traits, so we pretend that move(x, y) is
  420.   // equivalent to "x.~T(); new(x) T(y);" which is pretty much
  421.   // correct, if a bit conservative.)
  422.   void expand_array(size_t resize_to, true_type) {
  423.     table = (value_type *) realloc(table, resize_to * sizeof(value_type));
  424.     assert(table);
  425.     fill_range_with_empty(table + num_buckets, table + resize_to);
  426.   }
  427.   // Increase number of buckets, without special assumptions about value_type.
  428.   // TODO(austern): make this exception safe. Handle exceptions from
  429.   // value_type's copy constructor.
  430.   void expand_array(size_t resize_to, false_type) {
  431.     value_type* new_table =
  432.       (value_type *) malloc(resize_to * sizeof(value_type));
  433.     assert(new_table);
  434.     STL_NAMESPACE::uninitialized_copy(table, table + num_buckets, new_table);
  435.     fill_range_with_empty(new_table + num_buckets, new_table + resize_to);
  436.     destroy_buckets(0, num_buckets);
  437.     free(table);
  438.     table = new_table;
  439.   }
  440.   // Used to actually do the rehashing when we grow/shrink a hashtable
  441.   void copy_from(const dense_hashtable &ht, size_type min_buckets_wanted = 0) {
  442.     clear();            // clear table, set num_deleted to 0
  443.     // If we need to change the size of our table, do it now
  444.     const size_type resize_to = min_size(ht.size(), min_buckets_wanted);
  445.     if ( resize_to > bucket_count() ) { // we don't have enough buckets
  446.       typedef integral_constant<bool,
  447.           (has_trivial_copy<value_type>::value &&
  448.            has_trivial_destructor<value_type>::value)>
  449.           realloc_ok; // we pretend mv(x,y) == "x.~T(); new(x) T(y)"
  450.       expand_array(resize_to, realloc_ok());
  451.       num_buckets = resize_to;
  452.       reset_thresholds();
  453.     }
  454.     // We use a normal iterator to get non-deleted bcks from ht
  455.     // We could use insert() here, but since we know there are
  456.     // no duplicates and no deleted items, we can be more efficient
  457.     assert((bucket_count() & (bucket_count()-1)) == 0);      // a power of two
  458.     for ( const_iterator it = ht.begin(); it != ht.end(); ++it ) {
  459.       size_type num_probes = 0;              // how many times we've probed
  460.       size_type bucknum;
  461.       const size_type bucket_count_minus_one = bucket_count() - 1;
  462.       for (bucknum = hash(get_key(*it)) & bucket_count_minus_one;
  463.            !test_empty(bucknum);                               // not empty
  464.            bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one) {
  465.         ++num_probes;
  466.         assert(num_probes < bucket_count()); // or else the hashtable is full
  467.       }
  468.       set_value(&table[bucknum], *it);       // copies the value to here
  469.       num_elements++;
  470.     }
  471.   }
  472.   // Required by the spec for hashed associative container
  473.  public:
  474.   // Though the docs say this should be num_buckets, I think it's much
  475.   // more useful as req_elements.  As a special feature, calling with
  476.   // req_elements==0 will cause us to shrink if we can, saving space.
  477.   void resize(size_type req_elements) {       // resize to this or larger
  478.     if ( consider_shrink || req_elements == 0 )
  479.       maybe_shrink();
  480.     if ( req_elements > num_elements )
  481.       return resize_delta(req_elements - num_elements, 0);
  482.   }
  483.   // CONSTRUCTORS -- as required by the specs, we take a size,
  484.   // but also let you specify a hashfunction, key comparator,
  485.   // and key extractor.  We also define a copy constructor and =.
  486.   // DESTRUCTOR -- needs to free the table
  487.   explicit dense_hashtable(size_type n = 0,
  488.                            const HashFcn& hf = HashFcn(),
  489.                            const EqualKey& eql = EqualKey(),
  490.                            const ExtractKey& ext = ExtractKey())
  491.     : hash(hf), equals(eql), get_key(ext), num_deleted(0),
  492.       use_deleted(false), use_empty(false),
  493.       delval(), emptyval(),
  494.       table(NULL), num_buckets(min_size(0, n)), num_elements(0) {
  495.     // table is NULL until emptyval is set.  However, we set num_buckets
  496.     // here so we know how much space to allocate once emptyval is set
  497.     reset_thresholds();
  498.   }
  499.   // As a convenience for resize(), we allow an optional second argument
  500.   // which lets you make this new hashtable a different size than ht
  501.   dense_hashtable(const dense_hashtable& ht, size_type min_buckets_wanted = 0)
  502.     : hash(ht.hash), equals(ht.equals), get_key(ht.get_key), num_deleted(0),
  503.       use_deleted(ht.use_deleted), use_empty(ht.use_empty),
  504.       delval(ht.delval), emptyval(ht.emptyval),
  505.       table(NULL), num_buckets(0),
  506.       num_elements(0) {
  507.     reset_thresholds();
  508.     copy_from(ht, min_buckets_wanted);   // copy_from() ignores deleted entries
  509.   }
  510.   dense_hashtable& operator= (const dense_hashtable& ht) {
  511.     if (&ht == this)  return *this;        // don't copy onto ourselves
  512.     clear();
  513.     hash = ht.hash;
  514.     equals = ht.equals;
  515.     get_key = ht.get_key;
  516.     use_deleted = ht.use_deleted;
  517.     use_empty = ht.use_empty;
  518.     set_value(&delval, ht.delval);
  519.     set_value(&emptyval, ht.emptyval);
  520.     copy_from(ht);                         // sets num_deleted to 0 too
  521.     return *this;
  522.   }
  523.   ~dense_hashtable() {
  524.     if (table) {
  525.       destroy_buckets(0, num_buckets);
  526.       free(table);
  527.     }
  528.   }
  529.   // Many STL algorithms use swap instead of copy constructors
  530.   void swap(dense_hashtable& ht) {
  531.     STL_NAMESPACE::swap(hash, ht.hash);
  532.     STL_NAMESPACE::swap(equals, ht.equals);
  533.     STL_NAMESPACE::swap(get_key, ht.get_key);
  534.     STL_NAMESPACE::swap(num_deleted, ht.num_deleted);
  535.     STL_NAMESPACE::swap(use_deleted, ht.use_deleted);
  536.     STL_NAMESPACE::swap(use_empty, ht.use_empty);
  537.     { value_type tmp;     // for annoying reasons, swap() doesn't work
  538.       set_value(&tmp, delval);
  539.       set_value(&delval, ht.delval);
  540.       set_value(&ht.delval, tmp);
  541.     }
  542.     { value_type tmp;     // for annoying reasons, swap() doesn't work
  543.       set_value(&tmp, emptyval);
  544.       set_value(&emptyval, ht.emptyval);
  545.       set_value(&ht.emptyval, tmp);
  546.     }
  547.     STL_NAMESPACE::swap(table, ht.table);
  548.     STL_NAMESPACE::swap(num_buckets, ht.num_buckets);
  549.     STL_NAMESPACE::swap(num_elements, ht.num_elements);
  550.     reset_thresholds();
  551.     ht.reset_thresholds();
  552.   }
  553.   // It's always nice to be able to clear a table without deallocating it
  554.   void clear() {
  555.     if (table)
  556.       destroy_buckets(0, num_buckets);
  557.     num_buckets = min_size(0,0);          // our new size
  558.     reset_thresholds();
  559.     table = (value_type *) realloc(table, num_buckets * sizeof(*table));
  560.     assert(table);
  561.     fill_range_with_empty(table, table + num_buckets);
  562.     num_elements = 0;
  563.     num_deleted = 0;
  564.   }
  565.   // Clear the table without resizing it.
  566.   // Mimicks the stl_hashtable's behaviour when clear()-ing in that it
  567.   // does not modify the bucket count
  568.   void clear_no_resize() {
  569.     if (table) {
  570.       set_empty(0, num_buckets);
  571.     }
  572.     // don't consider to shrink before another erase()
  573.     reset_thresholds();
  574.     num_elements = 0;
  575.     num_deleted = 0;
  576.   }
  577.   // LOOKUP ROUTINES
  578.  private:
  579.   // Returns a pair of positions: 1st where the object is, 2nd where
  580.   // it would go if you wanted to insert it.  1st is ILLEGAL_BUCKET
  581.   // if object is not found; 2nd is ILLEGAL_BUCKET if it is.
  582.   // Note: because of deletions where-to-insert is not trivial: it's the
  583.   // first deleted bucket we see, as long as we don't find the key later
  584.   pair<size_type, size_type> find_position(const key_type &key) const {
  585.     size_type num_probes = 0;              // how many times we've probed
  586.     const size_type bucket_count_minus_one = bucket_count() - 1;
  587.     size_type bucknum = hash(key) & bucket_count_minus_one;
  588.     size_type insert_pos = ILLEGAL_BUCKET; // where we would insert
  589.     while ( 1 ) {                          // probe until something happens
  590.       if ( test_empty(bucknum) ) {         // bucket is empty
  591.         if ( insert_pos == ILLEGAL_BUCKET )   // found no prior place to insert
  592.           return pair<size_type,size_type>(ILLEGAL_BUCKET, bucknum);
  593.         else
  594.           return pair<size_type,size_type>(ILLEGAL_BUCKET, insert_pos);
  595.       } else if ( test_deleted(bucknum) ) {// keep searching, but mark to insert
  596.         if ( insert_pos == ILLEGAL_BUCKET )
  597.           insert_pos = bucknum;
  598.       } else if ( equals(key, get_key(table[bucknum])) ) {
  599.         return pair<size_type,size_type>(bucknum, ILLEGAL_BUCKET);
  600.       }
  601.       ++num_probes;                        // we're doing another probe
  602.       bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one;
  603.       assert(num_probes < bucket_count()); // don't probe too many times!
  604.     }
  605.   }
  606.  public:
  607.   iterator find(const key_type& key) {
  608.     if ( size() == 0 ) return end();
  609.     pair<size_type, size_type> pos = find_position(key);
  610.     if ( pos.first == ILLEGAL_BUCKET )     // alas, not there
  611.       return end();
  612.     else
  613.       return iterator(this, table + pos.first, table + num_buckets, false);
  614.   }
  615.   const_iterator find(const key_type& key) const {
  616.     if ( size() == 0 ) return end();
  617.     pair<size_type, size_type> pos = find_position(key);
  618.     if ( pos.first == ILLEGAL_BUCKET )     // alas, not there
  619.       return end();
  620.     else
  621.       return const_iterator(this, table + pos.first, table+num_buckets, false);
  622.   }
  623.   // Counts how many elements have key key.  For maps, it's either 0 or 1.
  624.   size_type count(const key_type &key) const {
  625.     pair<size_type, size_type> pos = find_position(key);
  626.     return pos.first == ILLEGAL_BUCKET ? 0 : 1;
  627.   }
  628.   // Likewise, equal_range doesn't really make sense for us.  Oh well.
  629.   pair<iterator,iterator> equal_range(const key_type& key) {
  630.     const iterator pos = find(key);      // either an iterator or end
  631.     return pair<iterator,iterator>(pos, pos);
  632.   }
  633.   pair<const_iterator,const_iterator> equal_range(const key_type& key) const {
  634.     const const_iterator pos = find(key);      // either an iterator or end
  635.     return pair<iterator,iterator>(pos, pos);
  636.   }
  637.   // INSERTION ROUTINES
  638.  private:
  639.   // If you know *this is big enough to hold obj, use this routine
  640.   pair<iterator, bool> insert_noresize(const value_type& obj) {
  641.     const pair<size_type,size_type> pos = find_position(get_key(obj));
  642.     if ( pos.first != ILLEGAL_BUCKET) {      // object was already there
  643.       return pair<iterator,bool>(iterator(this, table + pos.first,
  644.                                           table + num_buckets, false),
  645.                                  false);          // false: we didn't insert
  646.     } else {                                 // pos.second says where to put it
  647.       if ( test_deleted(pos.second) ) {      // just replace if it's been del.
  648.         const_iterator delpos(this, table + pos.second,              // shrug:
  649.                               table + num_buckets, false);// shouldn't need const
  650.         clear_deleted(delpos);
  651.         assert( num_deleted > 0);
  652.         --num_deleted;                       // used to be, now it isn't
  653.       } else {
  654.         ++num_elements;                      // replacing an empty bucket
  655.       }
  656.       set_value(&table[pos.second], obj);
  657.       return pair<iterator,bool>(iterator(this, table + pos.second,
  658.                                           table + num_buckets, false),
  659.                                  true);           // true: we did insert
  660.     }
  661.   }
  662.  public:
  663.   // This is the normal insert routine, used by the outside world
  664.   pair<iterator, bool> insert(const value_type& obj) {
  665.     resize_delta(1);                      // adding an object, grow if need be
  666.     return insert_noresize(obj);
  667.   }
  668.   // When inserting a lot at a time, we specialize on the type of iterator
  669.   template <class InputIterator>
  670.   void insert(InputIterator f, InputIterator l) {
  671.     // specializes on iterator type
  672.     insert(f, l, typename STL_NAMESPACE::iterator_traits<InputIterator>::iterator_category());
  673.   }
  674.   // Iterator supports operator-, resize before inserting
  675.   template <class ForwardIterator>
  676.   void insert(ForwardIterator f, ForwardIterator l,
  677.               STL_NAMESPACE::forward_iterator_tag) {
  678.     size_type n = STL_NAMESPACE::distance(f, l);   // TODO(csilvers): standard?
  679.     resize_delta(n);
  680.     for ( ; n > 0; --n, ++f)
  681.       insert_noresize(*f);
  682.   }
  683.   // Arbitrary iterator, can't tell how much to resize
  684.   template <class InputIterator>
  685.   void insert(InputIterator f, InputIterator l,
  686.               STL_NAMESPACE::input_iterator_tag) {
  687.     for ( ; f != l; ++f)
  688.       insert(*f);
  689.   }
  690.   // DELETION ROUTINES
  691.   size_type erase(const key_type& key) {
  692.     const_iterator pos = find(key);   // shrug: shouldn't need to be const
  693.     if ( pos != end() ) {
  694.       assert(!test_deleted(pos));  // or find() shouldn't have returned it
  695.       set_deleted(pos);
  696.       ++num_deleted;
  697.       consider_shrink = true;      // will think about shrink after next insert
  698.       return 1;                    // because we deleted one thing
  699.     } else {
  700.       return 0;                    // because we deleted nothing
  701.     }
  702.   }
  703.   // This is really evil: really it should be iterator, not const_iterator.
  704.   // But...the only reason keys are const is to allow lookup.
  705.   // Since that's a moot issue for deleted keys, we allow const_iterators
  706.   void erase(const_iterator pos) {
  707.     if ( pos == end() ) return;    // sanity check
  708.     if ( set_deleted(pos) ) {      // true if object has been newly deleted
  709.       ++num_deleted;
  710.       consider_shrink = true;      // will think about shrink after next insert
  711.     }
  712.   }
  713.   void erase(const_iterator f, const_iterator l) {
  714.     for ( ; f != l; ++f) {
  715.       if ( set_deleted(f)  )       // should always be true
  716.         ++num_deleted;
  717.     }
  718.     consider_shrink = true;        // will think about shrink after next insert
  719.   }
  720.   // COMPARISON
  721.   bool operator==(const dense_hashtable& ht) const {
  722.     // We really want to check that the hash functions are the same
  723.     // but alas there's no way to do this.  We just hope.
  724.     return ( num_deleted == ht.num_deleted && table == ht.table );
  725.   }
  726.   bool operator!=(const dense_hashtable& ht) const {
  727.     return !(*this == ht);
  728.   }
  729.   // I/O
  730.   // We support reading and writing hashtables to disk.  Alas, since
  731.   // I don't know how to write a hasher or key_equal, you have to make
  732.   // sure everything but the table is the same.  We compact before writing
  733.   //
  734.   // NOTE: These functions are currently TODO.  They've not been implemented.
  735.   bool write_metadata(FILE *fp) {
  736.     squash_deleted();           // so we don't have to worry about delval
  737.     return false;               // TODO
  738.   }
  739.   bool read_metadata(FILE *fp) {
  740.     num_deleted = 0;            // since we got rid before writing
  741.     assert(use_empty);          // have to set this before calling us
  742.     if (table)  free(table);    // we'll make our own
  743.     // TODO: read magic number
  744.     // TODO: read num_buckets
  745.     reset_thresholds();
  746.     table = (value_type *) malloc(num_buckets * sizeof(*table));
  747.     assert(table);
  748.     fill_range_with_empty(table, table + num_buckets);
  749.     // TODO: read num_elements
  750.     for ( size_type i = 0; i < num_elements; ++i ) {
  751.       // TODO: read bucket_num
  752.       // TODO: set with non-empty, non-deleted value
  753.     }
  754.     return false;               // TODO
  755.   }
  756.   // If your keys and values are simple enough, we can write them to
  757.   // disk for you.  "simple enough" means value_type is a POD type
  758.   // that contains no pointers.  However, we don't try to normalize
  759.   // endianness
  760.   bool write_nopointer_data(FILE *fp) const {
  761.     for ( const_iterator it = begin(); it != end(); ++it ) {
  762.       // TODO: skip empty/deleted values
  763.       if ( !fwrite(&*it, sizeof(*it), 1, fp) )  return false;
  764.     }
  765.     return false;
  766.   }
  767.   // When reading, we have to override the potential const-ness of *it
  768.   bool read_nopointer_data(FILE *fp) {
  769.     for ( iterator it = begin(); it != end(); ++it ) {
  770.       // TODO: skip empty/deleted values
  771.       if ( !fread(reinterpret_cast<void*>(&(*it)), sizeof(*it), 1, fp) )
  772.         return false;
  773.     }
  774.     return false;
  775.   }
  776.  private:
  777.   // The actual data
  778.   hasher hash;                      // required by hashed_associative_container
  779.   key_equal equals;
  780.   ExtractKey get_key;
  781.   size_type num_deleted;        // how many occupied buckets are marked deleted
  782.   bool use_deleted;                          // false until delval has been set
  783.   bool use_empty;                          // you must do this before you start
  784.   value_type delval;                         // which key marks deleted entries
  785.   value_type emptyval;                        // which key marks unused entries
  786.   value_type *table;
  787.   size_type num_buckets;
  788.   size_type num_elements;
  789.   size_type shrink_threshold;                     // num_buckets * HT_EMPTY_FLT
  790.   size_type enlarge_threshold;                // num_buckets * HT_OCCUPANCY_FLT
  791.   bool consider_shrink;   // true if we should try to shrink before next insert
  792.   void reset_thresholds() {
  793.     enlarge_threshold = static_cast<size_type>(num_buckets*HT_OCCUPANCY_FLT);
  794.     shrink_threshold = static_cast<size_type>(num_buckets*HT_EMPTY_FLT);
  795.     consider_shrink = false;   // whatever caused us to reset already considered
  796.   }
  797. };
  798. // We need a global swap as well
  799. template <class V, class K, class HF, class ExK, class EqK, class A>
  800. inline void swap(dense_hashtable<V,K,HF,ExK,EqK,A> &x,
  801.                  dense_hashtable<V,K,HF,ExK,EqK,A> &y) {
  802.   x.swap(y);
  803. }
  804. #undef JUMP_
  805. template <class V, class K, class HF, class ExK, class EqK, class A>
  806. const typename dense_hashtable<V,K,HF,ExK,EqK,A>::size_type
  807.   dense_hashtable<V,K,HF,ExK,EqK,A>::ILLEGAL_BUCKET;
  808. // How full we let the table get before we resize.  Knuth says .8 is
  809. // good -- higher causes us to probe too much, though saves memory
  810. template <class V, class K, class HF, class ExK, class EqK, class A>
  811. const float dense_hashtable<V,K,HF,ExK,EqK,A>::HT_OCCUPANCY_FLT = 0.5f;
  812. // How empty we let the table get before we resize lower.
  813. // It should be less than OCCUPANCY_FLT / 2 or we thrash resizing
  814. template <class V, class K, class HF, class ExK, class EqK, class A>
  815. const float dense_hashtable<V,K,HF,ExK,EqK,A>::HT_EMPTY_FLT = 0.4f *
  816. dense_hashtable<V,K,HF,ExK,EqK,A>::HT_OCCUPANCY_FLT;
  817. _END_GOOGLE_NAMESPACE_
  818. #endif /* _DENSEHASHTABLE_H_ */