ucx/map.h

Wed, 06 Feb 2013 12:55:56 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 06 Feb 2013 12:55:56 +0100
changeset 78
af355652f271
parent 71
303dabadff1c
child 79
cf3757c60c8f
permissions
-rw-r--r--

some fixes

     1 /*
     2  * 
     3  */
     5 #ifndef MAP_H
     6 #define	MAP_H
     8 #include "ucx.h"
     9 #include "string.h"
    10 #include "mempool.h"
    11 #include <stdio.h>
    13 #ifdef	__cplusplus
    14 extern "C" {
    15 #endif
    17 #define UCX_MAP_FOREACH(elm,iter) \
    18         for(;ucx_map_iter_next(&iter,(void**)&elm)==0;)
    20 typedef struct UcxMap          UcxMap;
    21 typedef struct UcxKey          UcxKey;
    22 typedef struct UcxMapElement   UcxMapElement;
    23 typedef struct UcxMapIterator  UcxMapIterator;
    25 /*
    26  * param 1: element
    27  * param 2: additional data
    28  * param 3: size of encoded data will be stored here
    29  * returns encoded / decoded string or NULL on failure
    30  */
    31 typedef void*(*ucx_map_coder)(void*,void*,size_t*);
    33 struct UcxMap {
    34     UcxMapElement **map;
    35     size_t        size;
    36     size_t        count;
    37 };
    39 struct UcxKey {
    40     void   *data;
    41     size_t len;
    42     int    hash;
    43 };
    45 struct UcxMapElement {
    46     void          *data;
    47     UcxMapElement *next;
    48     UcxKey        key;
    49 };
    51 struct UcxMapIterator {
    52     UcxMap        *map;
    53     UcxMapElement *cur;
    54     int           index;
    55 };
    58 UcxMap *ucx_map_new(size_t size);
    59 void ucx_map_free(UcxMap *map);
    60 /* you cannot clone maps with more than 390 mio entries */
    61 int ucx_map_copy(UcxMap *restrict from, UcxMap *restrict to,
    62         copy_func fnc, void *data);
    63 UcxMap *ucx_map_clone(UcxMap *map, copy_func fnc, void *data);
    64 int ucx_map_rehash(UcxMap *map);
    66 int ucx_map_put(UcxMap *map, UcxKey key, void *data);
    67 void* ucx_map_get(UcxMap *map, UcxKey key);
    68 void* ucx_map_remove(UcxMap *map, UcxKey key);
    70 #define ucx_map_sstr_put(m, s, d) \
    71     ucx_map_put(m, ucx_key(s.ptr, s.length), d)
    72 #define ucx_map_cstr_put(m, s, d) \
    73     ucx_map_put(m, ucx_key((void*)s, strlen(s)), d)
    74 #define ucx_map_int_put(m, i, d) \
    75     ucx_map_put(m, ucx_key((void*)&i, sizeof(d)), d)
    77 #define ucx_map_sstr_get(m, s) \
    78     ucx_map_get(m, ucx_key(s.ptr, s.length))
    79 #define ucx_map_cstr_get(m, s) \
    80     ucx_map_get(m, ucx_key((void*)s, strlen(s)))
    81 #define ucx_map_int_get(m, i) \
    82     ucx_map_get(m, ucx_key((void*)&i, sizeof(int)))
    84 #define ucx_map_sstr_remove(m, s) \
    85     ucx_map_remove(m, ucx_key(s.ptr, s.length))
    86 #define ucx_map_cstr_remove(m, s) \
    87     ucx_map_remove(m, ucx_key((void*)s, strlen(s)))
    88 #define ucx_map_int_remove(m, i) \
    89     ucx_map_remove(m, ucx_key((void*)&i, sizeof(int)))
    91 UcxKey ucx_key(void *data, size_t len);
    93 int ucx_hash(const char *data, size_t len);
    95 UcxMapIterator ucx_map_iterator(UcxMap *map);
    97 int ucx_map_iter_next(UcxMapIterator *i, void **elm);
    99 /* use macros for string maps only, values are not encoded */
   100 #define ucx_map_load(map, f, alloc) ucx_map_load_enc(map, f, alloc, NULL, NULL)
   101 #define ucx_map_store(map, f) ucx_map_store_enc(map, f, NULL, NULL)
   103 int ucx_map_load_enc(UcxMap *map, FILE *f, UcxAllocator allocator,
   104         ucx_map_coder decoder, void* decdata);
   105 /* encoders shall provide null terminated strings*/
   106 int ucx_map_store_enc(UcxMap *map, FILE *f,
   107         ucx_map_coder encoder, void* encdata);
   109 #ifdef	__cplusplus
   110 }
   111 #endif
   113 #endif	/* MAP_H */

mercurial