From 2c9169308b13cce200bdc4a5bec2ff553dc7a9b3 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Sun, 15 Apr 2018 10:53:55 +0200 Subject: [PATCH] Add code generation for OA dict --- tests/Makefile | 2 ++ tests/tgen-mdict.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 tests/tgen-mdict.c diff --git a/tests/Makefile b/tests/Makefile index 91726c3a..30f180f8 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -79,6 +79,8 @@ gene-shared: gene-bitset: $(CC) $(CFLAGS) $(CPPFLAGS) -O3 -DNDEBUG -S tgen-bitset.c && less tgen-bitset.s +gene-dict: + $(CC) $(CFLAGS) $(CPPFLAGS) -O3 -DNDEBUG -S tgen-mdict.c && less tgen-mdict.s ##################################################################################################### # Coverage diff --git a/tests/tgen-mdict.c b/tests/tgen-mdict.c new file mode 100644 index 00000000..beceb360 --- /dev/null +++ b/tests/tgen-mdict.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2017-2018, Patrick Pelissier + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + 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 REGENTS 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 REGENTS AND 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. +*/ +#include +#include "m-dict.h" + +static inline bool my_oor_equal_p(uint64_t k, unsigned char n) +{ + return k == ~(uint64_t) n; +} +static inline void my_oor_set(uint64_t *k, unsigned char n) +{ + *k = ~(uint64_t)n; +} +DICT_OA_DEF2(dict, + uint64_t, M_OPEXTEND(M_DEFAULT_OPLIST, OOR_EQUAL(my_oor_equal_p), OOR_SET(my_oor_set M_IPTR)), + uint32_t, M_DEFAULT_OPLIST) + +extern void set_at(dict_t d, uint64_t key, uint32_t value); +void set_at(dict_t d, uint64_t key, uint32_t value) +{ + dict_set_at(d, key, value); +} + +extern uint32_t get(dict_t d, uint64_t key); +uint32_t get(dict_t d, uint64_t key) +{ + uint32_t *p = dict_get(d, key); + return p == NULL ? 0: *p; +} + +extern void increment(dict_t d, uint64_t key); +void increment(dict_t d, uint64_t key) +{ + uint32_t *p = dict_get(d, key); + if (p != NULL) { + (*p) ++; + } else { + dict_set_at(d, key, 1); + } +} + +extern void clean(dict_t d); +void clean(dict_t d) +{ + dict_clean(d); +}