Source to ./hash.h
/*
* Cisco router simulation platform.
* Copyright (c) 2006 Christophe Fillot ([email protected])
*
* Generic Hash Tables.
*/
#ifndef __HASH_H__
#define __HASH_H__ 1
#include <sys/types.h>
#include "utils.h"
/* Key computation function */
typedef u_int (*hash_fcompute)(void *key);
/* Comparison function for 2 keys */
typedef int (*hash_fcompare)(void *key1,void *key2);
/* User function to call when using hash_table_foreach */
typedef void (*hash_fforeach)(void *key,void *value,void *opt_arg);
/* Hash element (pair key,value) */
typedef struct hash_node hash_node_t;
struct hash_node {
void *key, *value;
hash_node_t *next;
};
/* Hash Table definition */
typedef struct hash_table hash_table_t;
struct hash_table {
int size,nnodes;
hash_node_t **nodes;
hash_fcompute hash_func;
hash_fcompare key_cmp;
};
#define hash_string_create(hash_size) \
hash_table_create(str_hash,str_equal,hash_size)
#define hash_int_create(hash_size) \
hash_table_create(int_hash,int_equal,hash_size)
#define hash_u64_create(hash_size) \
hash_table_create(u64_hash,u64_equal,hash_size)
#define hash_ptr_create(hash_size) \
hash_table_create(ptr_hash,ptr_equal,hash_size)
#define HASH_TABLE_FOREACH(i,ht,hn) \
for(i=0;i<ht->size;i++) \
for(hn=ht->nodes[i];hn;hn=hn->next)
/* Create a new hash table */
hash_table_t *hash_table_create(hash_fcompute hash_func,hash_fcompare key_cmp,
int hash_size);
/* Delete an existing Hash Table */
void hash_table_delete(hash_table_t *ht);
/* Insert a new (key,value). If key already exist in table, replace value */
int hash_table_insert(hash_table_t *ht,void *key,void *value);
/* Remove a pair (key,value) from an hash table */
void *hash_table_remove(hash_table_t *ht,void *key);
/* Hash Table Lookup */
void *hash_table_lookup(hash_table_t *ht,void *key);
/* Call the specified function for each node found in hash table */
int hash_table_foreach(hash_table_t *ht,hash_fforeach user_fn,void *opt_arg);
/* Hash Table Lookup - key direct comparison */
void *hash_table_lookup_dcmp(hash_table_t *ht,void *key);
/* Hash Functions for strings */
int str_equal(void *s1,void *s2);
u_int str_hash(void *str);
/* Hash Functions for integers */
int int_equal(void *i1,void *i2);
u_int int_hash(void *i);
/* Hash Functions for u64 */
int u64_equal(void *i1,void *i2);
u_int u64_hash(void *i);
/* Hash Function for pointers */
int ptr_equal(void *i1,void *i2);
u_int ptr_hash(void *i);
#endif