1 /* 2 * Copyright 2008-2009 Katholieke Universiteit Leuven 3 * 4 * Use of this software is governed by the MIT license 5 * 6 * Written by Sven Verdoolaege, K.U.Leuven, Departement 7 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium 8 */ 9 10 #ifndef ISL_HASH_H 11 #define ISL_HASH_H 12 13 #include <stdlib.h> 14 #include <isl/stdint.h> 15 #include <isl/ctx.h> 16 17 #if defined(__cplusplus) 18 extern "C" { 19 #endif 20 21 #define isl_hash_init() (2166136261u) 22 #define isl_hash_byte(h,b) do { \ 23 h *= 16777619; \ 24 h ^= b; \ 25 } while(0) 26 #define isl_hash_hash(h,h2) \ 27 do { \ 28 isl_hash_byte(h, (h2) & 0xFF); \ 29 isl_hash_byte(h, ((h2) >> 8) & 0xFF); \ 30 isl_hash_byte(h, ((h2) >> 16) & 0xFF); \ 31 isl_hash_byte(h, ((h2) >> 24) & 0xFF); \ 32 } while(0) 33 #define isl_hash_bits(h,bits) \ 34 ((bits) == 32) ? (h) : \ 35 ((bits) >= 16) ? \ 36 ((h) >> (bits)) ^ ((h) & (((uint32_t)1 << (bits)) - 1)) : \ 37 (((h) >> (bits)) ^ (h)) & (((uint32_t)1 << (bits)) - 1) 38 39 uint32_t isl_hash_string(uint32_t hash, const char *s); 40 uint32_t isl_hash_mem(uint32_t hash, const void *p, size_t len); 41 42 #define isl_hash_builtin(h,l) isl_hash_mem(h, &l, sizeof(l)) 43 44 struct isl_hash_table_entry 45 { 46 uint32_t hash; 47 void *data; 48 }; 49 50 struct isl_hash_table { 51 int bits; 52 int n; 53 struct isl_hash_table_entry *entries; 54 }; 55 56 struct isl_hash_table *isl_hash_table_alloc(struct isl_ctx *ctx, int min_size); 57 void isl_hash_table_free(struct isl_ctx *ctx, struct isl_hash_table *table); 58 59 int isl_hash_table_init(struct isl_ctx *ctx, struct isl_hash_table *table, 60 int min_size); 61 void isl_hash_table_clear(struct isl_hash_table *table); 62 extern struct isl_hash_table_entry *isl_hash_table_entry_none; 63 struct isl_hash_table_entry *isl_hash_table_find(struct isl_ctx *ctx, 64 struct isl_hash_table *table, 65 uint32_t key_hash, 66 isl_bool (*eq)(const void *entry, const void *val), 67 const void *val, int reserve); 68 isl_stat isl_hash_table_foreach(isl_ctx *ctx, struct isl_hash_table *table, 69 isl_stat (*fn)(void **entry, void *user), void *user); 70 void isl_hash_table_remove(struct isl_ctx *ctx, 71 struct isl_hash_table *table, 72 struct isl_hash_table_entry *entry); 73 74 #if defined(__cplusplus) 75 } 76 #endif 77 78 #endif 79