girara
|
00001 /* See LICENSE file for license and copyright information */ 00002 00003 #ifndef GIRARA_DATASTRUCTURES_H 00004 #define GIRARA_DATASTRUCTURES_H 00005 00006 #include <stddef.h> 00007 #include <stdbool.h> 00008 #include <sys/types.h> 00009 #include "types.h" 00010 00016 girara_list_t* girara_list_new(void); 00017 00024 girara_list_t* girara_list_new2(girara_free_function_t gfree); 00025 00032 girara_list_t* girara_sorted_list_new(girara_compare_function_t cmp); 00033 00042 girara_list_t* girara_sorted_list_new2(girara_compare_function_t cmp, 00043 girara_free_function_t gfree); 00044 00051 void girara_list_set_free_function(girara_list_t* list, 00052 girara_free_function_t gfree); 00053 00059 void girara_list_clear(girara_list_t* list); 00060 00066 void girara_list_free(girara_list_t* list); 00067 00074 void girara_list_append(girara_list_t* list, void* data); 00075 00082 void girara_list_prepend(girara_list_t* list, void* data); 00083 00090 void girara_list_remove(girara_list_t* list, void* data); 00091 00099 void* girara_list_nth(girara_list_t* list, size_t n); 00100 00108 bool girara_list_contains(girara_list_t* list, void* data); 00109 00116 size_t girara_list_size(girara_list_t* list); 00117 00125 ssize_t girara_list_position(girara_list_t* list, void* data); 00126 00133 void girara_list_sort(girara_list_t* list, girara_compare_function_t compare); 00134 00143 void* girara_list_find(girara_list_t* list, girara_compare_function_t compare, 00144 const void* data); 00145 00152 girara_list_iterator_t* girara_list_iterator(girara_list_t* list); 00153 00160 girara_list_iterator_t* girara_list_iterator_next(girara_list_iterator_t* iter); 00161 00168 bool girara_list_iterator_has_next(girara_list_iterator_t* iter); 00169 00176 bool girara_list_iterator_is_valid(girara_list_iterator_t* iter); 00177 00184 void* girara_list_iterator_data(girara_list_iterator_t* iter); 00185 00192 void girara_list_iterator_set(girara_list_iterator_t* iter, void *data); 00193 00199 void girara_list_iterator_free(girara_list_iterator_t* iter); 00200 00208 void girara_list_foreach(girara_list_t* list, girara_list_callback_t callback, 00209 void* data); 00210 00211 #define GIRARA_LIST_FOREACH(list, type, iter, data) \ 00212 do { \ 00213 girara_list_iterator_t* iter = girara_list_iterator(list); \ 00214 while (girara_list_iterator_is_valid(iter)) { \ 00215 type data = girara_list_iterator_data(iter); 00216 00217 #define GIRARA_LIST_FOREACH_END(list, type, iter, data) \ 00218 girara_list_iterator_next(iter); \ 00219 } \ 00220 girara_list_iterator_free(iter); \ 00221 } while(0) 00222 00231 girara_list_t* girara_list_merge(girara_list_t* list, girara_list_t* other); 00232 00239 girara_tree_node_t* girara_node_new(void* data); 00240 00247 void girara_node_set_free_function(girara_tree_node_t* node, 00248 girara_free_function_t gfree); 00249 00256 void girara_node_free(girara_tree_node_t* node); 00257 00264 void girara_node_append(girara_tree_node_t* parent, girara_tree_node_t* child); 00265 00273 girara_tree_node_t* girara_node_append_data(girara_tree_node_t* parent, 00274 void* data); 00275 00282 girara_tree_node_t* girara_node_get_parent(girara_tree_node_t* node); 00283 00290 girara_tree_node_t* girara_node_get_root(girara_tree_node_t* node); 00291 00298 girara_list_t* girara_node_get_children(girara_tree_node_t* node); 00299 00306 size_t girara_node_get_num_children(girara_tree_node_t* node); 00307 00314 void* girara_node_get_data(girara_tree_node_t* node); 00315 00322 void girara_node_set_data(girara_tree_node_t* node, void* data); 00323 00324 #endif