2011-09-13 14:29:12 +04:00
/*
* Copyright ( C ) 2011 STRATO AG
* written by Arne Jansen < sensille @ gmx . net >
* Distributed under the GNU GPL license version 2.
*
*/
# ifndef __ULIST__
# define __ULIST__
/*
* ulist is a generic data structure to hold a collection of unique u64
* values . The only operations it supports is adding to the list and
* enumerating it .
* It is possible to store an auxiliary value along with the key .
*
* The implementation is preliminary and can probably be sped up
* significantly . A first step would be to store the values in an rbtree
* as soon as ULIST_SIZE is exceeded .
*/
/*
* number of elements statically allocated inside struct ulist
*/
# define ULIST_SIZE 16
2012-05-22 16:56:50 +04:00
struct ulist_iterator {
int i ;
} ;
2011-09-13 14:29:12 +04:00
/*
* element of the list
*/
struct ulist_node {
u64 val ; /* value to store */
unsigned long aux ; /* auxiliary value saved along with the val */
} ;
struct ulist {
/*
* number of elements stored in list
*/
unsigned long nnodes ;
/*
* number of nodes we already have room for
*/
unsigned long nodes_alloced ;
/*
* pointer to the array storing the elements . The first ULIST_SIZE
* elements are stored inline . In this case the it points to int_nodes .
* After exceeding ULIST_SIZE , dynamic memory is allocated .
*/
struct ulist_node * nodes ;
/*
* inline storage space for the first ULIST_SIZE entries
*/
struct ulist_node int_nodes [ ULIST_SIZE ] ;
} ;
void ulist_init ( struct ulist * ulist ) ;
void ulist_fini ( struct ulist * ulist ) ;
void ulist_reinit ( struct ulist * ulist ) ;
2012-04-25 20:37:14 +04:00
struct ulist * ulist_alloc ( gfp_t gfp_mask ) ;
2011-09-13 14:29:12 +04:00
void ulist_free ( struct ulist * ulist ) ;
int ulist_add ( struct ulist * ulist , u64 val , unsigned long aux ,
2012-06-01 00:50:28 +04:00
gfp_t gfp_mask ) ;
2012-05-30 20:05:21 +04:00
int ulist_add_merge ( struct ulist * ulist , u64 val , unsigned long aux ,
2012-06-01 00:50:28 +04:00
unsigned long * old_aux , gfp_t gfp_mask ) ;
2012-05-22 16:56:50 +04:00
struct ulist_node * ulist_next ( struct ulist * ulist ,
struct ulist_iterator * uiter ) ;
# define ULIST_ITER_INIT(uiter) ((uiter)->i = 0)
2011-09-13 14:29:12 +04:00
# endif