/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 |