src/map.c

Wed, 21 Feb 2024 18:32:38 +0100

author
Mike Becker <universe@uap-core.de>
date
Wed, 21 Feb 2024 18:32:38 +0100
changeset 838
1ce90ab4fab9
parent 709
1e8ba59e7911
child 853
d4baf4dd55c3
permissions
-rw-r--r--

add visit_on_exit to iterator implementation

relates to #371

/*
 * 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(__attribute__((__unused__)) CxMap *map) {
    // this is a noop, but MUST be implemented
}

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

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

static CxIterator cx_empty_map_iterator(
        struct cx_map_s const *map,
        __attribute__((__unused__)) enum cx_map_iterator_type type
) {
    CxIterator iter = {0};
    iter.src_handle = 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>

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

    // we know the iterators share the same memory layout
    CxMutIterator iter;
    memcpy(&iter, &it, sizeof(CxMutIterator));
    return iter;
}

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

    // we know the iterators share the same memory layout
    CxMutIterator iter;
    memcpy(&iter, &it, sizeof(CxMutIterator));
    return iter;
}

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

    // we know the iterators share the same memory layout
    CxMutIterator iter;
    memcpy(&iter, &it, sizeof(CxMutIterator));
    return iter;
}

mercurial