ucx/map.h

changeset 1
1bcaac272cdf
child 5
88625853ae74
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ucx/map.h	Fri Nov 30 21:18:13 2012 +0100
@@ -0,0 +1,106 @@
+/*
+ * 
+ */
+
+#ifndef MAP_H
+#define	MAP_H
+
+#include "ucx.h"
+#include "string.h"
+#include "mempool.h"
+#include <stdio.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#define UCX_MAP_FOREACH(elm,iter) \
+        for(;ucx_map_iter_next(&iter,(void**)&elm)==0;)
+
+typedef struct UcxMap          UcxMap;
+typedef struct UcxKey          UcxKey;
+typedef struct UcxMapElement   UcxMapElement;
+typedef struct UcxMapIterator  UcxMapIterator;
+
+/*
+ * param 1: element
+ * param 2: additional data
+ * param 3: size of encoded data will be stored here
+ * returns encoded / decoded string or NULL on failure
+ */
+typedef void*(*ucx_map_coder)(void*,void*,size_t*);
+
+struct UcxMap {
+    UcxMapElement **map;
+    size_t        size;
+    size_t        count;
+};
+
+struct UcxKey {
+    void   *data;
+    size_t len;
+    int    hash;
+};
+
+struct UcxMapElement {
+    void          *data;
+    UcxMapElement *next;
+    UcxKey        key;
+};
+
+struct UcxMapIterator {
+    UcxMap        *map;
+    UcxMapElement *cur;
+    int           index;
+};
+
+
+UcxMap *ucx_map_new(size_t size);
+void ucx_map_free(UcxMap *map);
+/* you cannot clone maps with more than 390 mio entries */
+int ucx_map_copy(UcxMap *restrict from, UcxMap *restrict to,
+        copy_func fnc, void *data);
+UcxMap *ucx_map_clone(UcxMap *map, copy_func fnc, void *data);
+int ucx_map_rehash(UcxMap *map);
+
+int ucx_map_put(UcxMap *map, UcxKey key, void *data);
+void* ucx_map_get(UcxMap *map, UcxKey key);
+void* ucx_map_remove(UcxMap *map, UcxKey key);
+
+#define ucx_map_sstr_put(m, s, d) \
+    ucx_map_put(m, ucx_key((void*)s.ptr, s.length), d)
+#define ucx_map_cstr_put(m, s, d) \
+    ucx_map_put(m, ucx_key((void*)s, 1+strlen(s)), d)
+#define ucx_map_sstr_get(m, s) \
+    ucx_map_get(m, ucx_key((void*)s.ptr, s.length))
+#define ucx_map_cstr_get(m, s) \
+    ucx_map_get(m, ucx_key((void*)s, 1+strlen(s)))
+#define ucx_map_sstr_remove(m, s) \
+    ucx_map_remove(m, ucx_key((void*)s.ptr, s.length))
+#define ucx_map_cstr_remove(m, s) \
+    ucx_map_remove(m, ucx_key((void*)s, 1+strlen(s)))
+
+UcxKey ucx_key(void *data, size_t len);
+
+int ucx_hash(const char *data, size_t len);
+
+UcxMapIterator ucx_map_iterator(UcxMap *map);
+
+int ucx_map_iter_next(UcxMapIterator *i, void **elm);
+
+/* use macros for string maps only, values are not encoded */
+#define ucx_map_load(map, f, alloc) ucx_map_load_enc(map, f, alloc, NULL, NULL)
+#define ucx_map_store(map, f) ucx_map_store_enc(map, f, NULL, NULL)
+
+int ucx_map_load_enc(UcxMap *map, FILE *f, UcxAllocator allocator,
+        ucx_map_coder decoder, void* decdata);
+/* encoders shall provide null terminated strings*/
+int ucx_map_store_enc(UcxMap *map, FILE *f,
+        ucx_map_coder encoder, void* encdata);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* MAP_H */
+

mercurial