00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef CUCON_LIST_H
00019 #define CUCON_LIST_H
00020
00021 #include <cu/clos.h>
00022 #include <cu/util.h>
00023 #include <cucon/fwd.h>
00024 #include <stddef.h>
00025
00026 CU_BEGIN_DECLARATIONS
00027
00028
00029
00030 struct cucon_listnode
00031 {
00032 struct cucon_listnode* prev;
00033 struct cucon_listnode* next;
00034 };
00035
00036 struct cucon_list
00037 {
00038 struct cucon_listnode eol;
00039 };
00040
00041 extern struct cucon_list cuconP_list_empty;
00042
00043
00044 void cucon_list_init(cucon_list_t);
00045
00046
00047 cucon_list_t cucon_list_new(void);
00048
00049
00050 void cucon_list_init_copy_mem(cucon_list_t dst, cucon_list_t src, size_t size);
00051
00052
00053 cucon_list_t cucon_list_new_copy_mem(cucon_list_t src, size_t size);
00054
00055
00056 CU_SINLINE void cucon_list_init_copy_ptr(cucon_list_t dst, cucon_list_t src)
00057 { cucon_list_init_copy_mem(dst, src, sizeof(void *)); }
00058
00059
00060 CU_SINLINE cucon_list_t cucon_list_new_copy_ptr(cucon_list_t src)
00061 { return cucon_list_new_copy_mem(src, sizeof(void *)); }
00062
00063
00064 void cucon_list_swap(cucon_list_t lst0, cucon_list_t lst1);
00065
00066
00067 #define cucon_list_empty() (&cuconP_list_empty)
00068
00069
00070 #define cucon_list_clear cucon_list_init
00071
00072
00073 cu_bool_t cucon_list_is_empty(cucon_list_t list);
00074
00075
00076 cu_bool_t cucon_list_is_empty_or_singleton(cucon_list_t list);
00077
00078
00079 cu_bool_t cucon_list_is_singleton(cucon_list_t list);
00080
00081
00082 void cucon_list_validate(cucon_list_t list);
00083
00084
00085
00086
00087
00088 int cucon_list_cmp_mem(cucon_list_t lhs, cucon_list_t rhs, size_t slot_size);
00089
00090
00091
00092 CU_SINLINE int cucon_list_cmp_ptr(cucon_list_t lhs, cucon_list_t rhs)
00093 { return cucon_list_cmp_mem(lhs, rhs, sizeof(void *)); }
00094
00095
00096
00097 size_t cucon_list_count(cucon_list_t list);
00098
00099
00100
00101
00102 cucon_listnode_t cucon_list_find_ptr(cucon_list_t list, void *ptr);
00103
00104
00105 CU_SINLINE cucon_listnode_t cucon_list_begin(cucon_list_t list)
00106 { return list->eol.next; }
00107
00108
00109 CU_SINLINE cucon_listnode_t cucon_list_end(cucon_list_t list)
00110 { return &list->eol; }
00111
00112
00113 CU_SINLINE cucon_listnode_t cucon_list_rbegin(cucon_list_t list)
00114 { return list->eol.prev; }
00115
00116
00117 CU_SINLINE cucon_listnode_t cucon_list_rend(cucon_list_t list)
00118 { return &list->eol; }
00119
00120
00121 void cucon_list_insert_init(cucon_listnode_t pos, cucon_listnode_t new_node);
00122
00123
00124 void cucon_list_insert_live(cucon_listnode_t pos, cucon_listnode_t node);
00125
00126
00127 cucon_listnode_t cucon_list_insert_mem(cucon_listnode_t node, size_t size);
00128
00129
00130 cucon_listnode_t cucon_list_insert_ptr(cucon_listnode_t node, void *ptr);
00131
00132
00133 cucon_listnode_t cucon_list_extract(cucon_listnode_t node);
00134
00135
00136
00137 void *cucon_list_extract_mem(cucon_listnode_t node);
00138
00139
00140
00141 void *cucon_list_extract_ptr(cucon_listnode_t node);
00142
00143
00144
00145 cucon_listnode_t cucon_list_erase_node(cucon_listnode_t node);
00146
00147
00148
00149
00150
00151
00152 cucon_listnode_t cucon_list_erase_ptr(cucon_list_t list, void *ptr);
00153
00154
00155
00156 size_t cucon_list_erase_all_ptr(cucon_list_t list, void *ptr);
00157
00158
00159
00160 void cucon_list_rotate(cucon_list_t list, cucon_listnode_t first_node);
00161
00162
00163 void cucon_list_rotate_backwards(cucon_list_t list);
00164
00165
00166 CU_SINLINE void *cucon_listnode_mem(cucon_listnode_t node)
00167 { return CU_ALIGNED_MARG_END(cucon_listnode_t, node); }
00168
00169
00170 CU_SINLINE void *cucon_listnode_ptr(cucon_listnode_t node)
00171 { return (*(void**)CU_ALIGNED_MARG_END(cucon_listnode_t, node)); }
00172
00173
00174
00175 CU_SINLINE void cucon_listnode_set_ptr(cucon_listnode_t node, void *ptr)
00176 { *(void**)CU_ALIGNED_MARG_END(cucon_listnode_t, node) = ptr; }
00177
00178
00179 CU_SINLINE cucon_listnode_t cucon_listnode_next(cucon_listnode_t node)
00180 { return CU_MARG(cucon_listnode_t, node)->next; }
00181
00182
00183 CU_SINLINE cucon_listnode_t cucon_listnode_prev(cucon_listnode_t node)
00184 { return CU_MARG(cucon_listnode_t, node)->prev; }
00185
00186
00187 void cucon_list_range_iter_mem(cucon_listnode_t, cucon_listnode_t,
00188 cu_clop(proc, void, void *));
00189
00190
00191
00192 cu_ptr_source_t cucon_listrange_source_ptr(cucon_listnode_t begin,
00193 cucon_listnode_t end);
00194
00195
00196 CU_SINLINE cu_ptr_source_t cucon_list_source_ptr(cucon_list_t list)
00197 { return cucon_listrange_source_ptr(cucon_list_begin(list),
00198 cucon_list_end(list)); }
00199
00200
00201 CU_SINLINE void
00202 cucon_list_prepend_init(cucon_list_t list, cucon_listnode_t node)
00203 { cucon_list_insert_init(cucon_list_begin(list), node); }
00204
00205
00206 CU_SINLINE void
00207 cucon_list_prepend_live(cucon_list_t list, cucon_listnode_t node)
00208 { cucon_list_insert_live(cucon_list_begin(list), node); }
00209
00210
00211 CU_SINLINE cucon_listnode_t
00212 cucon_list_prepend_mem(cucon_list_t list, size_t size)
00213 { return cucon_list_insert_mem(cucon_list_begin(list), size); }
00214
00215
00216 CU_SINLINE cucon_listnode_t
00217 cucon_list_prepend_ptr(cucon_list_t list, void *p)
00218 { return cucon_list_insert_ptr(cucon_list_begin(list), p); }
00219
00220
00221 CU_SINLINE void
00222 cucon_list_append_init(cucon_list_t list, cucon_listnode_t node)
00223 { cucon_list_insert_init(cucon_list_end(list), node); }
00224
00225
00226 CU_SINLINE void
00227 cucon_list_append_live(cucon_list_t list, cucon_listnode_t node)
00228 { cucon_list_insert_live(cucon_list_end(list), node); }
00229
00230
00231 CU_SINLINE cucon_listnode_t
00232 cucon_list_append_mem(cucon_list_t list, size_t size)
00233 { return cucon_list_insert_mem(cucon_list_end(list), size); }
00234
00235
00236 CU_SINLINE cucon_listnode_t
00237 cucon_list_append_ptr(cucon_list_t list, void *p)
00238 { return cucon_list_insert_ptr(cucon_list_end(list), p); }
00239
00240
00241 cucon_listnode_t
00242 cucon_list_append_list_dct(cucon_list_t dst, cucon_list_t src);
00243
00244
00245 cucon_listnode_t
00246 cucon_list_prepend_list_dct(cucon_list_t dst, cucon_list_t src);
00247
00248
00249
00250 CU_SINLINE void *cucon_list_front_mem(cucon_list_t list)
00251 { return cucon_listnode_mem(cucon_list_begin(list)); }
00252
00253
00254
00255 CU_SINLINE void *cucon_list_back_mem(cucon_list_t list)
00256 { return cucon_listnode_mem(cucon_list_rbegin(list)); }
00257
00258
00259
00260 CU_SINLINE void *cucon_list_front_ptr(cucon_list_t list)
00261 { return *(void **)cucon_list_front_mem(list); }
00262
00263
00264
00265 CU_SINLINE void *cucon_list_back_ptr(cucon_list_t list)
00266 { return *(void **)cucon_list_back_mem(list); }
00267
00268
00269
00270 CU_SINLINE void cucon_list_pop_front(cucon_list_t list)
00271 { cucon_list_erase_node(cucon_list_begin(list)); }
00272
00273
00274
00275 CU_SINLINE void cucon_list_pop_back(cucon_list_t list)
00276 { cucon_list_erase_node(cucon_list_end(list)); }
00277
00278
00279
00280
00281 #define cucon_list_insert_it cucon_list_insert_live
00282 #define cucon_list_insert_init_node cucon_list_insert_init
00283 #define cucon_list_prepend_init_node cucon_list_prepend_init
00284 #define cucon_list_append_init_node cucon_list_append_init
00285
00286 CU_END_DECLARATIONS
00287
00288 #endif