src/map.c

Mon, 18 Nov 2024 22:05:42 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 18 Nov 2024 22:05:42 +0100
changeset 988
15b3ca7ee33f
parent 985
68754c7de906
permissions
-rw-r--r--

make ucx C++ compatible again (and add tests for it) - fixes #486

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2023 Mike Becker, 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.
 */

#include "cx/map.h"
#include <string.h>

// <editor-fold desc="empty map implementation">

static void cx_empty_map_noop(cx_attr_unused CxMap *map) {
    // this is a noop, but MUST be implemented
}

static void *cx_empty_map_get(
        cx_attr_unused const CxMap *map,
        cx_attr_unused CxHashKey key
) {
    return NULL;
}

static bool cx_empty_map_iter_valid(cx_attr_unused const void *iter) {
    return false;
}

static CxIterator cx_empty_map_iterator(
        const struct cx_map_s *map,
        cx_attr_unused enum cx_map_iterator_type type
) {
    CxIterator iter = {0};
    iter.src_handle.c = map;
    iter.base.valid = cx_empty_map_iter_valid;
    return iter;
}

static struct cx_map_class_s cx_empty_map_class = {
        cx_empty_map_noop,
        cx_empty_map_noop,
        NULL,
        cx_empty_map_get,
        NULL,
        cx_empty_map_iterator
};

CxMap cx_empty_map = {
        {
                NULL,
                NULL,
                0,
                0,
                NULL,
                NULL,
                NULL,
                false
        },
        &cx_empty_map_class
};

CxMap *const cxEmptyMap = &cx_empty_map;

// </editor-fold>

CxIterator cxMapMutIteratorValues(CxMap *map) {
    CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_VALUES);
    it.base.mutating = true;
    return it;
}

CxIterator cxMapMutIteratorKeys(CxMap *map) {
    CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_KEYS);
    it.base.mutating = true;
    return it;
}

CxIterator cxMapMutIterator(CxMap *map) {
    CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_PAIRS);
    it.base.mutating = true;
    return it;
}

mercurial