Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
3f0ed6c0bf33473a397d83c6d6ccf20dbc801a30
[simgrid.git] / src / xbt / dict.c
1 /* $Id$ */
2
3 /* dict - a generic dictionnary, variation over the B-tree concept          */
4
5 /* Copyright (c) 2003,2004 Martin Quinson. All rights reserved.             */
6
7 /* This program is free software; you can redistribute it and/or modify it
8  * under the terms of the license (GNU LGPL) which comes with this package. */
9
10 #include "dict_private.h"
11
12
13 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(dict,xbt,
14    "Dictionaries provide the same functionnalities than hash tables");
15 /*####[ Private prototypes ]#################################################*/
16
17 /*####[ Code ]###############################################################*/
18
19 /**
20  * @brief Constructor
21  * @return pointer to the destination
22  *
23  * Creates and initialize a new dictionnary
24  */
25 xbt_dict_t 
26 xbt_dict_new(void) {
27   xbt_dict_t res= xbt_new(s_xbt_dict_t,1);
28   res->head=NULL;
29   return res;
30 }
31 /**
32  * @brief Destructor
33  * @param dict the dictionnary to be freed
34  *
35  * Frees a cache structure with all its childs.
36  */
37 void
38 xbt_dict_free(xbt_dict_t *dict)  {
39   if (dict && *dict) {
40     if ((*dict)->head) {
41       xbt_dictelm_free( &( (*dict)->head ) );
42       (*dict)->head = NULL;
43     }
44     free(*dict);
45     *dict=NULL;
46   }
47 }
48
49 /**
50  * \brief Add data to the dict (arbitrary key)
51  * \param dict the container
52  * \param key the key to set the new data
53  * \param key_len the size of the \a key
54  * \param data the data to add in the dict
55  * \param free_ctn function to call with (\a key as argument) when 
56  *        \a key is removed from the dictionnary
57  *
58  * set the \a data in the structure under the \a key, which can be any kind 
59  * of data, as long as its length is provided in \a key_len.
60  */
61 void
62 xbt_dict_set_ext(xbt_dict_t      dict,
63                   const char      *key,
64                   int              key_len,
65                   void            *data,
66                   void_f_pvoid_t  *free_ctn) {
67
68   xbt_assert(dict);
69
70   xbt_dictelm_set_ext(&(dict->head),
71                        key, key_len, data, free_ctn);
72 }
73
74 /**
75  * \brief Add data to the dict (null-terminated key)
76  *
77  * \param dict the head of the dict
78  * \param key the key to set the new data
79  * \param data the data to add in the dict
80  * \param free_ctn function to call with (\a key as argument) when 
81  *        \a key is removed from the dictionnary
82  *
83  * set the \a data in the structure under the \a key, which is a 
84  * null terminated string.
85  */
86 void
87 xbt_dict_set(xbt_dict_t     dict,
88               const char     *key,
89               void           *data,
90               void_f_pvoid_t *free_ctn) {
91
92   xbt_assert(dict);
93   
94   xbt_dictelm_set(&(dict->head), key, data, free_ctn);
95 }
96
97 /**
98  * \brief Retrieve data from the dict (arbitrary key)
99  *
100  * \param dict the dealer of data
101  * \param key the key to find data
102  * \param key_len the size of the \a key
103  * \param data the data that we are looking for
104  * \return xbt_error
105  *
106  * Search the given \a key. mismatch_error when not found.
107  */
108 xbt_error_t
109 xbt_dict_get_ext(xbt_dict_t     dict,
110                   const char     *key,
111                   int             key_len,
112                   /* OUT */void **data) {
113
114   xbt_assert(dict);
115
116   return xbt_dictelm_get_ext(dict->head, key, key_len, data);
117 }
118
119 /**
120  * \brief Retrieve data from the dict (null-terminated key) 
121  *
122  * \param dict the dealer of data
123  * \param key the key to find data
124  * \param data the data that we are looking for
125  * \return xbt_error
126  *
127  * Search the given \a key. mismatch_error when not found.
128  */
129 xbt_error_t
130 xbt_dict_get(xbt_dict_t     dict,
131               const char     *key,
132               /* OUT */void **data) {
133   xbt_assert(dict);
134
135   return xbt_dictelm_get(dict->head, key, data);
136 }
137
138
139 /**
140  * \brief Remove data from the dict (arbitrary key)
141  *
142  * \param dict the trash can
143  * \param key the key of the data to be removed
144  * \param key_len the size of the \a key
145  * \return xbt_error_t
146  *
147  * Remove the entry associated with the given \a key
148  */
149 xbt_error_t
150 xbt_dict_remove_ext(xbt_dict_t  dict,
151                      const char  *key,
152                      int          key_len) {
153   xbt_assert(dict);
154   
155   return xbt_dictelm_remove_ext(dict->head, key, key_len);
156 }
157
158 /**
159  * \brief Remove data from the dict (null-terminated key)
160  *
161  * \param dict the head of the dict
162  * \param key the key of the data to be removed
163  *
164  * Remove the entry associated with the given \a key
165  */
166 xbt_error_t
167 xbt_dict_remove(xbt_dict_t  dict,
168                  const char  *key) {
169   if (!dict) 
170      RAISE1(mismatch_error,"Asked to remove key %s from NULL dict",key);
171
172   return xbt_dictelm_remove(dict->head, key);
173 }
174
175
176 /**
177  * \brief Outputs the content of the structure (debuging purpose) 
178  *
179  * \param dict the exibitionist
180  * \param output a function to dump each data in the tree
181  *
182  * Ouputs the content of the structure. (for debuging purpose). \a ouput is a
183  * function to output the data. If NULL, data won't be displayed, just the tree structure.
184  */
185
186 void
187 xbt_dict_dump(xbt_dict_t     dict,
188                void_f_pvoid_t *output) {
189
190   printf("Dict %p:\n", (void*)dict);
191   xbt_dictelm_dump(dict ? dict->head: NULL, output);
192 }