27 #ifndef APPLICATIONS_STP_SRC_DPBORDER_HASHMAP_H_ 28 #define APPLICATIONS_STP_SRC_DPBORDER_HASHMAP_H_ 33 #pragma warning(push, 0) 34 #pragma warning(disable : 4668) 41 #if (defined(_MSC_VER) && defined(__AVX__)) || \ 42 (!defined(_MSC_VER) && defined(__SSE4_2__)) || \ 43 (defined(__INTEL_COMPILER)) 47 #if defined(HASHMAP_SSE42) 48 #include <nmmintrin.h> 58 #pragma warning(disable : 4505) 60 #pragma warning(disable : 4710) 62 #pragma warning(disable : 4711) 63 #elif defined(__clang__) 64 #pragma clang diagnostic push 65 #pragma clang diagnostic ignored "-Wunused-function" 70 #elif defined(__GNUC__) 71 #define HASHMAP_USED __attribute__((used)) 93 #define HASHMAP_MAX_CHAIN_LENGTH (8) 95 #if defined(__cplusplus) 170 const char *
const keystring,
173 int position,
const unsigned len,
180 #if defined(__cplusplus) 184 #if defined(__cplusplus) 185 #define HASHMAP_CAST(type, x) static_cast<type>(x) 186 #define HASHMAP_PTR_CAST(type, x) reinterpret_cast<type>(x) 187 #define HASHMAP_NULL NULL 189 #define HASHMAP_CAST(type, x) ((type)x) 190 #define HASHMAP_PTR_CAST(type, x) ((type)x) 191 #define HASHMAP_NULL 0 196 const char *
const key,
const char *
const keyarr,
const unsigned len) {
197 return (element->
key_len == len) && (0 == memcmp(&keyarr[element->
key_position], key, len));
205 out_hashmap->
size = 0;
208 if (0 == initial_size || 0 != (initial_size & (initial_size - 1))) {
227 assert(keyarr && out_hashmap);
233 const unsigned len,
int value) {
235 assert(key_position >= 0);
261 const unsigned len,
int value) {
263 assert(position >= 0);
286 const unsigned len) {
299 if (elements[curr].
in_use) {
301 return elements[curr].
value;
313 const unsigned len) {
378 return (m->
size == 0);
383 unsigned crc32val = 0;
385 #if defined(HASHMAP_SSE42) 386 for (i = 0; i < len; i++) {
387 crc32val = _mm_crc32_u8(crc32val,
HASHMAP_CAST(
unsigned char, s[i]));
393 static const unsigned crc32_tab[] = {
394 0x00000000U, 0xF26B8303U, 0xE13B70F7U, 0x1350F3F4U, 0xC79A971FU,
395 0x35F1141CU, 0x26A1E7E8U, 0xD4CA64EBU, 0x8AD958CFU, 0x78B2DBCCU,
396 0x6BE22838U, 0x9989AB3BU, 0x4D43CFD0U, 0xBF284CD3U, 0xAC78BF27U,
397 0x5E133C24U, 0x105EC76FU, 0xE235446CU, 0xF165B798U, 0x030E349BU,
398 0xD7C45070U, 0x25AFD373U, 0x36FF2087U, 0xC494A384U, 0x9A879FA0U,
399 0x68EC1CA3U, 0x7BBCEF57U, 0x89D76C54U, 0x5D1D08BFU, 0xAF768BBCU,
400 0xBC267848U, 0x4E4DFB4BU, 0x20BD8EDEU, 0xD2D60DDDU, 0xC186FE29U,
401 0x33ED7D2AU, 0xE72719C1U, 0x154C9AC2U, 0x061C6936U, 0xF477EA35U,
402 0xAA64D611U, 0x580F5512U, 0x4B5FA6E6U, 0xB93425E5U, 0x6DFE410EU,
403 0x9F95C20DU, 0x8CC531F9U, 0x7EAEB2FAU, 0x30E349B1U, 0xC288CAB2U,
404 0xD1D83946U, 0x23B3BA45U, 0xF779DEAEU, 0x05125DADU, 0x1642AE59U,
405 0xE4292D5AU, 0xBA3A117EU, 0x4851927DU, 0x5B016189U, 0xA96AE28AU,
406 0x7DA08661U, 0x8FCB0562U, 0x9C9BF696U, 0x6EF07595U, 0x417B1DBCU,
407 0xB3109EBFU, 0xA0406D4BU, 0x522BEE48U, 0x86E18AA3U, 0x748A09A0U,
408 0x67DAFA54U, 0x95B17957U, 0xCBA24573U, 0x39C9C670U, 0x2A993584U,
409 0xD8F2B687U, 0x0C38D26CU, 0xFE53516FU, 0xED03A29BU, 0x1F682198U,
410 0x5125DAD3U, 0xA34E59D0U, 0xB01EAA24U, 0x42752927U, 0x96BF4DCCU,
411 0x64D4CECFU, 0x77843D3BU, 0x85EFBE38U, 0xDBFC821CU, 0x2997011FU,
412 0x3AC7F2EBU, 0xC8AC71E8U, 0x1C661503U, 0xEE0D9600U, 0xFD5D65F4U,
413 0x0F36E6F7U, 0x61C69362U, 0x93AD1061U, 0x80FDE395U, 0x72966096U,
414 0xA65C047DU, 0x5437877EU, 0x4767748AU, 0xB50CF789U, 0xEB1FCBADU,
415 0x197448AEU, 0x0A24BB5AU, 0xF84F3859U, 0x2C855CB2U, 0xDEEEDFB1U,
416 0xCDBE2C45U, 0x3FD5AF46U, 0x7198540DU, 0x83F3D70EU, 0x90A324FAU,
417 0x62C8A7F9U, 0xB602C312U, 0x44694011U, 0x5739B3E5U, 0xA55230E6U,
418 0xFB410CC2U, 0x092A8FC1U, 0x1A7A7C35U, 0xE811FF36U, 0x3CDB9BDDU,
419 0xCEB018DEU, 0xDDE0EB2AU, 0x2F8B6829U, 0x82F63B78U, 0x709DB87BU,
420 0x63CD4B8FU, 0x91A6C88CU, 0x456CAC67U, 0xB7072F64U, 0xA457DC90U,
421 0x563C5F93U, 0x082F63B7U, 0xFA44E0B4U, 0xE9141340U, 0x1B7F9043U,
422 0xCFB5F4A8U, 0x3DDE77ABU, 0x2E8E845FU, 0xDCE5075CU, 0x92A8FC17U,
423 0x60C37F14U, 0x73938CE0U, 0x81F80FE3U, 0x55326B08U, 0xA759E80BU,
424 0xB4091BFFU, 0x466298FCU, 0x1871A4D8U, 0xEA1A27DBU, 0xF94AD42FU,
425 0x0B21572CU, 0xDFEB33C7U, 0x2D80B0C4U, 0x3ED04330U, 0xCCBBC033U,
426 0xA24BB5A6U, 0x502036A5U, 0x4370C551U, 0xB11B4652U, 0x65D122B9U,
427 0x97BAA1BAU, 0x84EA524EU, 0x7681D14DU, 0x2892ED69U, 0xDAF96E6AU,
428 0xC9A99D9EU, 0x3BC21E9DU, 0xEF087A76U, 0x1D63F975U, 0x0E330A81U,
429 0xFC588982U, 0xB21572C9U, 0x407EF1CAU, 0x532E023EU, 0xA145813DU,
430 0x758FE5D6U, 0x87E466D5U, 0x94B49521U, 0x66DF1622U, 0x38CC2A06U,
431 0xCAA7A905U, 0xD9F75AF1U, 0x2B9CD9F2U, 0xFF56BD19U, 0x0D3D3E1AU,
432 0x1E6DCDEEU, 0xEC064EEDU, 0xC38D26C4U, 0x31E6A5C7U, 0x22B65633U,
433 0xD0DDD530U, 0x0417B1DBU, 0xF67C32D8U, 0xE52CC12CU, 0x1747422FU,
434 0x49547E0BU, 0xBB3FFD08U, 0xA86F0EFCU, 0x5A048DFFU, 0x8ECEE914U,
435 0x7CA56A17U, 0x6FF599E3U, 0x9D9E1AE0U, 0xD3D3E1ABU, 0x21B862A8U,
436 0x32E8915CU, 0xC083125FU, 0x144976B4U, 0xE622F5B7U, 0xF5720643U,
437 0x07198540U, 0x590AB964U, 0xAB613A67U, 0xB831C993U, 0x4A5A4A90U,
438 0x9E902E7BU, 0x6CFBAD78U, 0x7FAB5E8CU, 0x8DC0DD8FU, 0xE330A81AU,
439 0x115B2B19U, 0x020BD8EDU, 0xF0605BEEU, 0x24AA3F05U, 0xD6C1BC06U,
440 0xC5914FF2U, 0x37FACCF1U, 0x69E9F0D5U, 0x9B8273D6U, 0x88D28022U,
441 0x7AB90321U, 0xAE7367CAU, 0x5C18E4C9U, 0x4F48173DU, 0xBD23943EU,
442 0xF36E6F75U, 0x0105EC76U, 0x12551F82U, 0xE03E9C81U, 0x34F4F86AU,
443 0xC69F7B69U, 0xD5CF889DU, 0x27A40B9EU, 0x79B737BAU, 0x8BDCB4B9U,
444 0x988C474DU, 0x6AE7C44EU, 0xBE2DA0A5U, 0x4C4623A6U, 0x5F16D052U,
447 for (i = 0; i < len; i++) {
448 crc32val = crc32_tab[(
HASHMAP_CAST(
unsigned char, crc32val) ^
457 const char *
const keystring,
458 const unsigned len) {
472 key = (key >> 3) * 2654435761;
478 const unsigned len,
unsigned *
const out_index) {
479 unsigned int start, curr;
512 if (HASHMAP_MAX_CHAIN_LENGTH > total_in_use) {
547 printf(
"reallocating hash map \n");
562 memcpy(m, &new_hash,
sizeof(
struct hashmap_s));
567 #if defined(_MSC_VER) 569 #elif defined(__clang__) 570 #pragma clang diagnostic pop #define HASHMAP_MAX_CHAIN_LENGTH
static void hashmap_destroy(struct hashmap_s *const hashmap) HASHMAP_USED
Destroy the hashmap.
static void hashmap_updateKeyarr(const char *keyarr, struct hashmap_s *out_hashmap) HASHMAP_USED
struct hashmap_s DPBHASHMAP
static int hashmap_remove(struct hashmap_s *const hashmap, int position, const unsigned len) HASHMAP_USED
Remove an element from the hashmap.
enum SCIP_Retcode SCIP_RETCODE
static int hashmap_rehash_iterator(struct hashmap_s *const m_new, struct hashmap_element_s *const e) HASHMAP_USED
static int hashmap_putcheck(struct hashmap_s *const hashmap, int key_position, const unsigned len, int value) HASHMAP_USED
Put an element into the hashmap.
static int hashmap_rehash_helper(struct hashmap_s *const m) HASHMAP_USED
static int hashmap_match_helper(const struct hashmap_element_s *const element, const char *const key, const char *const keyarr, const unsigned len)
#define HASHMAP_CAST(type, x)
static SCIP_RETCODE hashmap_create(const unsigned initial_size, const char *keyarr, struct hashmap_s *const out_hashmap) HASHMAP_USED
Create a hashmap.
static int hashmap_get(const struct hashmap_s *const hashmap, int position, const unsigned len) HASHMAP_USED
Get an element from the hashmap.
static int hashmap_hash_helper(const struct hashmap_s *const m, int position, const unsigned len, unsigned *const out_index) HASHMAP_USED
static unsigned hashmap_hash_helper_int_helper(const struct hashmap_s *const m, const char *const keystring, const unsigned len) HASHMAP_USED
struct hashmap_element_s * elements
static int hashmap_iterate_pairs(struct hashmap_s *const hashmap, struct hashmap_s *const hashmap_new) HASHMAP_USED
Iterate over all the elements in a hashmap.
static void hashmap_put(struct hashmap_s *const hashmap, int position, const unsigned len, int value) HASHMAP_USED
static unsigned hashmap_crc32_helper(const char *const s, const unsigned len) HASHMAP_USED
static SCIP_Bool hashmap_isEmpty(const struct hashmap_s *const hashmap) HASHMAP_USED
static unsigned hashmap_num_entries(const struct hashmap_s *const hashmap) HASHMAP_USED
Get the size of the hashmap.