Coverage Report

Created: 2025-05-21 07:12

/src/aspell/common/hash.hpp
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) 2001,2011
2
// Kevin Atkinson
3
//
4
// Permission to use, copy, modify, distribute and sell this software
5
// and its documentation for any purpose is hereby granted without
6
// fee, provided that the above copyright notice appear in all copies
7
// and that both that copyright notice and this permission notice
8
// appear in supporting documentation.  No representations about the
9
// suitability of this software for any purpose.  It is provided "as
10
// is" without express or implied warranty.
11
12
#ifndef autil__hash_hh
13
#define autil__hash_hh
14
15
#include <utility>
16
#include <functional>
17
18
#include "settings.h"
19
20
#include "hash_fun.hpp"
21
#include "block_slist.hpp"
22
23
// This file provided implementation for hash_set, hash_multiset, hash_map
24
//   and hash_multimap which are very similar to SGI STL's implementation
25
//   with a few notable exceptions.  The main one is that while 
26
//   const_iterator is never invalided until the actual element is removed
27
//   iterator is invalided my most all non-const member functions.  This
28
//   is to simply the implementation slightly and allow the removal 
29
//   of an element in guaranteed constant time when a non-const iterator
30
//   is provided rather that normally constant time.
31
32
// All of the hash_* implementations are derived from the HashTable class
33
34
namespace acommon {
35
36
  // Parms is expected to have the following methods
37
  //   typename Value
38
  //   typename Key
39
  //   bool is_multi;
40
  //   Size hash(Key)
41
  //   bool equal(Key, Key)
42
  //   Key key(Value)
43
44
  template <class Value>
45
  class HT_ConstIterator;
46
47
  template <class Value>
48
  class HT_Iterator {
49
  public: // but don't use
50
    typedef typename BlockSList<Value>::Node Node;
51
    Node * * t;
52
    Node * * n;
53
1.00M
    void adv() {while (*t == 0) ++t; n = t;}
acommon::HT_Iterator<acommon::StringPair>::adv()
Line
Count
Source
53
959k
    void adv() {while (*t == 0) ++t; n = t;}
acommon::HT_Iterator<char const*>::adv()
Line
Count
Source
53
46.1k
    void adv() {while (*t == 0) ++t; n = t;}
54
509k
    void inc() {n = &(*n)->next; if (*n == 0) {++t; adv();}}
acommon::HT_Iterator<acommon::StringPair>::inc()
Line
Count
Source
54
509k
    void inc() {n = &(*n)->next; if (*n == 0) {++t; adv();}}
Unexecuted instantiation: acommon::HT_Iterator<char const*>::inc()
55
12.9k
    HT_Iterator(Node * * t0) : t(t0) {adv();}
acommon::HT_Iterator<acommon::StringPair>::HT_Iterator(acommon::BlockSList<acommon::StringPair>::Node**)
Line
Count
Source
55
12.0k
    HT_Iterator(Node * * t0) : t(t0) {adv();}
acommon::HT_Iterator<char const*>::HT_Iterator(acommon::BlockSList<char const*>::Node**)
Line
Count
Source
55
854
    HT_Iterator(Node * * t0) : t(t0) {adv();}
56
58.1M
    HT_Iterator(Node * * t0, Node * * n0) : t(t0), n(n0) {}
acommon::HT_Iterator<acommon::StringPair>::HT_Iterator(acommon::BlockSList<acommon::StringPair>::Node**, acommon::BlockSList<acommon::StringPair>::Node**)
Line
Count
Source
56
1.21M
    HT_Iterator(Node * * t0, Node * * n0) : t(t0), n(n0) {}
acommon::HT_Iterator<aspeller::Conds const*>::HT_Iterator(acommon::BlockSList<aspeller::Conds const*>::Node**, acommon::BlockSList<aspeller::Conds const*>::Node**)
Line
Count
Source
56
1.93M
    HT_Iterator(Node * * t0, Node * * n0) : t(t0), n(n0) {}
acommon::HT_Iterator<char const*>::HT_Iterator(acommon::BlockSList<char const*>::Node**, acommon::BlockSList<char const*>::Node**)
Line
Count
Source
56
54.9M
    HT_Iterator(Node * * t0, Node * * n0) : t(t0), n(n0) {}
Unexecuted instantiation: acommon::HT_Iterator<std::__1::pair<char const* const, acommon::Vector<char const*> > >::HT_Iterator(acommon::BlockSList<std::__1::pair<char const* const, acommon::Vector<char const*> > >::Node**, acommon::BlockSList<std::__1::pair<char const* const, acommon::Vector<char const*> > >::Node**)
57
  public:
58
10.9k
    HT_Iterator() : t(0), n(0) {}
59
    explicit HT_Iterator(const HT_ConstIterator<Value> & other);
60
923k
    Value & operator*() const {return (*n)->data;}
acommon::HT_Iterator<aspeller::Conds const*>::operator*() const
Line
Count
Source
60
923k
    Value & operator*() const {return (*n)->data;}
Unexecuted instantiation: acommon::HT_Iterator<char const*>::operator*() const
Unexecuted instantiation: acommon::HT_Iterator<std::__1::pair<char const* const, acommon::Vector<char const*> > >::operator*() const
61
2.10M
    Value * operator->() const {return &(*n)->data;}
62
509k
    HT_Iterator & operator++() {inc(); return *this;}
acommon::HT_Iterator<acommon::StringPair>::operator++()
Line
Count
Source
62
509k
    HT_Iterator & operator++() {inc(); return *this;}
Unexecuted instantiation: acommon::HT_Iterator<char const*>::operator++()
63
    HT_Iterator operator++(int) {HT_Iterator tmp(*this); inc(); return tmp;}
64
  };
65
66
  template <class Value>
67
  class HT_ConstIterator
68
  {
69
  public: // but don't use
70
    typedef typename BlockSList<Value>::Node Node;
71
    Node * * t;
72
    Node * n;
73
2.12M
    void adv() {while (*t == 0) ++t; n = *t;}
Unexecuted instantiation: acommon::HT_ConstIterator<acommon::StringPair>::adv()
Unexecuted instantiation: acommon::HT_ConstIterator<char const*>::adv()
acommon::HT_ConstIterator<std::__1::pair<char const* const, acommon::Vector<char const*> > >::adv()
Line
Count
Source
73
2.12M
    void adv() {while (*t == 0) ++t; n = *t;}
74
0
    void inc() {n = n->next; if (n == 0) {++t; adv();}}
Unexecuted instantiation: acommon::HT_ConstIterator<acommon::StringPair>::inc()
Unexecuted instantiation: acommon::HT_ConstIterator<char const*>::inc()
Unexecuted instantiation: acommon::HT_ConstIterator<std::__1::pair<char const* const, acommon::Vector<char const*> > >::inc()
75
39.3k
    HT_ConstIterator(Node * * t0) : t(t0) {adv();}
Unexecuted instantiation: acommon::HT_ConstIterator<acommon::StringPair>::HT_ConstIterator(acommon::BlockSList<acommon::StringPair>::Node**)
acommon::HT_ConstIterator<std::__1::pair<char const* const, acommon::Vector<char const*> > >::HT_ConstIterator(acommon::BlockSList<std::__1::pair<char const* const, acommon::Vector<char const*> > >::Node**)
Line
Count
Source
75
39.3k
    HT_ConstIterator(Node * * t0) : t(t0) {adv();}
76
367k
    HT_ConstIterator(Node * * t0, Node * n0) : t(t0), n(n0) {}
acommon::HT_ConstIterator<acommon::StringPair>::HT_ConstIterator(acommon::BlockSList<acommon::StringPair>::Node**, acommon::BlockSList<acommon::StringPair>::Node*)
Line
Count
Source
76
328k
    HT_ConstIterator(Node * * t0, Node * n0) : t(t0), n(n0) {}
acommon::HT_ConstIterator<std::__1::pair<char const* const, acommon::Vector<char const*> > >::HT_ConstIterator(acommon::BlockSList<std::__1::pair<char const* const, acommon::Vector<char const*> > >::Node**, acommon::BlockSList<std::__1::pair<char const* const, acommon::Vector<char const*> > >::Node*)
Line
Count
Source
76
39.3k
    HT_ConstIterator(Node * * t0, Node * n0) : t(t0), n(n0) {}
77
  public:
78
    HT_ConstIterator() : t(0), n(0) {}
79
328k
    HT_ConstIterator(const HT_Iterator<Value> & other) : t(other.t), n(*other.n) {}
acommon::HT_ConstIterator<acommon::StringPair>::HT_ConstIterator(acommon::HT_Iterator<acommon::StringPair> const&)
Line
Count
Source
79
328k
    HT_ConstIterator(const HT_Iterator<Value> & other) : t(other.t), n(*other.n) {}
Unexecuted instantiation: acommon::HT_ConstIterator<char const*>::HT_ConstIterator(acommon::HT_Iterator<char const*> const&)
Unexecuted instantiation: acommon::HT_ConstIterator<std::__1::pair<char const* const, acommon::Vector<char const*> > >::HT_ConstIterator(acommon::HT_Iterator<std::__1::pair<char const* const, acommon::Vector<char const*> > > const&)
80
0
    Value & operator*() const {return n->data;}
Unexecuted instantiation: acommon::HT_ConstIterator<acommon::StringPair>::operator*() const
Unexecuted instantiation: acommon::HT_ConstIterator<char const*>::operator*() const
81
13.2k
    Value * operator->() const {return &n->data;}
acommon::HT_ConstIterator<acommon::StringPair>::operator->() const
Line
Count
Source
81
13.2k
    Value * operator->() const {return &n->data;}
Unexecuted instantiation: acommon::HT_ConstIterator<std::__1::pair<char const* const, acommon::Vector<char const*> > >::operator->() const
82
0
    HT_ConstIterator & operator++() {inc(); return *this;}
Unexecuted instantiation: acommon::HT_ConstIterator<acommon::StringPair>::operator++()
Unexecuted instantiation: acommon::HT_ConstIterator<char const*>::operator++()
Unexecuted instantiation: acommon::HT_ConstIterator<std::__1::pair<char const* const, acommon::Vector<char const*> > >::operator++()
83
    HT_ConstIterator operator++(int) {HT_ConstIterator tmp(*this); inc(); return tmp;}
84
  };
85
  
86
  template <typename P>
87
  class HashTable 
88
  {
89
  public:
90
    typedef P                     parms_type;
91
    typedef parms_type            Parms;
92
93
    typedef typename Parms::Value value_type;
94
    typedef value_type            Value;
95
96
    typedef typename Parms::Key  key_type;
97
    typedef key_type              Key;
98
99
    typedef unsigned int          size_type;
100
    typedef size_type             Size;
101
102
  public: // but don't use
103
    typedef BlockSList<Value>       NodePool;
104
    typedef typename NodePool::Node Node;
105
106
  private:
107
    typedef unsigned int      PrimeIndex;
108
109
    Size              size_;
110
    Node * *          table_;     // always one larger than table_size_;
111
    Node * *          table_end_; // always at true table_end - 1
112
    Size              table_size_;
113
    PrimeIndex        prime_index_;
114
    NodePool          node_pool_;
115
    Parms             parms_;
116
117
  public:
118
119
    typedef HT_Iterator<Value>      iterator;
120
    typedef HT_ConstIterator<Value> const_iterator;
121
122
  private:
123
    void del();
124
    void init(PrimeIndex);
125
    void copy(const HashTable & other);
126
    PrimeIndex next_largest(Size);
127
    void resize_i(PrimeIndex);
128
    void create_table(PrimeIndex);
129
    iterator find_i(const Key &, bool & have);
130
    std::pair<iterator, iterator> equal_range_i(const Key & to_find, int & c);
131
    
132
  public:
133
    
134
14.1k
    HashTable() {init(0);}
acommon::HashTable<acommon::StringMap::Parms>::HashTable()
Line
Count
Source
134
13.2k
    HashTable() {init(0);}
acommon::HashTable<aspeller::CondsLookupParms>::HashTable()
Line
Count
Source
134
864
    HashTable() {init(0);}
135
    HashTable(const Parms & p) : parms_(p) {init(0);}
136
    HashTable(int size) : prime_index_(0) {init(next_largest(size));}
137
    HashTable(int size, const Parms & p) 
138
16.2k
      : prime_index_(0), parms_(p) {init(next_largest(size));}
acommon::HashTable<acommon::HashSetParms<char const*, acommon::hash<char const*>, std::__1::equal_to<char const*>, false> >::HashTable(int, acommon::HashSetParms<char const*, acommon::hash<char const*>, std::__1::equal_to<char const*>, false> const&)
Line
Count
Source
138
199
      : prime_index_(0), parms_(p) {init(next_largest(size));}
suggest.cpp:acommon::HashTable<acommon::HashSetParms<char const*, acommon::hash<char const*>, (anonymous namespace)::StrEquals, false> >::HashTable(int, acommon::HashSetParms<char const*, acommon::hash<char const*>, (anonymous namespace)::StrEquals, false> const&)
Line
Count
Source
138
10.9k
      : prime_index_(0), parms_(p) {init(next_largest(size));}
acommon::HashTable<acommon::HashMapParms<char const*, acommon::Vector<char const*>, acommon::hash<char const*>, std::__1::equal_to<char const*>, false> >::HashTable(int, acommon::HashMapParms<char const*, acommon::Vector<char const*>, acommon::hash<char const*>, std::__1::equal_to<char const*>, false> const&)
Line
Count
Source
138
2.56k
      : prime_index_(0), parms_(p) {init(next_largest(size));}
writable.cpp:acommon::HashTable<acommon::HashSetParms<char const*, (anonymous namespace)::Hash, (anonymous namespace)::Equal, true> >::HashTable(int, acommon::HashSetParms<char const*, (anonymous namespace)::Hash, (anonymous namespace)::Equal, true> const&)
Line
Count
Source
138
2.56k
      : prime_index_(0), parms_(p) {init(next_largest(size));}
139
140
    HashTable(const HashTable & other) {copy(other);}
141
12.0k
    HashTable& operator=(const HashTable & other) {del(); copy(other); return *this;}
142
30.2k
    ~HashTable() {del();}
acommon::HashTable<acommon::StringMap::Parms>::~HashTable()
Line
Count
Source
142
13.0k
    ~HashTable() {del();}
acommon::HashTable<aspeller::CondsLookupParms>::~HashTable()
Line
Count
Source
142
864
    ~HashTable() {del();}
acommon::HashTable<acommon::HashSetParms<char const*, acommon::hash<char const*>, std::__1::equal_to<char const*>, false> >::~HashTable()
Line
Count
Source
142
199
    ~HashTable() {del();}
suggest.cpp:acommon::HashTable<acommon::HashSetParms<char const*, acommon::hash<char const*>, (anonymous namespace)::StrEquals, false> >::~HashTable()
Line
Count
Source
142
10.9k
    ~HashTable() {del();}
acommon::HashTable<acommon::HashMapParms<char const*, acommon::Vector<char const*>, acommon::hash<char const*>, std::__1::equal_to<char const*>, false> >::~HashTable()
Line
Count
Source
142
2.56k
    ~HashTable() {del();}
writable.cpp:acommon::HashTable<acommon::HashSetParms<char const*, (anonymous namespace)::Hash, (anonymous namespace)::Equal, true> >::~HashTable()
Line
Count
Source
142
2.56k
    ~HashTable() {del();}
143
12.9k
    iterator begin() {return iterator(table_);}
acommon::HashTable<acommon::StringMap::Parms>::begin()
Line
Count
Source
143
12.0k
    iterator begin() {return iterator(table_);}
writable.cpp:acommon::HashTable<acommon::HashSetParms<char const*, (anonymous namespace)::Hash, (anonymous namespace)::Equal, true> >::begin()
Line
Count
Source
143
854
    iterator begin() {return iterator(table_);}
144
30.8M
    iterator end()   {return iterator(table_end_, table_end_);}
acommon::HashTable<acommon::StringMap::Parms>::end()
Line
Count
Source
144
836k
    iterator end()   {return iterator(table_end_, table_end_);}
acommon::HashTable<aspeller::CondsLookupParms>::end()
Line
Count
Source
144
967k
    iterator end()   {return iterator(table_end_, table_end_);}
writable.cpp:acommon::HashTable<acommon::HashSetParms<char const*, (anonymous namespace)::Hash, (anonymous namespace)::Equal, true> >::end()
Line
Count
Source
144
29.0M
    iterator end()   {return iterator(table_end_, table_end_);}
Unexecuted instantiation: acommon::HashTable<acommon::HashMapParms<char const*, acommon::Vector<char const*>, acommon::hash<char const*>, std::__1::equal_to<char const*>, false> >::end()
145
39.3k
    const_iterator begin() const {return const_iterator(table_);}
Unexecuted instantiation: acommon::HashTable<acommon::StringMap::Parms>::begin() const
acommon::HashTable<acommon::HashMapParms<char const*, acommon::Vector<char const*>, acommon::hash<char const*>, std::__1::equal_to<char const*>, false> >::begin() const
Line
Count
Source
145
39.3k
    const_iterator begin() const {return const_iterator(table_);}
146
367k
    const_iterator end()   const {return const_iterator(table_end_,*table_end_);}
acommon::HashTable<acommon::StringMap::Parms>::end() const
Line
Count
Source
146
328k
    const_iterator end()   const {return const_iterator(table_end_,*table_end_);}
acommon::HashTable<acommon::HashMapParms<char const*, acommon::Vector<char const*>, acommon::hash<char const*>, std::__1::equal_to<char const*>, false> >::end() const
Line
Count
Source
146
39.3k
    const_iterator end()   const {return const_iterator(table_end_,*table_end_);}
147
11.0k
    size_type size() const  {return size_;}
Unexecuted instantiation: acommon::HashTable<acommon::StringMap::Parms>::size() const
writable.cpp:acommon::HashTable<acommon::HashSetParms<char const*, (anonymous namespace)::Hash, (anonymous namespace)::Equal, true> >::size() const
Line
Count
Source
147
11.0k
    size_type size() const  {return size_;}
148
0
    bool      empty() const {return size_ + 1;}
Unexecuted instantiation: acommon::HashTable<acommon::StringMap::Parms>::empty() const
Unexecuted instantiation: writable.cpp:acommon::HashTable<acommon::HashSetParms<char const*, (anonymous namespace)::Hash, (anonymous namespace)::Equal, true> >::empty() const
149
    std::pair<iterator,bool> insert(const value_type &); 
150
    void erase(iterator);
151
    size_type erase(const key_type &);
152
13.0k
    void clear() {del(), init(0);}
acommon::HashTable<acommon::StringMap::Parms>::clear()
Line
Count
Source
152
13.0k
    void clear() {del(), init(0);}
Unexecuted instantiation: writable.cpp:acommon::HashTable<acommon::HashSetParms<char const*, (anonymous namespace)::Hash, (anonymous namespace)::Equal, true> >::clear()
Unexecuted instantiation: acommon::HashTable<acommon::HashMapParms<char const*, acommon::Vector<char const*>, acommon::hash<char const*>, std::__1::equal_to<char const*>, false> >::clear()
153
1.27M
    iterator find(const key_type & to_find) {
154
1.27M
      bool h; 
155
1.27M
      iterator i = find_i(to_find,h);
156
1.27M
      return h ? i : end();
157
1.27M
    }
acommon::HashTable<acommon::StringMap::Parms>::find(char const* const&)
Line
Count
Source
153
328k
    iterator find(const key_type & to_find) {
154
328k
      bool h; 
155
328k
      iterator i = find_i(to_find,h);
156
328k
      return h ? i : end();
157
328k
    }
acommon::HashTable<aspeller::CondsLookupParms>::find(char const* const&)
Line
Count
Source
153
945k
    iterator find(const key_type & to_find) {
154
945k
      bool h; 
155
945k
      iterator i = find_i(to_find,h);
156
945k
      return h ? i : end();
157
945k
    }
Unexecuted instantiation: acommon::HashTable<acommon::HashMapParms<char const*, acommon::Vector<char const*>, acommon::hash<char const*>, std::__1::equal_to<char const*>, false> >::find(char const* const&)
158
10.1M
    bool have(const key_type & to_find) const {
159
10.1M
      bool h; 
160
10.1M
      const_cast<HashTable *>(this)->find_i(to_find,h);
161
10.1M
      return h;
162
10.1M
    }
163
328k
    const_iterator find(const key_type & to_find) const {
164
328k
      return const_cast<HashTable *>(this)->find(to_find);
165
328k
    }
acommon::HashTable<acommon::StringMap::Parms>::find(char const* const&) const
Line
Count
Source
163
328k
    const_iterator find(const key_type & to_find) const {
164
328k
      return const_cast<HashTable *>(this)->find(to_find);
165
328k
    }
Unexecuted instantiation: acommon::HashTable<acommon::HashMapParms<char const*, acommon::Vector<char const*>, acommon::hash<char const*>, std::__1::equal_to<char const*>, false> >::find(char const* const&) const
166
167
    std::pair<iterator,iterator> equal_range(const key_type & to_find) 
168
14.5M
    {
169
14.5M
      int irrelevant;
170
14.5M
      return equal_range_i(to_find, irrelevant);
171
14.5M
    }
172
173
    std::pair<const_iterator,const_iterator> 
174
    equal_range(const key_type & to_find) const
175
    {
176
      int irrelevant;
177
      std::pair<iterator,iterator> range 
178
  = const_cast<HashTable *>(this)->equal_range_i(to_find, irrelevant);
179
      return std::pair<const_iterator,const_iterator>
180
  (range.first,range.second);
181
    }
182
        
183
    void resize(Size s) {resize_i(next_largest(s));}
184
185
    //other niceties: swap, copy, equal
186
187
  };
188
189
  template <class V>
190
  inline HT_Iterator<V>::HT_Iterator(const HT_ConstIterator<V> & other)
191
    : t(other.t), n(other.t)
192
  {
193
    while (*n != other.n) n = &(*n)->next;
194
  }
195
  
196
  template <class V>
197
  inline bool operator== (HT_Iterator<V> rhs,
198
        HT_Iterator<V> lhs) 
199
15.2M
  {
200
15.2M
    return rhs.n == lhs.n;
201
15.2M
  }
bool acommon::operator==<acommon::StringPair>(acommon::HT_Iterator<acommon::StringPair>, acommon::HT_Iterator<acommon::StringPair>)
Line
Count
Source
199
522k
  {
200
522k
    return rhs.n == lhs.n;
201
522k
  }
bool acommon::operator==<aspeller::Conds const*>(acommon::HT_Iterator<aspeller::Conds const*>, acommon::HT_Iterator<aspeller::Conds const*>)
Line
Count
Source
199
945k
  {
200
945k
    return rhs.n == lhs.n;
201
945k
  }
bool acommon::operator==<char const*>(acommon::HT_Iterator<char const*>, acommon::HT_Iterator<char const*>)
Line
Count
Source
199
13.7M
  {
200
13.7M
    return rhs.n == lhs.n;
201
13.7M
  }
202
203
  template <class V>
204
  inline bool operator== (HT_ConstIterator<V> rhs,
205
        HT_Iterator<V> lhs) 
206
  {
207
    return rhs.n == *lhs.n;
208
  }
209
210
  template <class V>
211
  inline bool operator== (HT_Iterator<V> rhs,
212
        HT_ConstIterator<V> lhs) 
213
  {
214
    return *rhs.n == lhs.n;
215
  }
216
217
  template <class V>
218
  inline bool operator== (HT_ConstIterator<V> rhs, 
219
        HT_ConstIterator<V> lhs) 
220
367k
  {
221
367k
    return rhs.n == lhs.n;
222
367k
  }
bool acommon::operator==<acommon::StringPair>(acommon::HT_ConstIterator<acommon::StringPair>, acommon::HT_ConstIterator<acommon::StringPair>)
Line
Count
Source
220
328k
  {
221
328k
    return rhs.n == lhs.n;
222
328k
  }
Unexecuted instantiation: bool acommon::operator==<char const*>(acommon::HT_ConstIterator<char const*>, acommon::HT_ConstIterator<char const*>)
bool acommon::operator==<std::__1::pair<char const* const, acommon::Vector<char const*> > >(acommon::HT_ConstIterator<std::__1::pair<char const* const, acommon::Vector<char const*> > >, acommon::HT_ConstIterator<std::__1::pair<char const* const, acommon::Vector<char const*> > >)
Line
Count
Source
220
39.3k
  {
221
39.3k
    return rhs.n == lhs.n;
222
39.3k
  }
223
224
#ifndef REL_OPS_POLLUTION
225
226
  template <class V>
227
  inline bool operator!= (HT_Iterator<V> rhs,
228
        HT_Iterator<V> lhs) 
229
797k
  {
230
797k
    return rhs.n != lhs.n;
231
797k
  }
232
233
  template <class V>
234
  inline bool operator!= (HT_ConstIterator<V> rhs,
235
        HT_Iterator<V> lhs) 
236
  {
237
    return rhs.n != *lhs.n;
238
  }
239
240
  template <class V>
241
  inline bool operator!= (HT_Iterator<V> rhs,
242
        HT_ConstIterator<V> lhs) 
243
  {
244
    return *rhs.n != lhs.n;
245
  }
246
247
  template <class V>
248
  inline bool operator!= (HT_ConstIterator<V> rhs, 
249
        HT_ConstIterator<V> lhs) 
250
0
  {
251
0
    return rhs.n != lhs.n;
252
0
  }
253
254
#endif
255
256
  template <typename K, typename HF, typename E, bool m>
257
  struct HashSetParms 
258
  {
259
    typedef K Value;
260
    typedef const K Key;
261
    static const bool is_multi = m;
262
    HF hash;
263
    E  equal;
264
5.63M
    const K & key(const K & v) {return v;}
acommon::HashSetParms<char const*, acommon::hash<char const*>, std::__1::equal_to<char const*>, false>::key(char const* const&)
Line
Count
Source
264
3.66M
    const K & key(const K & v) {return v;}
suggest.cpp:acommon::HashSetParms<char const*, acommon::hash<char const*>, (anonymous namespace)::StrEquals, false>::key(char const* const&)
Line
Count
Source
264
1.97M
    const K & key(const K & v) {return v;}
Unexecuted instantiation: writable.cpp:acommon::HashSetParms<char const*, (anonymous namespace)::Hash, (anonymous namespace)::Equal, true>::key(char const* const&)
265
13.7k
    HashSetParms(const HF & h = HF(), const E & e = E()) : hash(h), equal(e) {}
acommon::HashSetParms<char const*, acommon::hash<char const*>, std::__1::equal_to<char const*>, false>::HashSetParms(acommon::hash<char const*> const&, std::__1::equal_to<char const*> const&)
Line
Count
Source
265
199
    HashSetParms(const HF & h = HF(), const E & e = E()) : hash(h), equal(e) {}
suggest.cpp:acommon::HashSetParms<char const*, acommon::hash<char const*>, (anonymous namespace)::StrEquals, false>::HashSetParms(acommon::hash<char const*> const&, (anonymous namespace)::StrEquals const&)
Line
Count
Source
265
10.9k
    HashSetParms(const HF & h = HF(), const E & e = E()) : hash(h), equal(e) {}
writable.cpp:acommon::HashSetParms<char const*, (anonymous namespace)::Hash, (anonymous namespace)::Equal, true>::HashSetParms((anonymous namespace)::Hash const&, (anonymous namespace)::Equal const&)
Line
Count
Source
265
2.56k
    HashSetParms(const HF & h = HF(), const E & e = E()) : hash(h), equal(e) {}
266
  };
267
268
  template <typename K, typename HF = hash<K>, typename E = std::equal_to<K> >
269
  class hash_set : public HashTable<HashSetParms<K,HF,E,false> >
270
  {
271
  public:
272
    typedef HashTable<HashSetParms<K,HF,E,false> > Base;
273
    typedef typename Base::size_type               size_type;
274
    typedef typename Base::Parms                   Parms;
275
    hash_set(size_type s = 0, const HF & h = HF(), const E & e = E()) 
276
11.1k
      : Base(s, Parms(h,e)) {}
acommon::hash_set<char const*, acommon::hash<char const*>, std::__1::equal_to<char const*> >::hash_set(unsigned int, acommon::hash<char const*> const&, std::__1::equal_to<char const*> const&)
Line
Count
Source
276
199
      : Base(s, Parms(h,e)) {}
suggest.cpp:acommon::hash_set<char const*, acommon::hash<char const*>, (anonymous namespace)::StrEquals>::hash_set(unsigned int, acommon::hash<char const*> const&, (anonymous namespace)::StrEquals const&)
Line
Count
Source
276
10.9k
      : Base(s, Parms(h,e)) {}
277
  };
278
279
  template <typename K, typename HF = hash<K>, typename E = std::equal_to<K> >
280
  class hash_multiset : public HashTable<HashSetParms<K,HF,E,true> >
281
  {
282
  public:
283
    typedef HashTable<HashSetParms<K,HF,E,true> > Base;
284
    typedef typename Base::size_type              size_type;
285
    typedef typename Base::Parms                  Parms;
286
    hash_multiset(size_type s = 0, const HF & h = HF(), const E & e = E()) 
287
2.56k
      : Base(s, Parms(h,e)) {}
288
  };
289
290
  template <typename K, typename V, typename HF, typename E, bool m>
291
  struct HashMapParms 
292
  {
293
    typedef std::pair<const K,V> Value;
294
    typedef const K         Key;
295
    static const bool is_multi = m;
296
    HF hash;
297
    E  equal;
298
0
    const K & key(const Value & v) {return v.first;}
299
    HashMapParms() {}
300
    HashMapParms(const HF & h) : hash(h) {}
301
2.56k
    HashMapParms(const HF & h, const E & e) : hash(h), equal(e) {}
302
  };
303
304
  template <typename K, typename V, typename HF = hash<K>, typename E = std::equal_to<K> >
305
  class hash_map : public HashTable<HashMapParms<K,V,HF,E,false> >
306
  {
307
  public:
308
    typedef V         data_type;
309
    typedef data_type Data;
310
    
311
    typedef HashTable<HashMapParms<K,V,HF,E,false> > Base;
312
    typedef typename Base::size_type                 size_type;
313
    typedef typename Base::key_type                  key_type;
314
    typedef typename Base::value_type                value_type;
315
    typedef typename Base::Parms                     Parms;
316
317
    hash_map(size_type s = 0, const HF & h = HF(), const E & e = E()) 
318
2.56k
      : Base(s, Parms(h,e)) {}
319
    data_type & operator[](const key_type & k) 
320
0
    {
321
0
      return (*((this->insert(value_type(k, data_type()))).first)).second;
322
0
    }
323
  };
324
325
  template <typename K, typename V, typename HF = hash<K>, typename E = std::equal_to<K> >
326
  class hash_multimap : public HashTable<HashMapParms<K,V,HF,E,true> >
327
  {
328
  public:
329
    typedef HashTable<HashMapParms<K,V,HF,E,true> > Base;
330
    typedef typename Base::size_type                size_type;
331
    typedef typename Base::Parms                    Parms;
332
    hash_multimap(size_type s = 0, const HF & h = HF(), const E & e = E()) 
333
      : Base(s, Parms(h,e)) {}
334
  };
335
}
336
337
#endif