diff options
Diffstat (limited to 'src/dlist.h')
-rw-r--r-- | src/dlist.h | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/dlist.h b/src/dlist.h new file mode 100644 index 0000000..0a84683 --- /dev/null +++ b/src/dlist.h @@ -0,0 +1,83 @@ + +/********************************************************************** + + Copyright 2019 Andrey V.Kosteltsev + + Licensed under the Radix.pro License, Version 1.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://radix.pro/licenses/LICENSE-1.0-en_US.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied. + + **********************************************************************/ + +#ifndef _DLIST_H_ +#define _DLIST_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + +struct dlist { + struct dlist *prev; + struct dlist *next; + + void *data; +}; + +typedef void (*DLFUNC) ( void *data, void *user_data ); +typedef int (*DLCMPF) ( const void *a, const void *b ); +typedef int (*DLCMPDF) ( const void *a, const void *b, void *user_data ); + +#define dlist_prev( list ) ( (list)->prev ) +#define dlist_next( list ) ( (list)->next ) + +extern struct dlist *__dlist_alloc( void ); +extern struct dlist *dlist_first( struct dlist *list ); +extern struct dlist *dlist_last( struct dlist *list ); +extern int dlist_length( struct dlist *list ); +extern struct dlist *dlist_nth( struct dlist *list, int n ); +extern void *dlist_nth_data( struct dlist *list, int n ); +extern int dlist_position( struct dlist *list, struct dlist *link ); +extern int dlist_index( struct dlist *list, const void *data ); +extern struct dlist *dlist_find( struct dlist *list, const void *data ); +extern struct dlist *dlist_find_data( struct dlist *list, DLCMPF func, const void *data ); + +extern struct dlist *dlist_append( struct dlist *list, void *data ); +extern struct dlist *dlist_prepend( struct dlist *list, void *data ); +extern struct dlist *dlist_insert( struct dlist *list, void *data, int position ); +extern struct dlist *dlist_insert_sorted( struct dlist *list, DLCMPF cmp_func, void *data ); +extern struct dlist *dlist_insert_sorted_with_data( struct dlist *list, DLCMPDF cmp_func, void *data, void *user_data ); +extern struct dlist *dlist_concat( struct dlist *list1, struct dlist *list2 ); +extern struct dlist *dlist_insert_list( struct dlist *list1, struct dlist *list2, int position ); + +extern struct dlist *__dlist_remove_link( struct dlist *list, struct dlist *link ); +extern struct dlist *dlist_remove( struct dlist *list, const void *data ); +extern struct dlist *dlist_remove_all( struct dlist *list, const void *data ); +extern struct dlist *dlist_remove_data( struct dlist *list, DLCMPF cmp_func, DLFUNC free_func, const void *data ); +extern struct dlist *dlist_remove_data_all( struct dlist *list, DLCMPF cmp_func, DLFUNC free_func, const void *data ); + +extern struct dlist *dlist_copy( struct dlist *list ); +extern struct dlist *dlist_reverse( struct dlist *list ); + +extern struct dlist *dlist_sort( struct dlist *list, DLCMPF cmp_func ); +extern struct dlist *dlist_sort_with_data( struct dlist *list, DLCMPDF cmp_func, void *user_data ); + +extern void dlist_foreach( struct dlist *list, DLFUNC func, void *user_data ); + + +extern void __dlist_free( struct dlist *list ); +extern void dlist_free( struct dlist *list, DLFUNC free_func ); + + +#ifdef __cplusplus +} /* ... extern "C" */ +#endif + +#endif /* _DLIST_H_ */ |