1 #ifndef PTRMAP_H
   2 #define PTRMAP_H
   3 
   4 struct ptrmap;
   5 
   6 #define DECLARE_PTRMAP(name, ktype, vtype)                              \
   7         struct name ## _pair { ktype key; vtype val; };                 \
   8         struct name { struct name ## _pair block[1]; };                 \
   9         static inline                                                   \
  10         void name##_add(struct name **map, ktype k, vtype v) {          \
  11                 __ptrmap_add((struct ptrmap**)map, k, v);               \
  12         }                                                               \
  13         static inline                                                   \
  14         void name##_update(struct name **map, ktype k, vtype v) {       \
  15                 __ptrmap_update((struct ptrmap**)map, k, v);            \
  16         }                                                               \
  17         static inline                                                   \
  18         vtype name##_lookup(struct name *map, ktype k) {                \
  19                 vtype val = __ptrmap_lookup((struct ptrmap*)map, k);    \
  20                 return val;                                             \
  21         }                                                               \
  22 
  23 /* ptrmap.c */
  24 void __ptrmap_add(struct ptrmap **mapp, void *key, void *val);
  25 void __ptrmap_update(struct ptrmap **mapp, void *key, void *val);
  26 void *__ptrmap_lookup(struct ptrmap *map, void *key);
  27 
  28 #endif