src/server/ucx/map.h

Sun, 30 Jun 2013 15:11:48 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 30 Jun 2013 15:11:48 +0200
changeset 82
740cfd9dd443
parent 67
50505dc3f8a6
child 88
73b3485e96f1
permissions
-rw-r--r--

added some nsapi stuff

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2013 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#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;
    size_t        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(s.ptr, s.length), d)
#define ucx_map_cstr_put(m, s, d) \
    ucx_map_put(m, ucx_key((void*)s, strlen(s)), d)
#define ucx_map_int_put(m, i, d) \
    ucx_map_put(m, ucx_key((void*)&i, sizeof(i)), 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((void*)s, strlen(s)))
#define ucx_map_int_get(m, i) \
    ucx_map_get(m, ucx_key((void*)&i, sizeof(int)))

#define ucx_map_sstr_remove(m, s) \
    ucx_map_remove(m, ucx_key(s.ptr, s.length))
#define ucx_map_cstr_remove(m, s) \
    ucx_map_remove(m, ucx_key((void*)s, strlen(s)))
#define ucx_map_int_remove(m, i) \
    ucx_map_remove(m, ucx_key((void*)&i, sizeof(i)))

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