hash_table6.hpp 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817
  1. // emhash6::HashMap for C++11/14/17
  2. // version 1.7.1
  3. // https://github.com/ktprime/ktprime/blob/master/hash_table6.hpp
  4. //
  5. // Licensed under the MIT License <http://opensource.org/licenses/MIT>.
  6. // SPDX-License-Identifier: MIT
  7. // Copyright (c) 2019-2023 Huang Yuanbing & bailuzhou AT 163.com
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining a copy
  10. // of this software and associated documentation files (the "Software"), to deal
  11. // in the Software without restriction, including without limitation the rights
  12. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  13. // copies of the Software, and to permit persons to whom the Software is
  14. // furnished to do so, subject to the following conditions:
  15. //
  16. // The above copyright notice and this permission notice shall be included in all
  17. // copies or substantial portions of the Software.
  18. //
  19. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  22. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  23. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  24. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  25. // SOFTWARE
  26. #pragma once
  27. #include <cstring>
  28. #include <string>
  29. #include <cmath>
  30. #include <cstdlib>
  31. #include <type_traits>
  32. #include <cassert>
  33. #include <utility>
  34. #include <cstdint>
  35. #include <functional>
  36. #include <iterator>
  37. #include <algorithm>
  38. #if EMH_WY_HASH
  39. #include "wyhash.h"
  40. #endif
  41. #ifdef EMH_KEY
  42. #undef EMH_KEY
  43. #undef EMH_VAL
  44. #undef EMH_PKV
  45. #undef EMH_NEW
  46. #undef EMH_SET
  47. #undef EMH_BUCKET
  48. #undef EMH_EMPTY
  49. #endif
  50. // likely/unlikely
  51. #if (__GNUC__ >= 4 || __clang__)
  52. # define EMH_LIKELY(condition) __builtin_expect(condition, 1)
  53. # define EMH_UNLIKELY(condition) __builtin_expect(condition, 0)
  54. #else
  55. # define EMH_LIKELY(condition) condition
  56. # define EMH_UNLIKELY(condition) condition
  57. #endif
  58. #ifndef EMH_BUCKET_INDEX
  59. #define EMH_BUCKET_INDEX 1
  60. #endif
  61. #if EMH_BUCKET_INDEX == 0
  62. #define EMH_KEY(p,n) p[n].second.first
  63. #define EMH_VAL(p,n) p[n].second.second
  64. #define EMH_BUCKET(p,n) p[n].first / 2
  65. #define EMH_ADDR(p,n) p[n].first
  66. #define EMH_EMPTY(p,n) ((int)p[n].first < 0)
  67. #define EMH_PKV(p,n) p[n].second
  68. #define EMH_NEW(key, val, bucket, next) new(_pairs + bucket) PairT(next, value_type(key, val)), _num_filled ++; EMH_SET(bucket)
  69. #elif EMH_BUCKET_INDEX == 2
  70. #define EMH_KEY(p,n) p[n].first.first
  71. #define EMH_VAL(p,n) p[n].first.second
  72. #define EMH_BUCKET(p,n) p[n].second / 2
  73. #define EMH_ADDR(p,n) p[n].second
  74. #define EMH_EMPTY(p,n) ((int)p[n].second < 0)
  75. #define EMH_PKV(p,n) p[n].first
  76. #define EMH_NEW(key, val, bucket, next) new(_pairs + bucket) PairT(value_type(key, val), next), _num_filled ++; EMH_SET(bucket)
  77. #else
  78. #define EMH_KEY(p,n) p[n].first
  79. #define EMH_VAL(p,n) p[n].second
  80. #define EMH_BUCKET(p,n) p[n].bucket / 2
  81. #define EMH_ADDR(p,n) p[n].bucket
  82. #define EMH_EMPTY(p,n) (0 > (int)p[n].bucket)
  83. #define EMH_PKV(p,n) p[n]
  84. #define EMH_NEW(key, val, bucket, next) new(_pairs + bucket) PairT(key, val, next), _num_filled ++; EMH_SET(bucket)
  85. #endif
  86. #define EMH_MASK(bucket) 1 << (bucket % MASK_BIT)
  87. #define EMH_SET(bucket) _bitmask[bucket / MASK_BIT] &= ~(EMH_MASK(bucket))
  88. #define EMH_CLS(bucket) _bitmask[bucket / MASK_BIT] |= EMH_MASK(bucket)
  89. //#define EMH_EMPTY(bitmask, bucket) (_bitmask[bucket / MASK_BIT] & (EMH_MASK(bucket))) != 0
  90. #if _WIN32
  91. #include <intrin.h>
  92. #if _WIN64
  93. #pragma intrinsic(_umul128)
  94. #endif
  95. #endif
  96. namespace emhash6 {
  97. #ifdef EMH_SIZE_TYPE_16BIT
  98. typedef uint16_t size_type;
  99. static constexpr size_type INACTIVE = 0xFFFF;
  100. #elif EMH_SIZE_TYPE_64BIT
  101. typedef uint64_t size_type;
  102. static constexpr size_type INACTIVE = 0 - 0x1ull;
  103. #else
  104. typedef uint32_t size_type;
  105. static constexpr size_type INACTIVE = 0 - 0x1u;
  106. #endif
  107. static_assert((int)INACTIVE < 0, "INACTIVE must be even and < 0(to int)");
  108. //https://gist.github.com/jtbr/1896790eb6ad50506d5f042991906c30
  109. static size_type CTZ(size_t n)
  110. {
  111. #if defined(__x86_64__) || defined(_WIN32) || (__BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
  112. #elif __BIG_ENDIAN__ || (__BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
  113. n = __builtin_bswap64(n);
  114. #else
  115. static uint32_t endianness = 0x12345678;
  116. const auto is_big = *(const char *)&endianness == 0x12;
  117. if (is_big)
  118. n = __builtin_bswap64(n);
  119. #endif
  120. #if _WIN32
  121. unsigned long index;
  122. #if defined(_WIN64)
  123. _BitScanForward64(&index, n);
  124. #else
  125. _BitScanForward(&index, n);
  126. #endif
  127. #elif defined (__LP64__) || (SIZE_MAX == UINT64_MAX) || defined (__x86_64__)
  128. auto index = __builtin_ctzll(n);
  129. #elif 1
  130. auto index = __builtin_ctzl(n);
  131. #else
  132. #if defined (__LP64__) || (SIZE_MAX == UINT64_MAX) || defined (__x86_64__)
  133. size_type index;
  134. __asm__("bsfq %1, %0\n" : "=r" (index) : "rm" (n) : "cc");
  135. #else
  136. size_type index;
  137. __asm__("bsf %1, %0\n" : "=r" (index) : "rm" (n) : "cc");
  138. #endif
  139. #endif
  140. return (size_type)index;
  141. }
  142. template <typename First, typename Second>
  143. struct entry {
  144. using first_type = First;
  145. using second_type = Second;
  146. entry(const First& key, const Second& val, size_type ibucket) :second(val), first(key) { bucket = ibucket; }
  147. entry(First&& key, Second&& val, size_type ibucket) :second(std::move(val)), first(std::move(key)) { bucket = ibucket; }
  148. entry(const std::pair<First, Second>& pair) :second(pair.second), first(pair.first) { bucket = INACTIVE; }
  149. entry(std::pair<First, Second>&& pair) :second(std::move(pair.second)), first(std::move(pair.first)) { bucket = INACTIVE; }
  150. entry(const entry& pairT) :second(pairT.second), first(pairT.first) { bucket = pairT.bucket; }
  151. entry(entry&& pairT) noexcept :second(std::move(pairT.second)), first(std::move(pairT.first)) { bucket = pairT.bucket; }
  152. template<typename K, typename V>
  153. entry(K&& key, V&& val, size_type ibucket)
  154. :second(std::forward<V>(val)), first(std::forward<K>(key))
  155. {
  156. bucket = ibucket;
  157. }
  158. entry& operator = (entry&& pairT) noexcept
  159. {
  160. second = std::move(pairT.second);
  161. bucket = pairT.bucket;
  162. first = std::move(pairT.first);
  163. return *this;
  164. }
  165. entry& operator = (const entry& o)
  166. {
  167. second = o.second;
  168. bucket = o.bucket;
  169. first = o.first;
  170. return *this;
  171. }
  172. bool operator == (const std::pair<First, Second>& p) const
  173. {
  174. return first == p.first && second == p.second;
  175. }
  176. bool operator == (const entry<First, Second>& p) const
  177. {
  178. return first == p.first && second == p.second;
  179. }
  180. void swap(entry<First, Second>& o)
  181. {
  182. std::swap(second, o.second);
  183. std::swap(first, o.first);
  184. }
  185. #if EMH_ORDER_KV || EMH_SIZE_TYPE_64BIT
  186. First first;
  187. size_type bucket;
  188. Second second;
  189. #else
  190. Second second;
  191. size_type bucket;
  192. First first;
  193. #endif
  194. };
  195. /// A cache-friendly hash table with open addressing, linear/qua probing and power-of-two capacity
  196. template <typename KeyT, typename ValueT, typename HashT = std::hash<KeyT>, typename EqT = std::equal_to<KeyT>>
  197. class HashMap
  198. {
  199. #ifndef EMH_DEFAULT_LOAD_FACTOR
  200. constexpr static float EMH_DEFAULT_LOAD_FACTOR = 0.80f;
  201. constexpr static float EMH_MIN_LOAD_FACTOR = 0.25f; //< 0.5
  202. #endif
  203. public:
  204. typedef HashMap<KeyT, ValueT, HashT, EqT> htype;
  205. typedef std::pair<KeyT, ValueT> value_type;
  206. #if EMH_BUCKET_INDEX == 0
  207. typedef value_type value_pair;
  208. typedef std::pair<size_type, value_type> PairT;
  209. #elif EMH_BUCKET_INDEX == 2
  210. typedef value_type value_pair;
  211. typedef std::pair<value_type, size_type> PairT;
  212. #else
  213. typedef entry<KeyT, ValueT> value_pair;
  214. typedef entry<KeyT, ValueT> PairT;
  215. #endif
  216. typedef KeyT key_type;
  217. typedef ValueT val_type;
  218. typedef ValueT mapped_type;
  219. typedef HashT hasher;
  220. typedef EqT key_equal;
  221. typedef PairT& reference;
  222. typedef const PairT& const_reference;
  223. class const_iterator;
  224. class iterator
  225. {
  226. public:
  227. typedef std::forward_iterator_tag iterator_category;
  228. typedef std::ptrdiff_t difference_type;
  229. typedef value_pair value_type;
  230. typedef value_pair* pointer;
  231. typedef value_pair& reference;
  232. iterator() = default;
  233. iterator(const const_iterator& it) : _map(it._map), _bucket(it._bucket), _from(it._from), _bmask(it._bmask) { }
  234. iterator(const htype* hash_map, size_type bucket, bool) : _map(hash_map), _bucket(bucket) { init(); }
  235. #if EMH_ITER_SAFE
  236. iterator(const htype* hash_map, size_type bucket) : _map(hash_map), _bucket(bucket) { init(); }
  237. #else
  238. iterator(const htype* hash_map, size_type bucket) : _map(hash_map), _bucket(bucket) { _bmask = _from = 0; }
  239. #endif
  240. void init()
  241. {
  242. _from = (_bucket / SIZE_BIT) * SIZE_BIT;
  243. if (_bucket < _map->bucket_count()) {
  244. _bmask = *(size_t*)((size_t*)_map->_bitmask + _from / SIZE_BIT);
  245. _bmask |= (1ull << _bucket % SIZE_BIT) - 1;
  246. _bmask = ~_bmask;
  247. } else {
  248. _bmask = 0;
  249. }
  250. }
  251. size_type bucket() const
  252. {
  253. return _bucket;
  254. }
  255. void clear(size_type bucket)
  256. {
  257. if (_bucket / SIZE_BIT == bucket / SIZE_BIT)
  258. _bmask &= ~(1ull << (bucket % SIZE_BIT));
  259. }
  260. iterator& next()
  261. {
  262. goto_next_element();
  263. return *this;
  264. }
  265. iterator& operator++()
  266. {
  267. _bmask &= _bmask - 1;
  268. goto_next_element();
  269. return *this;
  270. }
  271. iterator operator++(int)
  272. {
  273. iterator old = *this;
  274. _bmask &= _bmask - 1;
  275. goto_next_element();
  276. return old;
  277. }
  278. reference operator*() const
  279. {
  280. return _map->EMH_PKV(_pairs, _bucket);
  281. }
  282. pointer operator->() const
  283. {
  284. return &(_map->EMH_PKV(_pairs, _bucket));
  285. }
  286. bool operator==(const iterator& rhs) const { return _bucket == rhs._bucket; }
  287. bool operator!=(const iterator& rhs) const { return _bucket != rhs._bucket; }
  288. bool operator==(const const_iterator& rhs) const { return _bucket == rhs._bucket; }
  289. bool operator!=(const const_iterator& rhs) const { return _bucket != rhs._bucket; }
  290. private:
  291. void goto_next_element()
  292. {
  293. if (_bmask != 0) {
  294. _bucket = _from + CTZ(_bmask);
  295. return;
  296. }
  297. do {
  298. _bmask = ~*(size_t*)((size_t*)_map->_bitmask + (_from += SIZE_BIT) / SIZE_BIT);
  299. } while (_bmask == 0);
  300. _bucket = _from + CTZ(_bmask);
  301. }
  302. public:
  303. const htype* _map;
  304. size_type _bucket;
  305. size_type _from;
  306. size_t _bmask;
  307. };
  308. class const_iterator
  309. {
  310. public:
  311. typedef std::forward_iterator_tag iterator_category;
  312. typedef std::ptrdiff_t difference_type;
  313. typedef value_pair value_type;
  314. typedef const value_pair* pointer;
  315. typedef const value_pair& reference;
  316. const_iterator(const iterator& it) : _map(it._map), _bucket(it._bucket), _from(it._from), _bmask(it._bmask) { }
  317. const_iterator(const htype* hash_map, size_type bucket, bool) : _map(hash_map), _bucket(bucket) { init(); }
  318. #if EMH_ITER_SAFE
  319. const_iterator(const htype* hash_map, size_type bucket) : _map(hash_map), _bucket(bucket) { init(); }
  320. #else
  321. const_iterator(const htype* hash_map, size_type bucket) : _map(hash_map), _bucket(bucket) { _bmask = _from = 0; }
  322. #endif
  323. void init()
  324. {
  325. _from = (_bucket / SIZE_BIT) * SIZE_BIT;
  326. if (_bucket < _map->bucket_count()) {
  327. _bmask = *(size_t*)((size_t*)_map->_bitmask + _from / SIZE_BIT);
  328. _bmask |= (1ull << _bucket % SIZE_BIT) - 1;
  329. _bmask = ~_bmask;
  330. } else {
  331. _bmask = 0;
  332. }
  333. }
  334. size_type bucket() const
  335. {
  336. return _bucket;
  337. }
  338. const_iterator& operator++()
  339. {
  340. goto_next_element();
  341. return *this;
  342. }
  343. const_iterator operator++(int)
  344. {
  345. const_iterator old(*this);
  346. goto_next_element();
  347. return old;
  348. }
  349. reference operator*() const
  350. {
  351. return _map->EMH_PKV(_pairs, _bucket);
  352. }
  353. pointer operator->() const
  354. {
  355. return &(_map->EMH_PKV(_pairs, _bucket));
  356. }
  357. bool operator==(const const_iterator& rhs) const { return _bucket == rhs._bucket; }
  358. bool operator!=(const const_iterator& rhs) const { return _bucket != rhs._bucket; }
  359. private:
  360. void goto_next_element()
  361. {
  362. _bmask &= _bmask - 1;
  363. if (_bmask != 0) {
  364. _bucket = _from + CTZ(_bmask);
  365. return;
  366. }
  367. do {
  368. _bmask = ~*(size_t*)((size_t*)_map->_bitmask + (_from += SIZE_BIT) / SIZE_BIT);
  369. } while (_bmask == 0);
  370. _bucket = _from + CTZ(_bmask);
  371. }
  372. public:
  373. const htype* _map;
  374. size_type _bucket;
  375. size_type _from;
  376. size_t _bmask;
  377. };
  378. void init(size_type bucket, float lf = EMH_DEFAULT_LOAD_FACTOR)
  379. {
  380. #if EMH_SAFE_HASH
  381. _num_main = _hash_inter = 0;
  382. #endif
  383. _mask = 0;
  384. _pairs = nullptr;
  385. _bitmask = nullptr;
  386. _num_filled = 0;
  387. max_load_factor(lf);
  388. rehash(bucket);
  389. }
  390. HashMap(size_type bucket = 4, float lf = EMH_DEFAULT_LOAD_FACTOR)
  391. {
  392. init(bucket, lf);
  393. }
  394. size_t AllocSize(uint64_t num_buckets) const
  395. {
  396. return (num_buckets + PACK_SIZE) * sizeof(PairT) + (num_buckets + 7) / 8 + BIT_PACK;
  397. }
  398. HashMap(const HashMap& rhs)
  399. {
  400. if (rhs.load_factor() > EMH_MIN_LOAD_FACTOR) {
  401. _pairs = (PairT*)malloc(AllocSize(rhs._mask + 1));
  402. clone(rhs);
  403. } else {
  404. init(rhs._num_filled + 2, EMH_DEFAULT_LOAD_FACTOR);
  405. for (auto it = rhs.begin(); it != rhs.end(); ++it)
  406. insert_unique(it->first, it->second);
  407. }
  408. }
  409. HashMap(HashMap&& rhs) noexcept
  410. {
  411. #ifndef EMH_ZERO_MOVE
  412. init(4);
  413. #else
  414. _mask = _num_filled = 0;
  415. _pairs = nullptr;
  416. #endif
  417. swap(rhs);
  418. }
  419. HashMap(std::initializer_list<value_type> ilist)
  420. {
  421. init((size_type)ilist.size());
  422. for (auto it = ilist.begin(); it != ilist.end(); ++it)
  423. do_insert(*it);
  424. }
  425. template<class InputIt>
  426. HashMap(InputIt first, InputIt last, size_type bucket_count=4)
  427. {
  428. init(std::distance(first, last) + bucket_count);
  429. for (; first != last; ++first)
  430. emplace(*first);
  431. }
  432. HashMap& operator= (const HashMap& rhs) noexcept
  433. {
  434. if (this == &rhs)
  435. return *this;
  436. if (rhs.load_factor() < EMH_MIN_LOAD_FACTOR) {
  437. clear(); free(_pairs); _pairs = nullptr;
  438. rehash(rhs._num_filled + 2);
  439. for (auto it = rhs.begin(); it != rhs.end(); ++it)
  440. insert_unique(it->first, it->second);
  441. return *this;
  442. }
  443. if (is_triviall_destructable())
  444. clearkv();
  445. if (_mask != rhs._mask) {
  446. free(_pairs);
  447. _pairs = (PairT*)malloc(AllocSize(1 + rhs._mask));
  448. }
  449. clone(rhs);
  450. return *this;
  451. }
  452. HashMap& operator= (HashMap&& rhs) noexcept
  453. {
  454. if (this != &rhs) {
  455. swap(rhs);
  456. rhs.clear();
  457. }
  458. return *this;
  459. }
  460. template<typename Con>
  461. bool operator == (const Con& rhs) const
  462. {
  463. if (size() != rhs.size())
  464. return false;
  465. for (auto it = begin(), last = end(); it != last; ++it) {
  466. auto oi = rhs.find(it->first);
  467. if (oi == rhs.end() || it->second != oi->second)
  468. return false;
  469. }
  470. return true;
  471. }
  472. template<typename Con>
  473. bool operator != (const Con& rhs) const { return !(*this == rhs); }
  474. ~HashMap() noexcept
  475. {
  476. if (is_triviall_destructable()) {
  477. for (auto it = cbegin(); _num_filled; ++it) {
  478. _num_filled --;
  479. it->~value_pair();
  480. }
  481. }
  482. free(_pairs);
  483. }
  484. void clone(const HashMap& rhs)
  485. {
  486. _hasher = rhs._hasher;
  487. // _eq = rhs._eq;
  488. #if EMH_SAFE_HASH
  489. _num_main = rhs._num_main;
  490. _hash_inter = rhs._hash_inter;
  491. #endif
  492. _num_filled = rhs._num_filled;
  493. _mask = rhs._mask;
  494. _mlf = rhs._mlf;
  495. _bitmask = decltype(_bitmask)((char*)_pairs + ((char*)rhs._bitmask - (char*)rhs._pairs));
  496. auto opairs = rhs._pairs;
  497. auto _num_buckets = _mask + 1;
  498. if (is_copy_trivially())
  499. memcpy(_pairs, opairs, _num_buckets * sizeof(PairT));
  500. else {
  501. for (size_type bucket = 0; bucket < _num_buckets; bucket++) {
  502. auto next_bucket = EMH_ADDR(_pairs, bucket) = EMH_ADDR(opairs, bucket);
  503. if ((int)next_bucket >= 0)
  504. new(_pairs + bucket) PairT(opairs[bucket]);
  505. }
  506. }
  507. memcpy(_pairs + _num_buckets, opairs + _num_buckets, PACK_SIZE * sizeof(PairT) + _num_buckets / 8 + BIT_PACK);
  508. }
  509. void swap(HashMap& rhs)
  510. {
  511. std::swap(_hasher, rhs._hasher);
  512. // std::swap(_eq, rhs._eq);
  513. std::swap(_pairs, rhs._pairs);
  514. #if EMH_SAFE_HASH
  515. std::swap(_num_main, rhs._num_main);
  516. std::swap(_hash_inter, rhs._hash_inter);
  517. #endif
  518. std::swap(_num_filled, rhs._num_filled);
  519. std::swap(_mask, rhs._mask);
  520. std::swap(_mlf, rhs._mlf);
  521. std::swap(_bitmask, rhs._bitmask);
  522. //std::swap(EMH_ADDR(_pairs, _mask + 1), EMH_ADDR(rhs._pairs, rhs._mask + 1));
  523. }
  524. // -------------------------------------------------------------
  525. iterator begin() noexcept
  526. {
  527. #ifdef EMH_ZERO_MOVE
  528. if (0 == _num_filled)
  529. return {this, _mask + 1};
  530. #endif
  531. const auto bmask = ~(*(size_t*)_bitmask);
  532. if (bmask != 0)
  533. return {this, CTZ(bmask), true};
  534. iterator it(this, sizeof(bmask) * 8 - 1);
  535. return it.next();
  536. }
  537. const_iterator cbegin() const noexcept
  538. {
  539. #ifdef EMH_ZERO_MOVE
  540. if (0 == _num_filled)
  541. return {this, _mask + 1};
  542. #endif
  543. const auto bmask = ~(*(size_t*)_bitmask);
  544. if (bmask != 0)
  545. return {this, CTZ(bmask), true};
  546. iterator it(this, sizeof(bmask) * 8 - 1);
  547. return it.next();
  548. }
  549. iterator last() const
  550. {
  551. if (_num_filled == 0)
  552. return end();
  553. auto bucket = _mask;
  554. while (EMH_EMPTY(_pairs, bucket)) bucket--;
  555. return {this, bucket, true};
  556. }
  557. const_iterator begin() const noexcept { return cbegin(); }
  558. iterator end() noexcept { return {this, _mask + 1}; }
  559. const_iterator cend() const { return {this, _mask + 1}; }
  560. const_iterator end() const { return {this, _mask + 1}; }
  561. size_type size() const { return _num_filled; }
  562. bool empty() const { return _num_filled == 0; }
  563. size_type bucket_count() const { return _mask + 1; }
  564. float load_factor() const { return static_cast<float>(_num_filled) / (_mask + 1); }
  565. HashT& hash_function() const { return _hasher; }
  566. EqT& key_eq() const { return _eq; }
  567. void max_load_factor(float mlf)
  568. {
  569. if (mlf < 0.999f && mlf > EMH_MIN_LOAD_FACTOR)
  570. _mlf = decltype(_mlf)((1 << 27) / mlf);
  571. }
  572. constexpr float max_load_factor() const { return (1 << 27) / (float)_mlf; }
  573. constexpr size_type max_size() const { return 1ull << ((sizeof(size_type) * 8) - 1); }
  574. constexpr size_type max_bucket_count() const { return max_size(); }
  575. #if EMH_STATIS
  576. //Returns the bucket number where the element with key k is located.
  577. size_type bucket(const KeyT& key) const
  578. {
  579. const auto bucket = hash_key(key) & _mask;
  580. const auto next_bucket = EMH_ADDR(_pairs, bucket);
  581. if ((int)next_bucket < 0)
  582. return 0;
  583. else if (bucket == next_bucket * 2)
  584. return bucket + 1;
  585. return hash_main(bucket);
  586. }
  587. //Returns the number of elements in bucket n.
  588. size_type bucket_size(const size_type bucket) const
  589. {
  590. auto next_bucket = EMH_ADDR(_pairs, bucket);
  591. if ((int)next_bucket < 0)
  592. return 0;
  593. const auto& bucket_key = EMH_KEY(_pairs, bucket);
  594. next_bucket = hash_key(bucket_key) & _mask;
  595. size_type bucket_size = 1;
  596. //iterator each item in current main bucket
  597. while (true) {
  598. const auto nbucket = EMH_BUCKET(_pairs, next_bucket);
  599. if (nbucket == next_bucket) {
  600. break;
  601. }
  602. bucket_size++;
  603. next_bucket = nbucket;
  604. }
  605. return bucket_size;
  606. }
  607. size_type get_main_bucket(const size_type bucket) const
  608. {
  609. if (EMH_EMPTY(_pairs, bucket))
  610. return -1u;
  611. return hash_main(bucket);
  612. }
  613. int get_cache_info(size_type bucket, size_type next_bucket) const
  614. {
  615. auto pbucket = reinterpret_cast<std::ptrdiff_t>(&_pairs[bucket]);
  616. auto pnext = reinterpret_cast<std::ptrdiff_t>(&_pairs[next_bucket]);
  617. if (pbucket / 64 == pnext / 64)
  618. return 0;
  619. auto diff = pbucket > pnext ? (pbucket - pnext) : pnext - pbucket;
  620. if (diff < 127 * 64)
  621. return diff / 64 + 1;
  622. return 127;
  623. }
  624. int get_bucket_info(const size_type bucket, size_type steps[], const size_type slots) const
  625. {
  626. auto next_bucket = EMH_ADDR(_pairs, bucket);
  627. if ((int)next_bucket < 0)
  628. return -1;
  629. const auto main_bucket = hash_main(bucket);
  630. if (main_bucket != bucket)
  631. return 0;
  632. else if (next_bucket == bucket)
  633. return 1;
  634. steps[get_cache_info(bucket, next_bucket) % slots] ++;
  635. size_type ibucket_size = 2;
  636. //find a new empty and linked it to tail
  637. while (true) {
  638. const auto nbucket = EMH_BUCKET(_pairs, next_bucket);
  639. if (nbucket == next_bucket)
  640. break;
  641. steps[get_cache_info(nbucket, next_bucket) % slots] ++;
  642. ibucket_size ++;
  643. next_bucket = nbucket;
  644. }
  645. return ibucket_size;
  646. }
  647. void dump_statics() const
  648. {
  649. size_type buckets[129] = {0};
  650. size_type steps[129] = {0};
  651. for (size_type bucket = 0; bucket <= _mask; ++bucket) {
  652. auto bsize = get_bucket_info(bucket, steps, 128);
  653. if (bsize > 0)
  654. buckets[bsize] ++;
  655. }
  656. size_type sumb = 0, collision = 0, sumc = 0, finds = 0, sumn = 0;
  657. puts("============== buckets size ration ========");
  658. for (size_type i = 0; i < sizeof(buckets) / sizeof(buckets[0]); i++) {
  659. const auto bucketsi = buckets[i];
  660. if (bucketsi == 0)
  661. continue;
  662. sumb += bucketsi;
  663. sumn += bucketsi * i;
  664. collision += bucketsi * (i - 1);
  665. finds += bucketsi * i * (i + 1) / 2;
  666. printf(" %2u %8u %0.8lf %2.3lf\n", i, bucketsi, bucketsi * 1.0 * i / _num_filled, sumn * 100.0 / _num_filled);
  667. }
  668. puts("========== collision miss ration ===========");
  669. for (size_type i = 0; i < sizeof(steps) / sizeof(steps[0]); i++) {
  670. sumc += steps[i];
  671. if (steps[i] <= 2)
  672. continue;
  673. printf(" %2u %8u %0.2lf %.2lf\n", i, steps[i], steps[i] * 100.0 / collision, sumc * 100.0 / collision);
  674. }
  675. if (sumb == 0) return;
  676. printf(" _num_filled/aver_size/packed collision/cache_miss/hit_find = %u/%.2lf/%zd/ %.2lf%%/%.2lf%%/%.2lf\n",
  677. _num_filled, _num_filled * 1.0 / sumb, sizeof(PairT), (collision * 100.0 / _num_filled), (collision - steps[0]) * 100.0 / _num_filled, finds * 1.0 / _num_filled);
  678. assert(sumn == _num_filled);
  679. assert(sumc == collision);
  680. puts("============== buckets size end =============");
  681. }
  682. #endif
  683. // ------------------------------------------------------------
  684. template<typename Key = KeyT>
  685. inline iterator find(const Key& key, size_t key_hash) noexcept
  686. {
  687. return {this, find_filled_hash(key, key_hash)};
  688. }
  689. template<typename Key = KeyT>
  690. inline const_iterator find(const Key& key, size_t key_hash) const noexcept
  691. {
  692. return {this, find_filled_hash(key, key_hash)};
  693. }
  694. template<typename Key=KeyT>
  695. inline iterator find(const Key& key) noexcept
  696. {
  697. return {this, find_filled_bucket(key)};
  698. }
  699. template<typename Key = KeyT>
  700. inline const_iterator find(const Key& key) const noexcept
  701. {
  702. return {this, find_filled_bucket(key)};
  703. }
  704. template<typename Key = KeyT>
  705. inline ValueT& at(const KeyT& key)
  706. {
  707. const auto bucket = find_filled_bucket(key);
  708. //throw
  709. return EMH_VAL(_pairs, bucket);
  710. }
  711. template<typename Key = KeyT>
  712. inline const ValueT& at(const KeyT& key) const
  713. {
  714. const auto bucket = find_filled_bucket(key);
  715. //throw
  716. return EMH_VAL(_pairs, bucket);
  717. }
  718. template<typename Key = KeyT>
  719. inline bool contains(const Key& key) const noexcept
  720. {
  721. return find_filled_bucket(key) <= _mask;
  722. }
  723. template<typename Key = KeyT>
  724. inline size_type count(const Key& key) const noexcept
  725. {
  726. return find_filled_bucket(key) <= _mask ? 1 : 0;
  727. }
  728. template<typename Key = KeyT>
  729. std::pair<iterator, iterator> equal_range(const Key& key) const noexcept
  730. {
  731. const auto found = find(key);
  732. if (found.bucket() > _mask)
  733. return { found, found };
  734. else
  735. return { found, std::next(found) };
  736. }
  737. template<typename K=KeyT>
  738. std::pair<const_iterator, const_iterator> equal_range(const K& key) const
  739. {
  740. const auto found = find(key);
  741. if (found.bucket() > _mask)
  742. return { found, found };
  743. else
  744. return { found, std::next(found) };
  745. }
  746. void merge(HashMap& rhs)
  747. {
  748. if (empty()) {
  749. *this = std::move(rhs);
  750. return;
  751. }
  752. for (auto rit = rhs.begin(); rit != rhs.end(); ) {
  753. auto fit = find(rit->first);
  754. if (fit.bucket() > _mask) {
  755. insert_unique(rit->first, std::move(rit->second));
  756. rit = rhs.erase(rit);
  757. } else {
  758. ++rit;
  759. }
  760. }
  761. }
  762. #ifdef EMH_EXT
  763. bool try_get(const KeyT& key, ValueT& val) const noexcept
  764. {
  765. const auto bucket = find_filled_bucket(key);
  766. const auto found = bucket <= _mask;
  767. if (found) {
  768. val = EMH_VAL(_pairs, bucket);
  769. }
  770. return found;
  771. }
  772. /// Returns the matching ValueT or nullptr if k isn't found.
  773. ValueT* try_get(const KeyT& key) noexcept
  774. {
  775. const auto bucket = find_filled_bucket(key);
  776. return bucket <= _mask ? &EMH_VAL(_pairs, bucket) : nullptr;
  777. }
  778. /// Const version of the above
  779. ValueT* try_get(const KeyT& key) const noexcept
  780. {
  781. const auto bucket = find_filled_bucket(key);
  782. return bucket <= _mask ? &EMH_VAL(_pairs, bucket) : nullptr;
  783. }
  784. /// Convenience function.
  785. ValueT get_or_return_default(const KeyT& key) const noexcept
  786. {
  787. const auto bucket = find_filled_bucket(key);
  788. return bucket <= _mask ? EMH_VAL(_pairs, bucket) : ValueT();
  789. }
  790. #endif
  791. // -----------------------------------------------------
  792. /// Returns a pair consisting of an iterator to the inserted element
  793. /// (or to the element that prevented the insertion)
  794. /// and a bool denoting whether the insertion took place.
  795. std::pair<iterator, bool> do_insert(const value_type& value)
  796. {
  797. const auto bucket = find_or_allocate(value.first);
  798. const auto next = bucket / 2;
  799. const auto found = EMH_EMPTY(_pairs, next);
  800. if (found) {
  801. EMH_NEW(value.first, value.second, next, bucket);
  802. }
  803. return { {this, next}, found };
  804. }
  805. std::pair<iterator, bool> do_insert(value_type&& value)
  806. {
  807. const auto bucket = find_or_allocate(value.first);
  808. const auto next = bucket / 2;
  809. const auto found = EMH_EMPTY(_pairs, next);
  810. if (found) {
  811. EMH_NEW(std::move(value.first), std::move(value.second), next, bucket);
  812. }
  813. return { {this, next}, found };
  814. }
  815. template<typename K, typename V>
  816. std::pair<iterator, bool> do_insert(K&& key, V&& val)
  817. {
  818. const auto bucket = find_or_allocate(key);
  819. const auto next = bucket / 2;
  820. const auto found = EMH_EMPTY(_pairs, next);
  821. if (found) {
  822. EMH_NEW(std::forward<K>(key), std::forward<V>(val), next, bucket);
  823. }
  824. return { {this, next}, found };
  825. }
  826. template<typename K, typename V>
  827. std::pair<iterator, bool> do_assign(K&& key, V&& val)
  828. {
  829. check_expand_need();
  830. const auto bucket = find_or_allocate(key);
  831. const auto next = bucket / 2;
  832. const auto found = EMH_EMPTY(_pairs, next);
  833. if (found) {
  834. EMH_NEW(std::forward<K>(key), std::forward<V>(val), next, bucket);
  835. } else {
  836. EMH_VAL(_pairs, next) = std::move(val);
  837. }
  838. return { {this, next}, found };
  839. }
  840. std::pair<iterator, bool> insert(const value_type& value)
  841. {
  842. check_expand_need();
  843. return do_insert(value);
  844. }
  845. std::pair<iterator, bool> insert(value_type&& value)
  846. {
  847. check_expand_need();
  848. return do_insert(std::move(value));
  849. }
  850. void insert(std::initializer_list<value_type> ilist)
  851. {
  852. reserve(ilist.size() + _num_filled);
  853. for (auto it = ilist.begin(); it != ilist.end(); ++it)
  854. do_insert(*it);
  855. }
  856. template <typename Iter>
  857. void insert(Iter first, Iter last)
  858. {
  859. reserve(std::distance(first, last) + _num_filled);
  860. for (auto it = first; it != last; ++it)
  861. do_insert(it->first, it->second);
  862. }
  863. #if 0
  864. template <typename Iter>
  865. void insert_unique(Iter begin, Iter end)
  866. {
  867. reserve(std::distance(begin, end) + _num_filled);
  868. for (; begin != end; ++begin)
  869. do_insert_unqiue(*begin);
  870. }
  871. #endif
  872. template<typename K, typename V>
  873. inline size_type insert_unique(K&& key, V&& val)
  874. {
  875. return do_insert_unqiue(std::forward<K>(key), std::forward<V>(val));
  876. }
  877. inline size_type insert_unique(value_type&& value)
  878. {
  879. return do_insert_unqiue(std::move(value.first), std::move(value.second));
  880. }
  881. inline size_type insert_unique(const value_type& value)
  882. {
  883. return do_insert_unqiue(value.first, value.second);
  884. }
  885. template<typename K, typename V>
  886. inline size_type do_insert_unqiue(K&& key, V&& val)
  887. {
  888. check_expand_need();
  889. auto bucket = find_unique_bucket(key);
  890. EMH_NEW(std::forward<K>(key), std::forward<V>(val), bucket / 2, bucket);
  891. return bucket;
  892. }
  893. std::pair<iterator, bool> insert_or_assign(const KeyT& key, ValueT&& val) { return do_assign(key, std::forward<ValueT>(val)); }
  894. std::pair<iterator, bool> insert_or_assign(KeyT&& key, ValueT&& val) { return do_assign(std::move(key), std::forward<ValueT>(val)); }
  895. template <typename... Args>
  896. inline std::pair<iterator, bool> emplace(Args&&... args) noexcept
  897. {
  898. check_expand_need();
  899. return do_insert(std::forward<Args>(args)...);
  900. }
  901. template <class... Args>
  902. iterator emplace_hint(const_iterator hint, Args&&... args)
  903. {
  904. (void)hint;
  905. check_expand_need();
  906. return do_insert(std::forward<Args>(args)...).first;
  907. }
  908. template<class... Args>
  909. std::pair<iterator, bool> try_emplace(const KeyT& key, Args&&... args)
  910. {
  911. check_expand_need();
  912. return do_insert(key, std::forward<Args>(args)...);
  913. }
  914. template<class... Args>
  915. std::pair<iterator, bool> try_emplace(KeyT&& key, Args&&... args)
  916. {
  917. check_expand_need();
  918. return do_insert(std::forward<KeyT>(key), std::forward<Args>(args)...);
  919. }
  920. template <class... Args>
  921. inline size_type emplace_unique(Args&&... args) noexcept
  922. {
  923. return insert_unique(std::forward<Args>(args)...);
  924. }
  925. ValueT& operator[](const KeyT& key) noexcept
  926. {
  927. check_expand_need();
  928. const auto bucket = find_or_allocate(key);
  929. const auto next = bucket / 2;
  930. /* Check if inserting a new value rather than overwriting an old entry */
  931. if (EMH_EMPTY(_pairs, next)) {
  932. EMH_NEW(key, std::move(ValueT()), next, bucket);
  933. }
  934. //bugs here if return local reference rehash happens
  935. return EMH_VAL(_pairs, next);
  936. }
  937. ValueT& operator[](KeyT&& key) noexcept
  938. {
  939. check_expand_need();
  940. const auto bucket = find_or_allocate(key);
  941. const auto next = bucket / 2;
  942. if (EMH_EMPTY(_pairs, next)) {
  943. EMH_NEW(std::move(key), std::move(ValueT()), next, bucket);
  944. }
  945. return EMH_VAL(_pairs, next);
  946. }
  947. // -------------------------------------------------------
  948. /// Erase an element from the hash table.
  949. /// return 0 if element was not found
  950. template<typename Key = KeyT>
  951. size_type erase(const Key& key)
  952. {
  953. const auto bucket = erase_key(key);
  954. if (bucket == INACTIVE)
  955. return 0;
  956. clear_bucket(bucket);
  957. return 1;
  958. }
  959. //iterator erase const_iterator
  960. iterator erase(const_iterator cit)
  961. {
  962. iterator it(cit);
  963. return erase(it);
  964. }
  965. /// Erase an element typedef an iterator.
  966. /// Returns an iterator to the next element (or end()).
  967. iterator erase(iterator it)
  968. {
  969. const auto bucket = erase_bucket(it._bucket);
  970. clear_bucket(bucket);
  971. if (bucket == it._bucket) {
  972. return ++it;
  973. } else {
  974. //erase main bucket as next
  975. it.clear(bucket);
  976. return it;
  977. }
  978. }
  979. /// Erase an element typedef an iterator without return next iterator
  980. void _erase(const_iterator it)
  981. {
  982. const auto bucket = erase_bucket(it._bucket);
  983. clear_bucket(bucket);
  984. }
  985. template<typename Pred>
  986. size_type erase_if(Pred pred)
  987. {
  988. auto old_size = size();
  989. for (auto it = begin(), last = end(); it != last; ) {
  990. if (pred(*it))
  991. it = erase(it);
  992. else
  993. ++it;
  994. }
  995. return old_size - size();
  996. }
  997. static constexpr bool is_triviall_destructable()
  998. {
  999. #if __cplusplus >= 201402L || _MSC_VER > 1600
  1000. return !(std::is_trivially_destructible<KeyT>::value && std::is_trivially_destructible<ValueT>::value);
  1001. #else
  1002. return !(std::is_pod<KeyT>::value && std::is_pod<ValueT>::value);
  1003. #endif
  1004. }
  1005. static constexpr bool is_copy_trivially()
  1006. {
  1007. #if __cplusplus >= 201402L || _MSC_VER > 1600
  1008. return (std::is_trivially_copyable<KeyT>::value && std::is_trivially_copyable<ValueT>::value);
  1009. #else
  1010. return (std::is_pod<KeyT>::value && std::is_pod<ValueT>::value);
  1011. #endif
  1012. }
  1013. void clearkv()
  1014. {
  1015. for (auto it = cbegin(); _num_filled; ++it)
  1016. clear_bucket(it.bucket());
  1017. }
  1018. /// Remove all elements, keeping full capacity.
  1019. void clear()
  1020. {
  1021. if (is_triviall_destructable())
  1022. clearkv();
  1023. else if (_num_filled) {
  1024. memset(_bitmask, 0xFFFFFFFF, (_mask + 1) / 8);
  1025. memset(_pairs, -1, sizeof(_pairs[0]) * (_mask + 1));
  1026. #if EMH_FIND_HIT
  1027. if constexpr (std::is_integral<KeyT>::value)
  1028. reset_bucket(hash_main(0));
  1029. #endif
  1030. }
  1031. _num_filled = 0;
  1032. #if EMH_SAFE_HASH
  1033. _num_main = _hash_inter = 0;
  1034. #endif
  1035. }
  1036. void shrink_to_fit()
  1037. {
  1038. rehash(_num_filled + 1);
  1039. }
  1040. /// Make room for this many elements
  1041. bool reserve(uint64_t num_elems)
  1042. {
  1043. const auto required_buckets = (uint64_t)(num_elems * _mlf >> 27) + 1;
  1044. if (EMH_LIKELY(required_buckets <= _mask))
  1045. return false;
  1046. #if EMH_STATIS
  1047. if (_num_filled > EMH_STATIS) dump_statics();
  1048. #endif
  1049. rehash(required_buckets + 1);
  1050. return true;
  1051. }
  1052. ///three ways may incr rehash: bad hash function, load_factor is high, or need shrink
  1053. void rehash(uint64_t required_buckets)
  1054. {
  1055. if (required_buckets < _num_filled)
  1056. return;
  1057. #if 0 //(__GNUC__ >= 4 || __clang__)
  1058. size_type num_buckets = 1ul << (sizeof(required_buckets) * 8 - __builtin_clz(required_buckets));
  1059. if (num_buckets < sizeof(size_t))
  1060. num_buckets = sizeof(size_t);
  1061. #else
  1062. uint64_t buckets = _num_filled > (1u << 16) ? (1u << 16) : sizeof(size_t);
  1063. while (buckets < required_buckets) { buckets *= 2; }
  1064. // no need alloc too many bucket for small key.
  1065. // if maybe fail set small load_factor and then call reserve() TODO:
  1066. if (sizeof(KeyT) < sizeof(size_type) && buckets >= (1ul << (2 * 8)))
  1067. buckets = 2ul << (sizeof(KeyT) * 8);
  1068. assert(buckets < max_size() && buckets > _num_filled);
  1069. //assert(num_buckets == (2 << CTZ(required_buckets)));
  1070. #endif
  1071. auto num_buckets = (size_type)buckets;
  1072. //assert(num_buckets > _num_filled);
  1073. auto old_num_filled = _num_filled;
  1074. auto old_mask = _mask;
  1075. auto* new_pairs = (PairT*)malloc(AllocSize(num_buckets));
  1076. #if EMH_EXCEPTION
  1077. if (EMH_UNLIKELY(!new_pairs))
  1078. throw std::bad_alloc();
  1079. #else
  1080. assert(!!new_pairs);
  1081. #endif
  1082. auto old_pairs = _pairs;
  1083. _bitmask = decltype(_bitmask)(new_pairs + PACK_SIZE + num_buckets);
  1084. const auto bitmask_pack = ((size_t)_bitmask) % sizeof(size_t);
  1085. if (bitmask_pack != 0) {
  1086. _bitmask = decltype(_bitmask)((char*)_bitmask + sizeof(size_t) - bitmask_pack);
  1087. assert(0 == ((size_t)_bitmask) % sizeof(size_t));
  1088. }
  1089. _num_filled = 0;
  1090. _mask = num_buckets - 1;
  1091. _pairs = new_pairs;
  1092. #if EMH_SAFE_HASH
  1093. if (old_num_filled > 100 && _hash_inter == 0)
  1094. _hash_inter = old_num_filled / (_num_main * 3);
  1095. _num_main = 0;
  1096. #endif
  1097. memset(_pairs, -1, sizeof(_pairs[0]) * num_buckets);
  1098. #if EMH_FIND_HIT
  1099. if constexpr (std::is_integral<KeyT>::value)
  1100. reset_bucket(hash_main(0));
  1101. #endif
  1102. //pack tail two tombstones for fast iterator and find empty_bucket without checking overflow
  1103. memset((char*)(_pairs + num_buckets), 0, sizeof(PairT) * PACK_SIZE);
  1104. /***************** init bitmask ---------------------- ***********/
  1105. const auto mask_byte = (num_buckets + 7) / 8;
  1106. memset(_bitmask, 0xFFFFFFFF, mask_byte);
  1107. memset((char*)_bitmask + mask_byte, 0, BIT_PACK);
  1108. if (num_buckets < 8)
  1109. _bitmask[0] = (1 << num_buckets) - 1;
  1110. //pack last position to bit 0
  1111. /**************** -------------------------------- *************/
  1112. #if EMH_REHASH_LOG
  1113. auto collision = 0;
  1114. #endif
  1115. //for (size_type src_bucket = 0; _num_filled < old_num_filled; src_bucket++) {
  1116. for (size_type src_bucket = old_mask; _num_filled < old_num_filled; src_bucket --) {
  1117. if (EMH_EMPTY(old_pairs, src_bucket))
  1118. continue;
  1119. auto&& key = EMH_KEY(old_pairs, src_bucket);
  1120. const auto bucket = find_unique_bucket(key);
  1121. EMH_NEW(std::move(key), std::move(EMH_VAL(old_pairs, src_bucket)), bucket / 2, bucket);
  1122. #if EMH_REHASH_LOG
  1123. if (bucket / 2 != hash_main(bucket / 2))
  1124. collision++;
  1125. #endif
  1126. if (is_triviall_destructable())
  1127. old_pairs[src_bucket].~PairT();
  1128. }
  1129. #if EMH_REHASH_LOG
  1130. if (_num_filled > EMH_REHASH_LOG) {
  1131. #ifndef EMH_SAFE_HASH
  1132. auto _num_main = old_num_filled - collision;
  1133. #endif
  1134. const auto num_buckets = _mask + 1;
  1135. auto last = EMH_ADDR(_pairs, num_buckets);
  1136. char buff[255] = {0};
  1137. sprintf(buff, " _num_filled/aver_size/K.V/pack/collision|last = %u/%.2lf/%s.%s/%zd/%.2lf%%|%.2lf%%",
  1138. _num_filled,(double)_num_filled / _num_main, typeid(KeyT).name(), typeid(ValueT).name(), sizeof(_pairs[0]), (collision * 100.0 / num_buckets), (last * 100.0 / num_buckets));
  1139. #ifdef EMH_LOG
  1140. static size_type ihashs = 0;
  1141. EMH_LOG() << "EMH_BUCKET_INDEX = " << EMH_BUCKET_INDEX << "|rhash_nums = " << ihashs ++ << "|" <<__FUNCTION__ << "|" << buff << endl;
  1142. #else
  1143. puts(buff);
  1144. #endif
  1145. }
  1146. #endif
  1147. free(old_pairs);
  1148. assert(old_num_filled == _num_filled);
  1149. }
  1150. private:
  1151. // Can we fit another element?
  1152. inline bool check_expand_need()
  1153. {
  1154. #if EMH_SAFE_HASH > 1
  1155. if (EMH_UNLIKELY(_num_main * 3 < _num_filled) && _num_filled > 100 && _hash_inter == 0) {
  1156. rehash(_num_filled);
  1157. return true;
  1158. }
  1159. #endif
  1160. return reserve(_num_filled);
  1161. }
  1162. #if EMH_FIND_HIT
  1163. void reset_bucket(size_type bucket)
  1164. {
  1165. if constexpr (std::is_integral<KeyT>::value) {
  1166. auto& key = EMH_KEY(_pairs, bucket); key ++;
  1167. // if (bucket != _zero_index) return;
  1168. while ((hash_key(key) & _mask) == bucket) key += 1610612741;
  1169. }
  1170. }
  1171. #endif
  1172. void clear_bucket(size_type bucket)
  1173. {
  1174. EMH_CLS(bucket);
  1175. _num_filled--;
  1176. if (is_triviall_destructable())
  1177. _pairs[bucket].~PairT();
  1178. EMH_ADDR(_pairs, bucket) = INACTIVE;
  1179. #if EMH_FIND_HIT
  1180. reset_bucket(bucket);
  1181. #endif
  1182. }
  1183. template<typename UType, typename std::enable_if<std::is_integral<UType>::value, size_type>::type = 0>
  1184. size_type erase_key(const UType& key)
  1185. {
  1186. const auto empty_bucket = INACTIVE;
  1187. const auto bucket = hash_key(key) & _mask;
  1188. auto next_bucket = EMH_ADDR(_pairs, bucket);
  1189. if (next_bucket == bucket * 2) {
  1190. const auto eqkey = _eq(key, EMH_KEY(_pairs, bucket));
  1191. #if EMH_SAFE_HASH
  1192. return eqkey ? (_num_main --, bucket) : empty_bucket;
  1193. #else
  1194. return eqkey ? bucket : empty_bucket;
  1195. #endif
  1196. }
  1197. else if (next_bucket % 2 > 0)
  1198. return empty_bucket;
  1199. else if (_eq(key, EMH_KEY(_pairs, bucket))) {
  1200. next_bucket /= 2;
  1201. const auto nbucket = EMH_BUCKET(_pairs, next_bucket);
  1202. EMH_PKV(_pairs, bucket) = std::move(EMH_PKV(_pairs, next_bucket));
  1203. EMH_ADDR(_pairs, bucket) = (next_bucket == nbucket ? bucket : nbucket) * 2;
  1204. return next_bucket;
  1205. }
  1206. next_bucket /= 2;
  1207. auto prev_bucket = bucket;
  1208. while (true) {
  1209. const auto nbucket = EMH_BUCKET(_pairs, next_bucket);
  1210. if (_eq(key, EMH_KEY(_pairs, next_bucket))) {
  1211. EMH_ADDR(_pairs, prev_bucket) = (nbucket == next_bucket ? prev_bucket : nbucket) * 2 + (1 - (prev_bucket == bucket));
  1212. return next_bucket;
  1213. }
  1214. if (nbucket == next_bucket)
  1215. break;
  1216. prev_bucket = next_bucket;
  1217. next_bucket = nbucket;
  1218. }
  1219. return empty_bucket;
  1220. }
  1221. template<typename UType, typename std::enable_if<!std::is_integral<UType>::value, size_type>::type = 0>
  1222. size_type erase_key(const UType& key)
  1223. {
  1224. const auto empty_bucket = INACTIVE;
  1225. const auto bucket = hash_key(key) & _mask;
  1226. auto next_bucket = EMH_ADDR(_pairs, bucket);
  1227. if (next_bucket == bucket * 2) { //only one main bucket
  1228. const auto eqkey = _eq(key, EMH_KEY(_pairs, bucket));
  1229. #if EMH_SAFE_HASH
  1230. return eqkey ? (_num_main --, bucket) : empty_bucket;
  1231. #else
  1232. return eqkey ? bucket : empty_bucket;
  1233. #endif
  1234. }
  1235. else if (next_bucket % 2 > 0)
  1236. return empty_bucket;
  1237. //find erase key and swap to last bucket
  1238. size_type prev_bucket = bucket, find_bucket = empty_bucket;
  1239. next_bucket = bucket;
  1240. while (true) {
  1241. const auto nbucket = EMH_BUCKET(_pairs, next_bucket);
  1242. if (_eq(key, EMH_KEY(_pairs, next_bucket))) {
  1243. find_bucket = next_bucket;
  1244. if (nbucket == next_bucket) {
  1245. EMH_ADDR(_pairs, prev_bucket) = prev_bucket * 2 + 1 - (prev_bucket == bucket);
  1246. break;
  1247. }
  1248. }
  1249. if (nbucket == next_bucket) {
  1250. if ((int)find_bucket >= 0) {
  1251. EMH_PKV(_pairs, find_bucket).swap(EMH_PKV(_pairs, nbucket));
  1252. // EMH_PKV(_pairs, find_bucket) = EMH_PKV(_pairs, nbucket);
  1253. EMH_ADDR(_pairs, prev_bucket) = prev_bucket * 2 + 1 - (prev_bucket == bucket);
  1254. find_bucket = nbucket;
  1255. }
  1256. break;
  1257. }
  1258. prev_bucket = next_bucket;
  1259. next_bucket = nbucket;
  1260. }
  1261. return find_bucket;
  1262. }
  1263. size_type erase_bucket(const size_type bucket)
  1264. {
  1265. auto next_bucket = EMH_ADDR(_pairs, bucket);
  1266. if (next_bucket == bucket * 2) {
  1267. #if EMH_SAFE_HASH
  1268. _num_main--;
  1269. #endif
  1270. return bucket;
  1271. }
  1272. else if (next_bucket % 2 == 0) {
  1273. next_bucket /= 2;
  1274. const auto nbucket = EMH_BUCKET(_pairs, next_bucket);
  1275. EMH_PKV(_pairs, bucket) = std::move(EMH_PKV(_pairs, next_bucket));
  1276. EMH_ADDR(_pairs, bucket) = (next_bucket == nbucket ? bucket : nbucket) * 2;
  1277. return next_bucket;
  1278. }
  1279. const auto main_bucket = hash_main(bucket);
  1280. next_bucket /= 2;
  1281. const auto prev_bucket = find_prev_bucket(main_bucket, bucket);
  1282. const auto odd_bucket = (prev_bucket == main_bucket ? 0 : 1);
  1283. if (bucket == next_bucket)
  1284. EMH_ADDR(_pairs, prev_bucket) = prev_bucket * 2 + odd_bucket;
  1285. else
  1286. EMH_ADDR(_pairs, prev_bucket) = next_bucket * 2 + odd_bucket;
  1287. return bucket;
  1288. }
  1289. // Find the bucket with this key, or return bucket size
  1290. template<typename K>
  1291. size_type find_filled_hash(const K& key, const size_t key_hash) const
  1292. {
  1293. const auto bucket = size_type(key_hash & _mask);
  1294. auto next_bucket = EMH_ADDR(_pairs, bucket);
  1295. const auto _num_buckets = _mask + 1;
  1296. #ifndef EMH_FIND_HIT
  1297. if (next_bucket % 2 > 0)
  1298. return _num_buckets;
  1299. else if (_eq(key, EMH_KEY(_pairs, bucket)))
  1300. return bucket;
  1301. else if (next_bucket == bucket * 2)
  1302. return _num_buckets;
  1303. #else
  1304. if constexpr (std::is_integral<K>::value) {
  1305. if (_eq(key, EMH_KEY(_pairs, bucket)))
  1306. return bucket;
  1307. else if (next_bucket % 2 > 0)
  1308. return _num_buckets;
  1309. // else if (next_bucket == bucket * 2)
  1310. // return _num_buckets;
  1311. // else if (next_bucket != bucket * 2 + 1)
  1312. // return _num_buckets;
  1313. // else if (hash_main(bucket) != bucket)
  1314. // return _num_buckets;
  1315. } else {
  1316. if (next_bucket % 2 > 0)
  1317. return _num_buckets;
  1318. else if (_eq(key, EMH_KEY(_pairs, bucket)))
  1319. return bucket;
  1320. else if (next_bucket == bucket * 2)
  1321. return _num_buckets;
  1322. }
  1323. #endif
  1324. next_bucket /= 2;
  1325. while (true) {
  1326. if (_eq(key, EMH_KEY(_pairs, next_bucket)))
  1327. return next_bucket;
  1328. const auto nbucket = EMH_BUCKET(_pairs, next_bucket);
  1329. if (nbucket == next_bucket)
  1330. return _num_buckets;
  1331. next_bucket = nbucket;
  1332. }
  1333. return 0;
  1334. }
  1335. // Find the bucket with this key, or return bucket size
  1336. //1. next_bucket = INACTIVE, empty bucket
  1337. //2. next_bucket % 2 == 0 is main bucket
  1338. template<typename Key=KeyT>
  1339. inline size_type find_filled_bucket(const Key& key) const
  1340. {
  1341. return find_filled_hash(key, hash_key(key));
  1342. }
  1343. //kick out bucket and find empty to occpuy
  1344. //it will break the orgin link and relnik again.
  1345. //before: main_bucket-->prev_bucket --> bucket --> next_bucket
  1346. //atfer : main_bucket-->prev_bucket --> (removed)--> new_bucket--> next_bucket
  1347. size_type kickout_bucket(const size_type bucket)
  1348. {
  1349. const auto next_bucket = EMH_BUCKET(_pairs, bucket);
  1350. const auto new_bucket = find_empty_bucket(next_bucket);
  1351. const auto kmain_bucket = hash_main(bucket);
  1352. const auto prev_bucket = find_prev_bucket(kmain_bucket, bucket);
  1353. new(_pairs + new_bucket) PairT(std::move(_pairs[bucket])); EMH_SET(new_bucket);
  1354. if (next_bucket == bucket)
  1355. EMH_ADDR(_pairs, new_bucket) = new_bucket * 2 + 1;
  1356. EMH_ADDR(_pairs, prev_bucket) += (new_bucket - bucket) * 2;
  1357. #if EMH_SAFE_HASH
  1358. _num_main ++;
  1359. #endif
  1360. clear_bucket(bucket); _num_filled ++;
  1361. return bucket * 2;
  1362. }
  1363. /***
  1364. ** inserts a new key into a hash table; first check whether key's main
  1365. ** bucket/position is free. If not, check whether colliding node/bucket is in its main
  1366. ** position or not: if it is not, move colliding bucket to an empty place and
  1367. ** put new key in its main position; otherwise (colliding bucket is in its main
  1368. ** position), new key goes to an empty position. ***/
  1369. template<typename K=KeyT>
  1370. size_type find_or_allocate(const K& key)
  1371. {
  1372. const auto bucket = hash_key(key) & _mask;
  1373. auto next_bucket = EMH_ADDR(_pairs, bucket);
  1374. #if EMH_SAFE_HASH
  1375. if ((int)next_bucket < 0)
  1376. return _num_main ++, bucket * 2;
  1377. else if (_eq(key, EMH_KEY(_pairs, bucket)))
  1378. return bucket * 2;
  1379. #else
  1380. if ((int)next_bucket < 0 || _eq(key, EMH_KEY(_pairs, bucket)))
  1381. return bucket * 2;
  1382. #endif
  1383. //check current bucket_key is in main bucket or not
  1384. if (next_bucket == bucket * 2)
  1385. return (EMH_ADDR(_pairs, bucket) = find_empty_bucket(bucket) * 2) + 1;
  1386. else if (next_bucket % 2 > 0)
  1387. return kickout_bucket(bucket);
  1388. //int collisions = 2;
  1389. next_bucket /= 2;
  1390. //find next linked bucket and check key
  1391. while (true) {
  1392. if (_eq(key, EMH_KEY(_pairs, next_bucket))) {
  1393. #if EMH_LRU_SET
  1394. EMH_PKV(_pairs, next_bucket).swap(EMH_PKV(_pairs, bucket));
  1395. return bucket * 2;
  1396. #else
  1397. return next_bucket * 2;
  1398. #endif
  1399. }
  1400. const auto nbucket = EMH_BUCKET(_pairs, next_bucket);
  1401. if (nbucket == next_bucket)
  1402. break;
  1403. next_bucket = nbucket;
  1404. //collisions++;
  1405. }
  1406. //find a new empty and link it to tail
  1407. const auto new_bucket = find_empty_bucket(bucket);
  1408. return EMH_ADDR(_pairs, next_bucket) = new_bucket * 2 + 1;
  1409. }
  1410. // key is not in this map. Find a place to put it.
  1411. size_type find_empty_bucket(const size_type bucket_from)
  1412. {
  1413. #ifdef EMH_ALIGN64
  1414. const auto boset = bucket_from % MASK_BIT;
  1415. auto* const align = _bitmask + bucket_from / MASK_BIT;
  1416. const auto bmask = ((size_t)align[1] << (MASK_BIT - boset)) | (align[0] >> boset);
  1417. static_assert(sizeof(size_t) > 4);
  1418. #elif EMH_ITER_SAFE
  1419. const auto boset = bucket_from % 8;
  1420. auto* const start = (uint8_t*)_bitmask + bucket_from / 8;
  1421. size_t bmask; memcpy(&bmask, start + 0, sizeof(bmask)); bmask >>= boset;
  1422. #else //maybe not aligned
  1423. const auto boset = bucket_from % 8;
  1424. auto* const align = (uint8_t*)_bitmask + bucket_from / 8;
  1425. const auto bmask = (*(size_t*)(align) >> boset); //maybe not aligned and warning
  1426. #endif
  1427. if (EMH_LIKELY(bmask != 0))
  1428. return bucket_from + CTZ(bmask);
  1429. const auto qmask = _mask / SIZE_BIT;
  1430. if (0) {
  1431. const auto step = (bucket_from - SIZE_BIT / 4) & qmask;
  1432. const auto bmask3 = *((size_t*)_bitmask + step);
  1433. if (bmask3 != 0)
  1434. return step * SIZE_BIT + CTZ(bmask3);
  1435. }
  1436. auto& _last = EMH_ADDR(_pairs, _mask + 1);
  1437. while ( true ) {
  1438. const auto bmask2 = *((size_t*)_bitmask + _last);
  1439. if (bmask2 != 0)
  1440. return _last * SIZE_BIT + CTZ(bmask2);
  1441. const auto next1 = (qmask / 2 + _last) & qmask;
  1442. const auto bmask1 = *((size_t*)_bitmask + next1);
  1443. if (bmask1 != 0) {
  1444. return next1 * SIZE_BIT + CTZ(bmask1);
  1445. }
  1446. _last = (_last + 1) & qmask;
  1447. }
  1448. return 0;
  1449. }
  1450. size_type find_last_bucket(size_type main_bucket) const
  1451. {
  1452. auto next_bucket = EMH_BUCKET(_pairs, main_bucket);
  1453. if (next_bucket == main_bucket)
  1454. return main_bucket;
  1455. while (true) {
  1456. const auto nbucket = EMH_BUCKET(_pairs, next_bucket);
  1457. if (nbucket == next_bucket)
  1458. return next_bucket;
  1459. next_bucket = nbucket;
  1460. }
  1461. }
  1462. size_type find_prev_bucket(size_type main_bucket, const size_type bucket) const
  1463. {
  1464. auto next_bucket = EMH_BUCKET(_pairs, main_bucket);
  1465. if (next_bucket == bucket)
  1466. return main_bucket;
  1467. while (true) {
  1468. const auto nbucket = EMH_BUCKET(_pairs, next_bucket);
  1469. if (nbucket == bucket)
  1470. return next_bucket;
  1471. next_bucket = nbucket;
  1472. }
  1473. }
  1474. size_type find_unique_bucket(const KeyT& key)
  1475. {
  1476. const auto bucket = size_type(hash_key(key) & _mask);
  1477. const auto next_bucket = EMH_ADDR(_pairs, bucket);
  1478. if ((int)next_bucket < 0) {
  1479. #if EMH_SAFE_HASH
  1480. _num_main ++;
  1481. #endif
  1482. return bucket * 2;
  1483. }
  1484. //check current bucket_key is in main bucket or not
  1485. if (next_bucket == bucket * 2)
  1486. return (EMH_ADDR(_pairs, bucket) = find_empty_bucket(bucket) * 2) + 1;
  1487. else if (next_bucket % 2 > 0)
  1488. return kickout_bucket(bucket);
  1489. const auto last_bucket = find_last_bucket(next_bucket / 2);
  1490. //find a new empty and link it to tail
  1491. return EMH_ADDR(_pairs, last_bucket) = find_empty_bucket(last_bucket) * 2 + 1;
  1492. }
  1493. #if EMH_INT_HASH
  1494. static constexpr uint64_t KC = UINT64_C(11400714819323198485);
  1495. inline uint64_t hash64(uint64_t key)
  1496. {
  1497. #if __SIZEOF_INT128__ && EMH_INT_HASH == 1
  1498. __uint128_t r = key; r *= KC;
  1499. return (uint64_t)(r >> 64) + (uint64_t)r;
  1500. #elif EMH_INT_HASH == 2
  1501. //MurmurHash3Mixer
  1502. uint64_t h = key;
  1503. h ^= h >> 33;
  1504. h *= 0xff51afd7ed558ccd;
  1505. h ^= h >> 33;
  1506. h *= 0xc4ceb9fe1a85ec53;
  1507. h ^= h >> 33;
  1508. return h;
  1509. #elif _WIN64 && EMH_INT_HASH == 1
  1510. uint64_t high;
  1511. return _umul128(key, KC, &high) + high;
  1512. #elif EMH_INT_HASH == 3
  1513. auto ror = (key >> 32) | (key << 32);
  1514. auto low = key * 0xA24BAED4963EE407ull;
  1515. auto high = ror * 0x9FB21C651E98DF25ull;
  1516. auto mix = low + high;
  1517. return mix;
  1518. #elif EMH_INT_HASH == 1
  1519. uint64_t r = key * UINT64_C(0xca4bcaa75ec3f625);
  1520. return (r >> 32) + r;
  1521. #elif EMH_WYHASH64
  1522. return wyhash64(key, KC);
  1523. #else
  1524. uint64_t x = key;
  1525. x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9);
  1526. x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb);
  1527. x = x ^ (x >> 31);
  1528. return x;
  1529. #endif
  1530. }
  1531. #endif
  1532. inline size_type hash_main(const size_type bucket) const
  1533. {
  1534. return hash_key(EMH_KEY(_pairs, bucket)) & _mask;
  1535. }
  1536. template<typename UType, typename std::enable_if<std::is_integral<UType>::value, size_type>::type = 0>
  1537. inline size_type hash_key(const UType key) const
  1538. {
  1539. #if EMH_INT_HASH
  1540. return hash64(key);
  1541. #elif EMH_SAFE_HASH
  1542. return _hash_inter == 0 ? _hasher(key) : hash64(key);
  1543. #elif EMH_IDENTITY_HASH
  1544. return key + (key >> 24);
  1545. #else
  1546. return (size_type)_hasher(key);
  1547. #endif
  1548. }
  1549. template<typename UType, typename std::enable_if<std::is_same<UType, std::string>::value, size_type>::type = 0>
  1550. inline size_type hash_key(const UType& key) const
  1551. {
  1552. #if EMH_WY_HASH
  1553. return wyhash(key.data(), key.size(), 0);
  1554. #else
  1555. return (size_type)_hasher(key);
  1556. #endif
  1557. }
  1558. template<typename UType, typename std::enable_if<!std::is_integral<UType>::value && !std::is_same<UType, std::string>::value, size_type>::type = 0>
  1559. inline size_type hash_key(const UType& key) const
  1560. {
  1561. return (size_type)_hasher(key);
  1562. }
  1563. //8 * 2 + 4 * 5 = 16 + 20 = 32
  1564. private:
  1565. PairT* _pairs;
  1566. uint32_t* _bitmask;
  1567. HashT _hasher;
  1568. EqT _eq;
  1569. size_type _mask;
  1570. size_type _num_filled;
  1571. uint32_t _mlf;
  1572. #if EMH_FIND_HIT
  1573. // size_type _zero_index;
  1574. #endif
  1575. #if EMH_SAFE_HASH
  1576. size_type _num_main;
  1577. size_type _hash_inter;
  1578. #endif
  1579. static constexpr uint32_t BIT_PACK = sizeof(_bitmask[0]) * 2;
  1580. static constexpr uint32_t MASK_BIT = sizeof(_bitmask[0]) * 8;
  1581. static constexpr uint32_t SIZE_BIT = sizeof(size_t) * 8;
  1582. static constexpr uint32_t PACK_SIZE = 2; // > 1
  1583. };
  1584. }
  1585. // namespace emhash6
  1586. #if __cplusplus >= 201103L
  1587. //template <class Key, class Val> using ehmap6 = emhash6::HashMap<Key, Val, std::hash<Key>>;
  1588. #endif