I found a header to define hashtable with the following code :
#ifndef HASH_H
#define HASH_H
#define DEFINE_HASHTABLE(name, type, key, h_list, hashfunc)\
\
struct list * hashtable;\
\
static int hashtable_init (size_t size)\
{\
    unsigned long i;\
    hashtable = (struct list*)malloc(size * sizeof (struct list_head));\
    if (!hashtable)\
        return -1;\
    for (i = 0; i < size; i++)\
        INIT_LIST_HEAD(&hashtable[i]);\
    return 0;\
}\
\
static inline void hashtable_add(type *elem)\
{\
    struct list_head *head = hashtable + hashfunc(elem->key);\
    list_add(&elem->h_list, head);\
}\
\
static inline void hashtable_del(type *elem)\
{\
    list_del(&elem->h_list);\
}\
\
static inline type * hashtable_find(unsigned long key)\
{\
    type *elem;\
    struct list_head *head = hashtable + hashfunc(key);\
\
    list_for_each_entry(elem, head, h_list){\
        if (elem->key == key) \
            return elem; \
    }\
    return NULL;\
}
#endif /* _HASH_H */
I never seen a header file such this one. What is the advantage of this way to write a header (I mean full macro)? Is it about genericity or things like that?
 
     
     
    