1 /********************************************************************** 2 linkedlist.h 3 ********************************************************************** 4 5 linkedlist - Linked list implementation. 6 Copyright ©2000-2003, Stewart Adcock <stewart@linux-domain.com> 7 All rights reserved. 8 9 The latest version of this program should be available at: 10 http://www.stewart-adcock.co.uk/ 11 12 This program is free software; you can redistribute it and/or modify 13 it under the terms of the GNU General Public License as published by 14 the Free Software Foundation; either version 2 of the License, or 15 (at your option) any later version. Alternatively, if your project 16 is incompatible with the GPL, I will probably agree to requests 17 for permission to use the terms of any other license. 18 19 This program is distributed in the hope that it will be useful, but 20 WITHOUT ANY WARRANTY WHATSOEVER. 21 22 A full copy of the GNU General Public License should be in the file 23 "COPYING" provided with this distribution; if not, see: 24 http://www.gnu.org/ 25 26 ********************************************************************** 27 28 Synopsis: Header file for linked list implementation. 29 30 **********************************************************************/ 31 32 #ifndef LINKEDLIST_H_INCLUDED 33 #define LINKEDLIST_H_INCLUDED 34 35 #include "gaul/gaul_util.h" 36 37 #include "gaul/memory_util.h" 38 39 /* 40 * Type definitions. 41 */ 42 43 typedef int (*LLCompareFunc)(constvpointer data1, constvpointer data2); 44 typedef boolean (*LLForeachFunc)(vpointer data, vpointer userdata); 45 typedef void (*LLDestructorFunc)(vpointer data); 46 47 typedef struct DLList_t 48 { 49 struct DLList_t *next; /* Next element. */ 50 struct DLList_t *prev; /* Prev element. */ 51 vpointer data; /* Data stored in this element. */ 52 } DLList; 53 54 typedef struct SLList_t 55 { 56 struct SLList_t *next; /* Next element. */ 57 vpointer data; /* Data stored in this element. */ 58 } SLList; 59 60 61 /* 62 * Function prototypes. 63 */ 64 65 FUNCPROTO void linkedlist_init_openmp(void); 66 FUNCPROTO SLList *slink_new(void); 67 FUNCPROTO void slink_free_all(SLList *list); 68 FUNCPROTO void slink_free(SLList *list); 69 FUNCPROTO SLList *slink_append(SLList *list, vpointer data); 70 FUNCPROTO SLList *slink_prepend(SLList *list, vpointer data); 71 FUNCPROTO SLList *slink_insert_next(SLList *list, vpointer data); 72 FUNCPROTO SLList *slink_insert_index(SLList *list, vpointer data, int index); 73 FUNCPROTO SLList *slink_delete_data(SLList *list, vpointer data); 74 FUNCPROTO SLList *slink_delete_all_data(SLList *list, vpointer data); 75 FUNCPROTO SLList *slink_delete_link(SLList *list, SLList *link); 76 FUNCPROTO SLList *slink_clone(SLList *list); 77 FUNCPROTO SLList *slink_reverse(SLList *list); 78 FUNCPROTO SLList *slink_nth(SLList *list, const int index); 79 FUNCPROTO vpointer slink_nth_data(SLList *list, const int index); 80 FUNCPROTO SLList *slink_find(SLList *list, vpointer data); 81 FUNCPROTO SLList *slink_find_custom(SLList *list, vpointer data, LLCompareFunc func); 82 FUNCPROTO int slink_index_link(SLList *list, SLList *link); 83 FUNCPROTO int slink_index_data(SLList *list, vpointer data); 84 FUNCPROTO SLList *slink_last(SLList *list); 85 FUNCPROTO int slink_size(SLList *list); 86 FUNCPROTO boolean slink_foreach(SLList *list, LLForeachFunc func, vpointer userdata); 87 FUNCPROTO SLList *slink_sort_merge (SLList *l1, 88 SLList *l2, 89 LLCompareFunc compare_func); 90 FUNCPROTO SLList *slink_sort(SLList *list, 91 LLCompareFunc compare_func); 92 FUNCPROTO DLList *dlink_new(void); 93 FUNCPROTO void dlink_free_all(DLList *list); 94 FUNCPROTO void dlink_free(DLList *list); 95 FUNCPROTO DLList *dlink_append(DLList *list, vpointer data); 96 FUNCPROTO DLList *dlink_prepend(DLList *list, vpointer data); 97 FUNCPROTO DLList *dlink_insert_next(DLList *list, vpointer data); 98 FUNCPROTO DLList *dlink_insert_prev(DLList *list, vpointer data); 99 FUNCPROTO DLList *dlink_insert_index(DLList *list, 100 vpointer data, 101 int index); 102 FUNCPROTO DLList *dlink_delete_all_data(DLList *list, vpointer data); 103 FUNCPROTO DLList *dlink_delete_data(DLList *list, vpointer data); 104 FUNCPROTO DLList *dlink_delete_link(DLList *list, DLList *link); 105 FUNCPROTO DLList *dlink_clone(DLList *list); 106 FUNCPROTO DLList *dlink_reverse(DLList *list); 107 FUNCPROTO DLList *dlink_nth(DLList *list, const int index); 108 FUNCPROTO DLList *dlink_pth(DLList *list, const int index); 109 FUNCPROTO vpointer dlink_nth_data(DLList *list, const int index); 110 FUNCPROTO vpointer dlink_pth_data(DLList *list, const int index); 111 FUNCPROTO DLList *dlink_find(DLList *list, vpointer data); 112 FUNCPROTO DLList *dlink_find_custom(DLList *list, vpointer data, LLCompareFunc func); 113 FUNCPROTO int dlink_index_link(DLList *list, DLList *link); 114 FUNCPROTO int dlink_index_data(DLList *list, vpointer data); 115 FUNCPROTO DLList *dlink_last(DLList *list); 116 FUNCPROTO DLList *dlink_first(DLList *list); 117 FUNCPROTO int dlink_size(DLList *list); 118 FUNCPROTO boolean dlink_foreach(DLList *list, LLForeachFunc func, vpointer userdata); 119 FUNCPROTO boolean dlink_foreach_reverse(DLList *list, 120 LLForeachFunc func, vpointer userdata); 121 FUNCPROTO DLList *dlink_sort_merge(DLList *l1, 122 DLList *l2, 123 LLCompareFunc compare_func); 124 FUNCPROTO DLList *dlink_sort(DLList *list, 125 LLCompareFunc compare_func); 126 FUNCPROTO void linkedlist_diagnostics(void); 127 #ifndef LINKEDLIST_COMPILE_MAIN 128 FUNCPROTO boolean linkedlist_test(void); 129 #endif 130 131 #define slink_insert_prev(X,Y) slink_prepend((X), (Y)); 132 #define slink_next(X) ((X)?(((SLList *)(X))->next):NULL) 133 #define dlink_next(X) ((X)?(((DLList *)(X))->next):NULL) 134 #define dlink_prev(X) ((X)?(((DLList *)(X))->prev):NULL) 135 136 #define slink_data(X) ((X)?(((SLList *)(X))->data):NULL) 137 #define dlink_data(X) ((X)?(((DLList *)(X))->data):NULL) 138 139 /* 140 * glib list emulation stuff. 141 * 142 * These macro redirections will be used if LINKEDLIST_EMULATE_GLIST is defined. 143 */ 144 #ifdef LINKEDLIST_EMULATE_GLIST 145 146 #define GSList SLList 147 #define GList DLList 148 149 #define g_list_append(X, Y) dlink_append((X), (Y)) 150 #define g_list_reverse(X) dlink_reverse((X)) 151 #define g_list_nth(X, Y) dlink_nth((X), (Y)) 152 #define g_list_nth_data(X, Y) dlink_nth_data((X), (Y)) 153 #define g_list_position(X, Y) dlink_index_link((X), (Y)) 154 #define g_list_free(X) dlink_free_all((X)) 155 #define g_list_insert_sorted(X, Y, Z) dlink_insert_sorted((X), (Y), (Z)) 156 #define g_list_foreach(X, Y, Z) dlink_foreach((X), (Y), (Z)) 157 #define g_list_prepend(X, Y) dlink_prepend((X), (Y)) 158 #define g_list_sort(X, Y) dlink_sort((X), (Y)) 159 #define g_list_length(X) dlink_size((X)) 160 #define g_list_next(X) ((X)?(((DLList *)(X))->next):NULL) 161 #define g_list_prev(X) ((X)?(((DLList *)(X))->prev):NULL) 162 163 #define g_slist_append(X, Y) slink_append((X), (Y)) 164 #define g_slist_reverse(X) slink_reverse((X)) 165 #define g_slist_nth(X, Y) slink_nth((X), (Y)) 166 #define g_slist_nth_data(X, Y) slink_nth_data((X), (Y)) 167 #define g_slist_position(X, Y) slink_index_link((X), (Y)) 168 #define g_slist_free(X) slink_free_all((X)) 169 #define g_slist_insert_sorted(X, Y, Z) slink_insert_sorted((X), (Y), (Z)) 170 #define g_slist_foreach(X, Y, Z) slink_foreach((X), (Y), (Z)) 171 #define g_slist_prepend(X, Y) slink_prepend((X), (Y)) 172 #define g_slist_sort(X, Y) slink_sort((X), (Y)) 173 #define g_slist_length(X) slink_size((X)) 174 #define g_slist_next(X) ((X)?(((SLList *)(X))->next):NULL) 175 176 #endif 177 178 #endif /* LINKEDLIST_H_INCLUDED */ 179 180