LCOV - code coverage report
Current view: top level - asmjit - zonehash.cpp (source / functions) Hit Total Coverage
Test: plumed test coverage (other modules) Lines: 0 42 0.0 %
Date: 2026-11-05 10:19:06 Functions: 0 3 0.0 %

          Line data    Source code
       1             : #ifdef __PLUMED_HAS_ASMJIT
       2             : // This file is part of AsmJit project <https://asmjit.com>
       3             : //
       4             : // See asmjit.h or LICENSE.md for license and copyright information
       5             : // SPDX-License-Identifier: Zlib
       6             : 
       7             : #include "api-build_p.h"
       8             : #include "support.h"
       9             : #include "zone.h"
      10             : #include "zonehash.h"
      11             : 
      12             : ASMJIT_BEGIN_NAMESPACE
      13             : 
      14             : // ZoneHashBase - Prime Numbers
      15             : // ============================
      16             : 
      17             : #define ASMJIT_POPULATE_PRIMES(ENTRY) \
      18             :   ENTRY(2         , 0x80000000, 32), /* [N * 0x80000000 >> 32] (rcp=2147483648) */ \
      19             :   ENTRY(11        , 0xBA2E8BA3, 35), /* [N * 0xBA2E8BA3 >> 35] (rcp=3123612579) */ \
      20             :   ENTRY(29        , 0x8D3DCB09, 36), /* [N * 0x8D3DCB09 >> 36] (rcp=2369637129) */ \
      21             :   ENTRY(41        , 0xC7CE0C7D, 37), /* [N * 0xC7CE0C7D >> 37] (rcp=3352169597) */ \
      22             :   ENTRY(59        , 0x8AD8F2FC, 37), /* [N * 0x8AD8F2FC >> 37] (rcp=2329473788) */ \
      23             :   ENTRY(83        , 0xC565C87C, 38), /* [N * 0xC565C87C >> 38] (rcp=3311782012) */ \
      24             :   ENTRY(131       , 0xFA232CF3, 39), /* [N * 0xFA232CF3 >> 39] (rcp=4196609267) */ \
      25             :   ENTRY(191       , 0xAB8F69E3, 39), /* [N * 0xAB8F69E3 >> 39] (rcp=2878302691) */ \
      26             :   ENTRY(269       , 0xF3A0D52D, 40), /* [N * 0xF3A0D52D >> 40] (rcp=4087403821) */ \
      27             :   ENTRY(383       , 0xAB1CBDD4, 40), /* [N * 0xAB1CBDD4 >> 40] (rcp=2870787540) */ \
      28             :   ENTRY(541       , 0xF246FACC, 41), /* [N * 0xF246FACC >> 41] (rcp=4064737996) */ \
      29             :   ENTRY(757       , 0xAD2589A4, 41), /* [N * 0xAD2589A4 >> 41] (rcp=2904918436) */ \
      30             :   ENTRY(1061      , 0xF7129426, 42), /* [N * 0xF7129426 >> 42] (rcp=4145189926) */ \
      31             :   ENTRY(1499      , 0xAEE116B7, 42), /* [N * 0xAEE116B7 >> 42] (rcp=2933986999) */ \
      32             :   ENTRY(2099      , 0xF9C7A737, 43), /* [N * 0xF9C7A737 >> 43] (rcp=4190611255) */ \
      33             :   ENTRY(2939      , 0xB263D25C, 43), /* [N * 0xB263D25C >> 43] (rcp=2992886364) */ \
      34             :   ENTRY(4111      , 0xFF10E02E, 44), /* [N * 0xFF10E02E >> 44] (rcp=4279296046) */ \
      35             :   ENTRY(5779      , 0xB5722823, 44), /* [N * 0xB5722823 >> 44] (rcp=3044157475) */ \
      36             :   ENTRY(8087      , 0x81A97405, 44), /* [N * 0x81A97405 >> 44] (rcp=2175366149) */ \
      37             :   ENTRY(11321     , 0xB93E91DB, 45), /* [N * 0xB93E91DB >> 45] (rcp=3107885531) */ \
      38             :   ENTRY(15859     , 0x843CC26B, 45), /* [N * 0x843CC26B >> 45] (rcp=2218574443) */ \
      39             :   ENTRY(22189     , 0xBD06B9EA, 46), /* [N * 0xBD06B9EA >> 46] (rcp=3171334634) */ \
      40             :   ENTRY(31051     , 0x8713F186, 46), /* [N * 0x8713F186 >> 46] (rcp=2266231174) */ \
      41             :   ENTRY(43451     , 0xC10F1CB9, 47), /* [N * 0xC10F1CB9 >> 47] (rcp=3238993081) */ \
      42             :   ENTRY(60869     , 0x89D06A86, 47), /* [N * 0x89D06A86 >> 47] (rcp=2312137350) */ \
      43             :   ENTRY(85159     , 0xC502AF3B, 48), /* [N * 0xC502AF3B >> 48] (rcp=3305287483) */ \
      44             :   ENTRY(102107    , 0xA44F65AE, 48), /* [N * 0xA44F65AE >> 48] (rcp=2756666798) */ \
      45             :   ENTRY(122449    , 0x89038F77, 48), /* [N * 0x89038F77 >> 48] (rcp=2298711927) */ \
      46             :   ENTRY(146819    , 0xE48AF7E9, 49), /* [N * 0xE48AF7E9 >> 49] (rcp=3834312681) */ \
      47             :   ENTRY(176041    , 0xBE9B145B, 49), /* [N * 0xBE9B145B >> 49] (rcp=3197834331) */ \
      48             :   ENTRY(211073    , 0x9EF882BA, 49), /* [N * 0x9EF882BA >> 49] (rcp=2667086522) */ \
      49             :   ENTRY(253081    , 0x849571AB, 49), /* [N * 0x849571AB >> 49] (rcp=2224386475) */ \
      50             :   ENTRY(303469    , 0xDD239C97, 50), /* [N * 0xDD239C97 >> 50] (rcp=3710098583) */ \
      51             :   ENTRY(363887    , 0xB86C196D, 50), /* [N * 0xB86C196D >> 50] (rcp=3094092141) */ \
      52             :   ENTRY(436307    , 0x99CFA4E9, 50), /* [N * 0x99CFA4E9 >> 50] (rcp=2580522217) */ \
      53             :   ENTRY(523177    , 0x804595C0, 50), /* [N * 0x804595C0 >> 50] (rcp=2152043968) */ \
      54             :   ENTRY(627293    , 0xD5F69FCF, 51), /* [N * 0xD5F69FCF >> 51] (rcp=3589709775) */ \
      55             :   ENTRY(752177    , 0xB27063BA, 51), /* [N * 0xB27063BA >> 51] (rcp=2993710010) */ \
      56             :   ENTRY(901891    , 0x94D170AC, 51), /* [N * 0x94D170AC >> 51] (rcp=2496753836) */ \
      57             :   ENTRY(1081369   , 0xF83C9767, 52), /* [N * 0xF83C9767 >> 52] (rcp=4164720487) */ \
      58             :   ENTRY(1296563   , 0xCF09435D, 52), /* [N * 0xCF09435D >> 52] (rcp=3473490781) */ \
      59             :   ENTRY(1554583   , 0xACAC7198, 52), /* [N * 0xACAC7198 >> 52] (rcp=2896982424) */ \
      60             :   ENTRY(1863971   , 0x90033EE3, 52), /* [N * 0x90033EE3 >> 52] (rcp=2416131811) */ \
      61             :   ENTRY(2234923   , 0xF0380EBD, 53), /* [N * 0xF0380EBD >> 53] (rcp=4030205629) */ \
      62             :   ENTRY(2679673   , 0xC859731E, 53), /* [N * 0xC859731E >> 53] (rcp=3361305374) */ \
      63             :   ENTRY(3212927   , 0xA718DE27, 53), /* [N * 0xA718DE27 >> 53] (rcp=2803424807) */ \
      64             :   ENTRY(3852301   , 0x8B5D1B4B, 53), /* [N * 0x8B5D1B4B >> 53] (rcp=2338134859) */ \
      65             :   ENTRY(4618921   , 0xE8774804, 54), /* [N * 0xE8774804 >> 54] (rcp=3900131332) */ \
      66             :   ENTRY(5076199   , 0xD386574E, 54), /* [N * 0xD386574E >> 54] (rcp=3548796750) */ \
      67             :   ENTRY(5578757   , 0xC0783FE1, 54), /* [N * 0xC0783FE1 >> 54] (rcp=3229106145) */ \
      68             :   ENTRY(6131057   , 0xAF21B08F, 54), /* [N * 0xAF21B08F >> 54] (rcp=2938220687) */ \
      69             :   ENTRY(6738031   , 0x9F5AFD6E, 54), /* [N * 0x9F5AFD6E >> 54] (rcp=2673540462) */ \
      70             :   ENTRY(7405163   , 0x90FFC3B9, 54), /* [N * 0x90FFC3B9 >> 54] (rcp=2432680889) */ \
      71             :   ENTRY(8138279   , 0x83EFECFC, 54), /* [N * 0x83EFECFC >> 54] (rcp=2213539068) */ \
      72             :   ENTRY(8943971   , 0xF01AA2EF, 55), /* [N * 0xF01AA2EF >> 55] (rcp=4028277487) */ \
      73             :   ENTRY(9829447   , 0xDA7979B2, 55), /* [N * 0xDA7979B2 >> 55] (rcp=3665394098) */ \
      74             :   ENTRY(10802581  , 0xC6CB2771, 55), /* [N * 0xC6CB2771 >> 55] (rcp=3335202673) */ \
      75             :   ENTRY(11872037  , 0xB4E2C7DD, 55), /* [N * 0xB4E2C7DD >> 55] (rcp=3034761181) */ \
      76             :   ENTRY(13047407  , 0xA4974124, 55), /* [N * 0xA4974124 >> 55] (rcp=2761376036) */ \
      77             :   ENTRY(14339107  , 0x95C39CF1, 55), /* [N * 0x95C39CF1 >> 55] (rcp=2512624881) */ \
      78             :   ENTRY(15758737  , 0x8845C763, 55), /* [N * 0x8845C763 >> 55] (rcp=2286274403) */ \
      79             :   ENTRY(17318867  , 0xF7FE593F, 56), /* [N * 0xF7FE593F >> 56] (rcp=4160641343) */ \
      80             :   ENTRY(19033439  , 0xE1A75D93, 56), /* [N * 0xE1A75D93 >> 56] (rcp=3785842067) */ \
      81             :   ENTRY(20917763  , 0xCD5389B3, 56), /* [N * 0xCD5389B3 >> 56] (rcp=3444804019) */ \
      82             :   ENTRY(22988621  , 0xBAD4841A, 56), /* [N * 0xBAD4841A >> 56] (rcp=3134489626) */ \
      83             :   ENTRY(25264543  , 0xA9FFF2FF, 56), /* [N * 0xA9FFF2FF >> 56] (rcp=2852123391) */ \
      84             :   ENTRY(27765763  , 0x9AAF8BF3, 56), /* [N * 0x9AAF8BF3 >> 56] (rcp=2595195891) */ \
      85             :   ENTRY(30514607  , 0x8CC04E18, 56), /* [N * 0x8CC04E18 >> 56] (rcp=2361413144) */ \
      86             :   ENTRY(33535561  , 0x80127068, 56), /* [N * 0x80127068 >> 56] (rcp=2148692072) */ \
      87             :   ENTRY(36855587  , 0xE911F0BB, 57), /* [N * 0xE911F0BB >> 57] (rcp=3910267067) */ \
      88             :   ENTRY(38661533  , 0xDE2ED7BE, 57), /* [N * 0xDE2ED7BE >> 57] (rcp=3727611838) */ \
      89             :   ENTRY(40555961  , 0xD3CDF2FD, 57), /* [N * 0xD3CDF2FD >> 57] (rcp=3553489661) */ \
      90             :   ENTRY(42543269  , 0xC9E9196C, 57), /* [N * 0xC9E9196C >> 57] (rcp=3387496812) */ \
      91             :   ENTRY(44627909  , 0xC07A9EB6, 57), /* [N * 0xC07A9EB6 >> 57] (rcp=3229261494) */ \
      92             :   ENTRY(46814687  , 0xB77CEF65, 57), /* [N * 0xB77CEF65 >> 57] (rcp=3078418277) */ \
      93             :   ENTRY(49108607  , 0xAEEAC65C, 57), /* [N * 0xAEEAC65C >> 57] (rcp=2934621788) */ \
      94             :   ENTRY(51514987  , 0xA6BF0EF0, 57), /* [N * 0xA6BF0EF0 >> 57] (rcp=2797539056) */ \
      95             :   ENTRY(54039263  , 0x9EF510B5, 57), /* [N * 0x9EF510B5 >> 57] (rcp=2666860725) */ \
      96             :   ENTRY(56687207  , 0x97883B42, 57), /* [N * 0x97883B42 >> 57] (rcp=2542287682) */ \
      97             :   ENTRY(59464897  , 0x907430ED, 57), /* [N * 0x907430ED >> 57] (rcp=2423533805) */ \
      98             :   ENTRY(62378699  , 0x89B4CA91, 57), /* [N * 0x89B4CA91 >> 57] (rcp=2310326929) */ \
      99             :   ENTRY(65435273  , 0x83461568, 57), /* [N * 0x83461568 >> 57] (rcp=2202408296) */ \
     100             :   ENTRY(68641607  , 0xFA489AA8, 58), /* [N * 0xFA489AA8 >> 58] (rcp=4199062184) */ \
     101             :   ENTRY(72005051  , 0xEE97B1C5, 58), /* [N * 0xEE97B1C5 >> 58] (rcp=4002918853) */ \
     102             :   ENTRY(75533323  , 0xE3729293, 58), /* [N * 0xE3729293 >> 58] (rcp=3815936659) */ \
     103             :   ENTRY(79234469  , 0xD8D2BBA3, 58), /* [N * 0xD8D2BBA3 >> 58] (rcp=3637689251) */ \
     104             :   ENTRY(83116967  , 0xCEB1F196, 58), /* [N * 0xCEB1F196 >> 58] (rcp=3467768214) */ \
     105             :   ENTRY(87189709  , 0xC50A4426, 58), /* [N * 0xC50A4426 >> 58] (rcp=3305784358) */ \
     106             :   ENTRY(91462061  , 0xBBD6052B, 58), /* [N * 0xBBD6052B >> 58] (rcp=3151365419) */ \
     107             :   ENTRY(95943737  , 0xB30FD999, 58), /* [N * 0xB30FD999 >> 58] (rcp=3004160409) */ \
     108             :   ENTRY(100644991 , 0xAAB29CED, 58), /* [N * 0xAAB29CED >> 58] (rcp=2863832301) */ \
     109             :   ENTRY(105576619 , 0xA2B96421, 58), /* [N * 0xA2B96421 >> 58] (rcp=2730058785) */ \
     110             :   ENTRY(110749901 , 0x9B1F8434, 58), /* [N * 0x9B1F8434 >> 58] (rcp=2602533940) */ \
     111             :   ENTRY(116176651 , 0x93E08B4A, 58), /* [N * 0x93E08B4A >> 58] (rcp=2480966474) */ \
     112             :   ENTRY(121869317 , 0x8CF837E0, 58), /* [N * 0x8CF837E0 >> 58] (rcp=2365077472) */ \
     113             :   ENTRY(127840913 , 0x86627F01, 58), /* [N * 0x86627F01 >> 58] (rcp=2254601985) */ \
     114             :   ENTRY(134105159 , 0x801B8178, 58), /* [N * 0x801B8178 >> 58] (rcp=2149286264) */ \
     115             :   ENTRY(140676353 , 0xF43F294F, 59), /* [N * 0xF43F294F >> 59] (rcp=4097780047) */ \
     116             :   ENTRY(147569509 , 0xE8D67089, 59), /* [N * 0xE8D67089 >> 59] (rcp=3906367625) */ \
     117             :   ENTRY(154800449 , 0xDDF6243C, 59), /* [N * 0xDDF6243C >> 59] (rcp=3723895868) */ \
     118             :   ENTRY(162385709 , 0xD397E6AE, 59), /* [N * 0xD397E6AE >> 59] (rcp=3549947566) */ \
     119             :   ENTRY(170342629 , 0xC9B5A65A, 59), /* [N * 0xC9B5A65A >> 59] (rcp=3384125018) */ \
     120             :   ENTRY(178689419 , 0xC0499865, 59), /* [N * 0xC0499865 >> 59] (rcp=3226048613) */ \
     121             :   ENTRY(187445201 , 0xB74E35FA, 59), /* [N * 0xB74E35FA >> 59] (rcp=3075356154) */ \
     122             :   ENTRY(196630033 , 0xAEBE3AC1, 59), /* [N * 0xAEBE3AC1 >> 59] (rcp=2931702465) */ \
     123             :   ENTRY(206264921 , 0xA694A37F, 59), /* [N * 0xA694A37F >> 59] (rcp=2794759039) */ \
     124             :   ENTRY(216371963 , 0x9ECCA59F, 59), /* [N * 0x9ECCA59F >> 59] (rcp=2664211871) */ \
     125             :   ENTRY(226974197 , 0x9761B6AE, 59), /* [N * 0x9761B6AE >> 59] (rcp=2539763374) */ \
     126             :   ENTRY(238095983 , 0x904F79A1, 59), /* [N * 0x904F79A1 >> 59] (rcp=2421127585) */ \
     127             :   ENTRY(249762697 , 0x8991CD1F, 59), /* [N * 0x8991CD1F >> 59] (rcp=2308033823) */ \
     128             :   ENTRY(262001071 , 0x8324BCA5, 59), /* [N * 0x8324BCA5 >> 59] (rcp=2200222885) */ \
     129             :   ENTRY(274839137 , 0xFA090732, 60), /* [N * 0xFA090732 >> 60] (rcp=4194895666) */ \
     130             :   ENTRY(288306269 , 0xEE5B16ED, 60), /* [N * 0xEE5B16ED >> 60] (rcp=3998947053) */ \
     131             :   ENTRY(302433337 , 0xE338CE49, 60), /* [N * 0xE338CE49 >> 60] (rcp=3812150857) */ \
     132             :   ENTRY(317252587 , 0xD89BABC0, 60), /* [N * 0xD89BABC0 >> 60] (rcp=3634080704) */ \
     133             :   ENTRY(374358107 , 0xB790EF43, 60), /* [N * 0xB790EF43 >> 60] (rcp=3079728963) */ \
     134             :   ENTRY(441742621 , 0x9B908414, 60), /* [N * 0x9B908414 >> 60] (rcp=2609939476) */ \
     135             :   ENTRY(521256293 , 0x83D596FA, 60), /* [N * 0x83D596FA >> 60] (rcp=2211813114) */ \
     136             :   ENTRY(615082441 , 0xDF72B16E, 61), /* [N * 0xDF72B16E >> 61] (rcp=3748835694) */ \
     137             :   ENTRY(725797313 , 0xBD5CDB3B, 61), /* [N * 0xBD5CDB3B >> 61] (rcp=3176979259) */ \
     138             :   ENTRY(856440829 , 0xA07A14E9, 61), /* [N * 0xA07A14E9 >> 61] (rcp=2692355305) */ \
     139             :   ENTRY(1010600209, 0x87FF5289, 61), /* [N * 0x87FF5289 >> 61] (rcp=2281656969) */ \
     140             :   ENTRY(1192508257, 0xE6810540, 62), /* [N * 0xE6810540 >> 62] (rcp=3867215168) */ \
     141             :   ENTRY(1407159797, 0xC357A480, 62), /* [N * 0xC357A480 >> 62] (rcp=3277300864) */ \
     142             :   ENTRY(1660448617, 0xA58B5B4F, 62), /* [N * 0xA58B5B4F >> 62] (rcp=2777373519) */ \
     143             :   ENTRY(1959329399, 0x8C4AB55F, 62), /* [N * 0x8C4AB55F >> 62] (rcp=2353706335) */ \
     144             :   ENTRY(2312008693, 0xEDC86320, 63), /* [N * 0xEDC86320 >> 63] (rcp=3989332768) */ \
     145             :   ENTRY(2728170257, 0xC982C4D2, 63), /* [N * 0xC982C4D2 >> 63] (rcp=3380790482) */ \
     146             :   ENTRY(3219240923, 0xAAC599B6, 63)  /* [N * 0xAAC599B6 >> 63] (rcp=2865076662) */
     147             : 
     148             : 
     149             : struct HashPrime {
     150             :   //! Prime number
     151             :   uint32_t prime;
     152             :   //! Reciprocal to turn division into multiplication.
     153             :   uint32_t rcp;
     154             : };
     155             : 
     156             : static const HashPrime ZoneHash_primeArray[] = {
     157             :   #define E(PRIME, RCP, SHIFT) { PRIME, RCP }
     158             :   ASMJIT_POPULATE_PRIMES(E)
     159             :   #undef E
     160             : };
     161             : 
     162             : static const uint8_t ZoneHash_primeShift[] = {
     163             :   #define E(PRIME, RCP, SHIFT) uint8_t(SHIFT)
     164             :   ASMJIT_POPULATE_PRIMES(E)
     165             :   #undef E
     166             : };
     167             : 
     168             : // ZoneHashBase - Rehash
     169             : // =====================
     170             : 
     171           0 : void ZoneHashBase::_rehash(ZoneAllocator* allocator, uint32_t primeIndex) noexcept {
     172             :   ASMJIT_ASSERT(primeIndex < ASMJIT_ARRAY_SIZE(ZoneHash_primeArray));
     173           0 :   uint32_t newCount = ZoneHash_primeArray[primeIndex].prime;
     174             : 
     175           0 :   ZoneHashNode** oldData = _data;
     176             :   ZoneHashNode** newData = reinterpret_cast<ZoneHashNode**>(
     177           0 :     allocator->allocZeroed(size_t(newCount) * sizeof(ZoneHashNode*)));
     178             : 
     179             :   // We can still store nodes into the table, but it will degrade.
     180           0 :   if (ASMJIT_UNLIKELY(newData == nullptr))
     181             :     return;
     182             : 
     183             :   uint32_t i;
     184           0 :   uint32_t oldCount = _bucketsCount;
     185             : 
     186           0 :   _data = newData;
     187           0 :   _bucketsCount = newCount;
     188           0 :   _bucketsGrow = uint32_t(newCount * 0.9);
     189           0 :   _rcpValue = ZoneHash_primeArray[primeIndex].rcp;
     190           0 :   _rcpShift = ZoneHash_primeShift[primeIndex];
     191           0 :   _primeIndex = uint8_t(primeIndex);
     192             : 
     193           0 :   for (i = 0; i < oldCount; i++) {
     194           0 :     ZoneHashNode* node = oldData[i];
     195           0 :     while (node) {
     196           0 :       ZoneHashNode* next = node->_hashNext;
     197           0 :       uint32_t hashMod = _calcMod(node->_hashCode);
     198             : 
     199           0 :       node->_hashNext = newData[hashMod];
     200           0 :       newData[hashMod] = node;
     201             :       node = next;
     202             :     }
     203             :   }
     204             : 
     205           0 :   if (oldData != _embedded)
     206           0 :     allocator->release(oldData, oldCount * sizeof(ZoneHashNode*));
     207             : }
     208             : 
     209             : // ZoneHashBase - Operations
     210             : // =========================
     211             : 
     212           0 : ZoneHashNode* ZoneHashBase::_insert(ZoneAllocator* allocator, ZoneHashNode* node) noexcept {
     213           0 :   uint32_t hashMod = _calcMod(node->_hashCode);
     214           0 :   ZoneHashNode* next = _data[hashMod];
     215             : 
     216           0 :   node->_hashNext = next;
     217           0 :   _data[hashMod] = node;
     218             : 
     219           0 :   if (++_size > _bucketsGrow) {
     220           0 :     uint32_t primeIndex = Support::min<uint32_t>(_primeIndex + 2, ASMJIT_ARRAY_SIZE(ZoneHash_primeArray) - 1);
     221           0 :     if (primeIndex > _primeIndex)
     222           0 :       _rehash(allocator, primeIndex);
     223             :   }
     224             : 
     225           0 :   return node;
     226             : }
     227             : 
     228           0 : ZoneHashNode* ZoneHashBase::_remove(ZoneAllocator* allocator, ZoneHashNode* node) noexcept {
     229             :   DebugUtils::unused(allocator);
     230           0 :   uint32_t hashMod = _calcMod(node->_hashCode);
     231             : 
     232           0 :   ZoneHashNode** pPrev = &_data[hashMod];
     233           0 :   ZoneHashNode* p = *pPrev;
     234             : 
     235           0 :   while (p) {
     236           0 :     if (p == node) {
     237           0 :       *pPrev = p->_hashNext;
     238           0 :       _size--;
     239           0 :       return node;
     240             :     }
     241             : 
     242           0 :     pPrev = &p->_hashNext;
     243           0 :     p = *pPrev;
     244             :   }
     245             : 
     246             :   return nullptr;
     247             : }
     248             : 
     249             : // ZoneHashBase - Tests
     250             : // ====================
     251             : 
     252             : #if defined(ASMJIT_TEST)
     253             : struct MyHashNode : public ZoneHashNode {
     254             :   inline MyHashNode(uint32_t key) noexcept
     255             :     : ZoneHashNode(key),
     256             :       _key(key) {}
     257             : 
     258             :   uint32_t _key;
     259             : };
     260             : 
     261             : struct MyKeyMatcher {
     262             :   inline MyKeyMatcher(uint32_t key) noexcept
     263             :     : _key(key) {}
     264             : 
     265             :   inline uint32_t hashCode() const noexcept { return _key; }
     266             :   inline bool matches(const MyHashNode* node) const noexcept { return node->_key == _key; }
     267             : 
     268             :   uint32_t _key;
     269             : };
     270             : 
     271             : UNIT(zone_hash) {
     272             :   uint32_t kCount = BrokenAPI::hasArg("--quick") ? 1000 : 10000;
     273             : 
     274             :   Zone zone(4096);
     275             :   ZoneAllocator allocator(&zone);
     276             : 
     277             :   ZoneHash<MyHashNode> hashTable;
     278             : 
     279             :   uint32_t key;
     280             :   INFO("Inserting %u elements to HashTable", unsigned(kCount));
     281             :   for (key = 0; key < kCount; key++) {
     282             :     hashTable.insert(&allocator, zone.newT<MyHashNode>(key));
     283             :   }
     284             : 
     285             :   uint32_t count = kCount;
     286             :   INFO("Removing %u elements from HashTable and validating each operation", unsigned(kCount));
     287             :   do {
     288             :     MyHashNode* node;
     289             : 
     290             :     for (key = 0; key < count; key++) {
     291             :       node = hashTable.get(MyKeyMatcher(key));
     292             :       EXPECT(node != nullptr);
     293             :       EXPECT(node->_key == key);
     294             :     }
     295             : 
     296             :     {
     297             :       count--;
     298             :       node = hashTable.get(MyKeyMatcher(count));
     299             :       hashTable.remove(&allocator, node);
     300             : 
     301             :       node = hashTable.get(MyKeyMatcher(count));
     302             :       EXPECT(node == nullptr);
     303             :     }
     304             :   } while (count);
     305             : 
     306             :   EXPECT(hashTable.empty());
     307             : }
     308             : #endif
     309             : 
     310             : ASMJIT_END_NAMESPACE
     311             : 
     312             : #endif // __PLUMED_HAS_ASMJIT

Generated by: LCOV version 1.16