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