Eina_Free_Cb data_free_cb);
EAPI Eina_Hash * eina_hash_string_djb2_new(Eina_Free_Cb data_free_cb);
EAPI Eina_Hash * eina_hash_string_superfast_new(Eina_Free_Cb data_free_cb);
+EAPI Eina_Hash * eina_hash_int32_new(Eina_Free_Cb data_free_cb);
+EAPI Eina_Hash * eina_hash_int64_new(Eina_Free_Cb data_free_cb);
+EAPI Eina_Hash * eina_hash_pointer_new(Eina_Free_Cb data_free_cb);
EAPI Eina_Bool eina_hash_add(Eina_Hash *hash, const void *key, const void *data);
EAPI Eina_Bool eina_hash_direct_add(Eina_Hash *hash, const void *key, const void *data);
/* Hash function first reported by dan bernstein many years ago in comp.lang.c */
static inline int eina_hash_djb2(const char *key, int len);
+/* Hash function from http://www.concentric.net/~Ttwang/tech/inthash.htm */
+static inline int eina_hash_int32(unsigned int *pkey, __UNUSED__ int len);
+static inline int eina_hash_int64(unsigned long int *pkey, __UNUSED__ int len);
+
#include "eina_inline_hash.x"
/**
return (int)hash_num;
}
+static inline int
+eina_hash_int32(unsigned int *pkey, __UNUSED__ int len)
+{
+ unsigned int key = *pkey;
+
+ key = ~key + (key << 15);
+ key = key ^ (key >> 12);
+ key = key + (key << 2);
+ key = key ^ (key >> 4);
+ key = key * 2057;
+ key = key ^ (key >> 16);
+ return key;
+}
+
+static inline int
+eina_hash_int64(unsigned long int *pkey, __UNUSED__ int len)
+{
+ unsigned long int key = *pkey;
+
+ key = (~key) + (key << 18);
+ key = key ^ (key >> 31);
+ key = key * 21;
+ key = key ^ (key >> 11);
+ key = key + (key << 6);
+ key = key ^ (key >> 22);
+ return (int) key;
+}
+
#endif
return strcmp(key1, key2);
}
+static unsigned int
+_eina_int32_key_length(__UNUSED__ const uint32_t *key)
+{
+ return 4;
+}
+
+static int
+_eina_int32_key_cmp(const uint32_t *key1, __UNUSED__ int key1_length,
+ const uint32_t *key2, __UNUSED__ int key2_length)
+{
+ if (*key1 > *key2)
+ return 1;
+ if (*key1 < *key2)
+ return -1;
+ return 0;
+}
+
+static unsigned int
+_eina_int64_key_length(__UNUSED__ const uint32_t *key)
+{
+ return 8;
+}
+
+static int
+_eina_int64_key_cmp(const uint64_t *key1, __UNUSED__ int key1_length,
+ const uint64_t *key2, __UNUSED__ int key2_length)
+{
+ if (*key1 > *key2)
+ return 1;
+ if (*key1 < *key2)
+ return -1;
+ return 0;
+}
+
+
static Eina_Bool
_eina_foreach_cb(const Eina_Hash *hash, Eina_Hash_Tuple *data, Eina_Hash_Foreach_Data *fdata)
{
data_free_cb);
}
+EAPI Eina_Hash *
+eina_hash_int32_new(Eina_Free_Cb data_free_cb)
+{
+ return eina_hash_new(EINA_KEY_LENGTH(_eina_int32_key_length),
+ EINA_KEY_CMP(_eina_int32_key_cmp),
+ EINA_KEY_HASH(eina_hash_int32),
+ data_free_cb);
+}
+
+EAPI Eina_Hash *
+eina_hash_int64_new(Eina_Free_Cb data_free_cb)
+{
+ return eina_hash_new(EINA_KEY_LENGTH(_eina_int64_key_length),
+ EINA_KEY_CMP(_eina_int64_key_cmp),
+ EINA_KEY_HASH(eina_hash_int64),
+ data_free_cb);
+}
+
+EAPI Eina_Hash *
+eina_hash_pointer_new(Eina_Free_Cb data_free_cb)
+{
+#ifdef __LP64__
+ return eina_hash_new(EINA_KEY_LENGTH(_eina_int64_key_length),
+ EINA_KEY_CMP(_eina_int64_key_cmp),
+ EINA_KEY_HASH(eina_hash_int64),
+ data_free_cb);
+#else
+ return eina_hash_new(EINA_KEY_LENGTH(_eina_int32_key_length),
+ EINA_KEY_CMP(_eina_int32_key_cmp),
+ EINA_KEY_HASH(eina_hash_int32),
+ data_free_cb);
+#endif
+}
+
/**
* Retrieves the number of buckets available in the given hash table.
* @param hash The given hash table.