@@ -555,7 +555,7 @@ inline bool IsValidCapacity(size_t n) { return ((n + 1) & n) == 0 && n > 0; }
555
555
// FULL -> DELETED
556
556
// --------------------------------------------------------------------------
557
557
inline void ConvertDeletedToEmptyAndFullToDeleted (
558
- ctrl_t * ctrl, size_t capacity)
558
+ ctrl_t * PHMAP_RESTRICT ctrl, size_t capacity)
559
559
{
560
560
assert (ctrl[capacity] == kSentinel );
561
561
assert (IsValidCapacity (capacity));
@@ -1857,20 +1857,22 @@ class raw_hash_set
1857
1857
friend struct phmap ::priv::hashtable_debug_internal::HashtableDebugAccess;
1858
1858
1859
1859
template <class K = key_type>
1860
- bool find_impl (const key_arg<K>& key, size_t hashval, size_t & offset) {
1860
+ bool find_impl (const key_arg<K>& PHMAP_RESTRICT key, size_t hashval, size_t & PHMAP_RESTRICT offset) {
1861
+ auto ctrl_ptr = ctrl_;
1861
1862
PHMAP_IF_CONSTEXPR (!std_alloc_t ::value) {
1862
1863
// ctrl_ could be nullptr
1863
- if (!ctrl_ )
1864
+ if (!ctrl_ptr )
1864
1865
return false ;
1865
1866
}
1866
1867
auto seq = probe (hashval);
1868
+ auto slots_ptr = slots_;
1867
1869
while (true ) {
1868
- Group g{ ctrl_ + seq.offset () };
1870
+ Group g{ ctrl_ptr + seq.offset () };
1869
1871
for (uint32_t i : g.Match ((h2_t )H2 (hashval))) {
1870
1872
offset = seq.offset ((size_t )i);
1871
1873
if (PHMAP_PREDICT_TRUE (PolicyTraits::apply (
1872
1874
EqualElement<K>{key, eq_ref ()},
1873
- PolicyTraits::element (slots_ + offset))))
1875
+ PolicyTraits::element (slots_ptr + offset))))
1874
1876
return true ;
1875
1877
}
1876
1878
if (PHMAP_PREDICT_TRUE (g.MatchEmpty ()))
@@ -2034,9 +2036,11 @@ class raw_hash_set
2034
2036
std::is_same<typename Policy::is_flat, std::false_type>::value)) {
2035
2037
// node map, or not trivially destructible... we need to iterate and destroy values one by one
2036
2038
// std::cout << "either this is a node map or " << type_name<typename PolicyTraits::value_type>() << " is not trivially_destructible\n";
2037
- for (size_t i = 0 ; i != capacity_; ++i) {
2038
- if (IsFull (ctrl_[i])) {
2039
- PolicyTraits::destroy (&alloc_ref (), slots_ + i);
2039
+ auto slots_ptr = slots_;
2040
+ auto ctrl_ptr = ctrl_;
2041
+ for (size_t i = 0 , cnt = capacity_; i != cnt; ++i) {
2042
+ if (IsFull (ctrl_ptr[i])) {
2043
+ PolicyTraits::destroy (&alloc_ref (), slots_ptr + i);
2040
2044
}
2041
2045
}
2042
2046
}
@@ -2153,7 +2157,7 @@ class raw_hash_set
2153
2157
}
2154
2158
}
2155
2159
2156
- bool has_element (const value_type& elem, size_t hashval) const {
2160
+ bool has_element (const value_type& PHMAP_RESTRICT elem, size_t hashval) const {
2157
2161
PHMAP_IF_CONSTEXPR (!std_alloc_t ::value) {
2158
2162
// ctrl_ could be nullptr
2159
2163
if (!ctrl_)
@@ -2220,19 +2224,21 @@ class raw_hash_set
2220
2224
2221
2225
protected:
2222
2226
template <class K >
2223
- size_t _find_key (const K& key, size_t hashval) {
2227
+ size_t _find_key (const K& PHMAP_RESTRICT key, size_t hashval) {
2228
+ auto ctrl_ptr = ctrl_;
2224
2229
PHMAP_IF_CONSTEXPR (!std_alloc_t ::value) {
2225
2230
// ctrl_ could be nullptr
2226
- if (!ctrl_ )
2231
+ if (!ctrl_ptr )
2227
2232
return (size_t )-1 ;
2228
2233
}
2229
2234
auto seq = probe (hashval);
2235
+ auto slots_ptr = slots_;
2230
2236
while (true ) {
2231
- Group g{ctrl_ + seq.offset ()};
2237
+ Group g{ctrl_ptr + seq.offset ()};
2232
2238
for (uint32_t i : g.Match ((h2_t )H2 (hashval))) {
2233
2239
if (PHMAP_PREDICT_TRUE (PolicyTraits::apply (
2234
2240
EqualElement<K>{key, eq_ref ()},
2235
- PolicyTraits::element (slots_ + seq.offset ((size_t )i)))))
2241
+ PolicyTraits::element (slots_ptr + seq.offset ((size_t )i)))))
2236
2242
return seq.offset ((size_t )i);
2237
2243
}
2238
2244
if (PHMAP_PREDICT_TRUE (g.MatchEmpty ())) break ;
0 commit comments