00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00039 #ifndef __NUSMV_CORE_UTILS_OAHASH_H__
00040 #define __NUSMV_CORE_UTILS_OAHASH_H__
00041
00042
00043 #include "nusmv/core/utils/utils.h"
00044
00051 typedef struct OAHash_TAG* OAHash_ptr;
00052
00058 typedef size_t OAHashIter;
00059
00065 typedef boolean (*OA_HASH_EQ_FUN)(const void*, const void*, void*);
00066
00067 typedef size_t (*OA_HASH_HASH_FUN)(const void*, void*);
00068
00074 typedef void (*OA_HASH_FREE_FUN)(void* key, void* value, void* arg);
00075
00082 #define OA_HASH(self) \
00083 ((OAHash_ptr) self)
00084
00090 #define OA_HASH_CHECK_INSTANCE(self) \
00091 (nusmv_assert(OA_HASH(self) != OA_HASH(NULL)))
00092
00098 #define OA_HASH_FOREACH(self, iter) \
00099 for (iter = OAHash_get_first_iter(self); \
00100 !OAHash_iter_is_end(self, iter); \
00101 iter = OAHash_iter_next(self, iter))
00102
00108 #define OA_HASH_FOREACH_ENTRY(self, iter, key, value) \
00109 for (iter = OAHash_get_first_iter(self); \
00110 !OAHash_iter_is_end(self, iter) && \
00111 (OAHash_iter_values(self, iter, (void**)key, (void**)value), true); \
00112 iter = OAHash_iter_next(self, iter))
00113
00114
00115
00118
00119
00120
00121
00136 OAHash_ptr OAHash_create(OA_HASH_EQ_FUN key_eq_fun,
00137 OA_HASH_HASH_FUN key_hash_fun,
00138 OA_HASH_FREE_FUN free_entry_fun,
00139 void* custom_arg);
00140
00149 OAHash_ptr OAHash_copy(const OAHash_ptr self);
00150
00159 void OAHash_destroy(OAHash_ptr self);
00160
00170 boolean OAHash_insert(OAHash_ptr self,
00171 const void* key,
00172 const void* value);
00173
00185 void* OAHash_lookup(OAHash_ptr self,
00186 const void* key);
00187
00194 boolean OAHash_has_key(OAHash_ptr self,
00195 const void* key);
00196
00206 boolean OAHash_remove(OAHash_ptr self,
00207 const void* key);
00208
00215 void OAHash_clear(OAHash_ptr self);
00216
00223 size_t OAHash_get_size(OAHash_ptr self);
00224
00231 OAHashIter OAHash_get_first_iter(const OAHash_ptr self);
00232
00239 OAHashIter OAHash_iter_next(const OAHash_ptr self, const OAHashIter iter);
00240
00248 boolean OAHash_iter_is_end(const OAHash_ptr self, const OAHashIter iter);
00249
00259 void OAHash_iter_values(const OAHash_ptr self, const OAHashIter iter,
00260 void** key, void** value);
00261
00262
00263
00264
00265
00266
00267
00275 boolean OAHash_pointer_eq_fun(const void* k1, const void* k2, void* arg);
00276
00284 size_t OAHash_pointer_hash_fun(const void* key, void* arg);
00285
00293 boolean OAHash_string_eq_fun(const void* k1, const void* k2, void* arg);
00294
00302 size_t OAHash_string_hash_fun(const void* key, void* arg);
00303
00304
00305
00310 #endif