1273929Sjmmv/* Copyright (c) 2008 The NetBSD Foundation, Inc. 2240116Smarcel * All rights reserved. 3240116Smarcel * 4240116Smarcel * Redistribution and use in source and binary forms, with or without 5240116Smarcel * modification, are permitted provided that the following conditions 6240116Smarcel * are met: 7240116Smarcel * 1. Redistributions of source code must retain the above copyright 8240116Smarcel * notice, this list of conditions and the following disclaimer. 9240116Smarcel * 2. Redistributions in binary form must reproduce the above copyright 10240116Smarcel * notice, this list of conditions and the following disclaimer in the 11240116Smarcel * documentation and/or other materials provided with the distribution. 12240116Smarcel * 13240116Smarcel * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 14240116Smarcel * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 15240116Smarcel * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 16240116Smarcel * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17240116Smarcel * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 18240116Smarcel * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19240116Smarcel * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 20240116Smarcel * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21240116Smarcel * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 22240116Smarcel * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23240116Smarcel * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 24273929Sjmmv * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 25240116Smarcel 26273929Sjmmv#if !defined(ATF_C_DETAIL_MAP_H) 27273929Sjmmv#define ATF_C_DETAIL_MAP_H 28240116Smarcel 29240116Smarcel#include <stdarg.h> 30240116Smarcel#include <stdbool.h> 31240116Smarcel 32273929Sjmmv#include <atf-c/detail/list.h> 33240116Smarcel#include <atf-c/error_fwd.h> 34240116Smarcel 35240116Smarcel/* --------------------------------------------------------------------- 36240116Smarcel * The "atf_map_citer" type. 37240116Smarcel * --------------------------------------------------------------------- */ 38240116Smarcel 39240116Smarcelstruct atf_map_citer { 40240116Smarcel const struct atf_map *m_map; 41240116Smarcel const void *m_entry; 42240116Smarcel atf_list_citer_t m_listiter; 43240116Smarcel}; 44240116Smarceltypedef struct atf_map_citer atf_map_citer_t; 45240116Smarcel 46240116Smarcel/* Getters. */ 47240116Smarcelconst char *atf_map_citer_key(const atf_map_citer_t); 48240116Smarcelconst void *atf_map_citer_data(const atf_map_citer_t); 49240116Smarcelatf_map_citer_t atf_map_citer_next(const atf_map_citer_t); 50240116Smarcel 51240116Smarcel/* Operators. */ 52240116Smarcelbool atf_equal_map_citer_map_citer(const atf_map_citer_t, 53240116Smarcel const atf_map_citer_t); 54240116Smarcel 55240116Smarcel/* --------------------------------------------------------------------- 56240116Smarcel * The "atf_map_iter" type. 57240116Smarcel * --------------------------------------------------------------------- */ 58240116Smarcel 59240116Smarcelstruct atf_map_iter { 60240116Smarcel struct atf_map *m_map; 61240116Smarcel void *m_entry; 62240116Smarcel atf_list_iter_t m_listiter; 63240116Smarcel}; 64240116Smarceltypedef struct atf_map_iter atf_map_iter_t; 65240116Smarcel 66240116Smarcel/* Getters. */ 67240116Smarcelconst char *atf_map_iter_key(const atf_map_iter_t); 68240116Smarcelvoid *atf_map_iter_data(const atf_map_iter_t); 69240116Smarcelatf_map_iter_t atf_map_iter_next(const atf_map_iter_t); 70240116Smarcel 71240116Smarcel/* Operators. */ 72240116Smarcelbool atf_equal_map_iter_map_iter(const atf_map_iter_t, 73240116Smarcel const atf_map_iter_t); 74240116Smarcel 75240116Smarcel/* --------------------------------------------------------------------- 76240116Smarcel * The "atf_map" type. 77240116Smarcel * --------------------------------------------------------------------- */ 78240116Smarcel 79240116Smarcel/* A list-based map. Typically very inefficient, but our maps are small 80240116Smarcel * enough. */ 81240116Smarcelstruct atf_map { 82240116Smarcel atf_list_t m_list; 83240116Smarcel}; 84240116Smarceltypedef struct atf_map atf_map_t; 85240116Smarcel 86240116Smarcel/* Constructors and destructors */ 87240116Smarcelatf_error_t atf_map_init(atf_map_t *); 88240116Smarcelatf_error_t atf_map_init_charpp(atf_map_t *, const char *const *); 89240116Smarcelvoid atf_map_fini(atf_map_t *); 90240116Smarcel 91240116Smarcel/* Getters. */ 92240116Smarcelatf_map_iter_t atf_map_begin(atf_map_t *); 93240116Smarcelatf_map_citer_t atf_map_begin_c(const atf_map_t *); 94240116Smarcelatf_map_iter_t atf_map_end(atf_map_t *); 95240116Smarcelatf_map_citer_t atf_map_end_c(const atf_map_t *); 96240116Smarcelatf_map_iter_t atf_map_find(atf_map_t *, const char *); 97240116Smarcelatf_map_citer_t atf_map_find_c(const atf_map_t *, const char *); 98240116Smarcelsize_t atf_map_size(const atf_map_t *); 99240116Smarcelchar **atf_map_to_charpp(const atf_map_t *); 100240116Smarcel 101240116Smarcel/* Modifiers. */ 102240116Smarcelatf_error_t atf_map_insert(atf_map_t *, const char *, void *, bool); 103240116Smarcel 104240116Smarcel/* Macros. */ 105240116Smarcel#define atf_map_for_each(iter, map) \ 106240116Smarcel for (iter = atf_map_begin(map); \ 107240116Smarcel !atf_equal_map_iter_map_iter((iter), atf_map_end(map)); \ 108240116Smarcel iter = atf_map_iter_next(iter)) 109240116Smarcel#define atf_map_for_each_c(iter, map) \ 110240116Smarcel for (iter = atf_map_begin_c(map); \ 111240116Smarcel !atf_equal_map_citer_map_citer((iter), atf_map_end_c(map)); \ 112240116Smarcel iter = atf_map_citer_next(iter)) 113240116Smarcel 114273929Sjmmv#endif /* !defined(ATF_C_DETAIL_MAP_H) */ 115