src/server/ucx/map.h

Sat, 18 Aug 2012 11:39:34 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 18 Aug 2012 11:39:34 +0200
changeset 35
4417619a9bbd
parent 31
280250e45ba6
child 36
450d2d5f4735
permissions
-rw-r--r--

using non blocking IO for request input

/*
 * 
 */

#ifndef MAP_H
#define	MAP_H

#include "ucx.h"
#include "string.h"

#ifdef	__cplusplus
extern "C" {
#endif

#define UCX_MAP_FOREACH(type,elm,map,iter) \
        for(type elm;ucx_map_iter_next(&iter,(void*)&elm)==0;)

typedef struct UcxMap          UcxMap;
typedef struct UcxKey          UcxKey;
typedef struct UcxMapElement   UcxMapElement;
typedef struct UcxMapIterator  UcxMapIterator;

struct UcxMap {
    UcxMapElement **map;
    size_t        size;
};

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);

int ucx_map_put(UcxMap *map, UcxKey key, void *data);
void* ucx_map_get(UcxMap *map, UcxKey key);

#define ucx_map_sstr_put(m, s, d) ucx_map_put(m, ucx_key(s.ptr, s.length), d)
#define ucx_map_cstr_put(m, s, d) ucx_map_put(m, ucx_key(s, 1+strlen(s)), d)
#define ucx_map_sstr_get(m, s) ucx_map_get(m, ucx_key(s.ptr, s.length))
#define ucx_map_cstr_get(m, s) ucx_map_get(m, ucx_key(s, 1+strlen(s)))

UcxKey ucx_key(void *data, size_t len);

int ucx_hash(char *data, size_t len);

UcxMapIterator ucx_map_iterator(UcxMap *map);

int ucx_map_iter_next(UcxMapIterator *i, void **elm);

#ifdef	__cplusplus
}
#endif

#endif	/* MAP_H */

mercurial