diff options
| author | Paul Baltescu <pauldb89@gmail.com> | 2013-06-19 15:06:34 +0100 | 
|---|---|---|
| committer | Paul Baltescu <pauldb89@gmail.com> | 2013-06-19 15:06:34 +0100 | 
| commit | 459775095b46b4625ce26ea5a34001ec74ab3aa8 (patch) | |
| tree | 844d1a650a302114ae619d37b8778ab66207a834 /klm/util/probing_hash_table.hh | |
| parent | 02099a01350a41a99ec400e9b29df08a01d88979 (diff) | |
| parent | 0dc7755f7fb1ef15db5a60c70866aa61b6367898 (diff) | |
Merge branch 'master' of https://github.com/redpony/cdec
Diffstat (limited to 'klm/util/probing_hash_table.hh')
| -rw-r--r-- | klm/util/probing_hash_table.hh | 23 | 
1 files changed, 22 insertions, 1 deletions
| diff --git a/klm/util/probing_hash_table.hh b/klm/util/probing_hash_table.hh index 57866ff9..51a2944d 100644 --- a/klm/util/probing_hash_table.hh +++ b/klm/util/probing_hash_table.hh @@ -109,9 +109,20 @@ template <class EntryT, class HashT, class EqualT = std::equal_to<typename Entry          if (equal_(got, key)) { out = i; return true; }          if (equal_(got, invalid_)) return false;          if (++i == end_) i = begin_; -      }    +      } +    } + +    // Like UnsafeMutableFind, but the key must be there. +    template <class Key> MutableIterator UnsafeMutableMustFind(const Key key) { +       for (MutableIterator i(begin_ + (hash_(key) % buckets_));;) { +        Key got(i->GetKey()); +        if (equal_(got, key)) { return i; } +        assert(!equal_(got, invalid_)); +        if (++i == end_) i = begin_; +      }      } +      template <class Key> bool Find(const Key key, ConstIterator &out) const {  #ifdef DEBUG        assert(initialized_); @@ -124,6 +135,16 @@ template <class EntryT, class HashT, class EqualT = std::equal_to<typename Entry        }          } +    // Like Find but we're sure it must be there. +    template <class Key> ConstIterator MustFind(const Key key) const { +      for (ConstIterator i(begin_ + (hash_(key) % buckets_));;) { +        Key got(i->GetKey()); +        if (equal_(got, key)) { return i; } +        assert(!equal_(got, invalid_)); +        if (++i == end_) i = begin_; +      } +    } +      void Clear() {        Entry invalid;        invalid.SetKey(invalid_); | 
