2012-07-30 22:31:34 -06:00
# ifndef __PERF_INTLIST_H
# define __PERF_INTLIST_H
# include <linux/rbtree.h>
# include <stdbool.h>
# include "rblist.h"
struct int_node {
struct rb_node rb_node ;
int i ;
2013-09-28 13:13:02 -06:00
void * priv ;
2012-07-30 22:31:34 -06:00
} ;
struct intlist {
struct rblist rblist ;
} ;
2013-01-24 16:17:27 -03:00
struct intlist * intlist__new ( const char * slist ) ;
2012-07-30 22:31:34 -06:00
void intlist__delete ( struct intlist * ilist ) ;
void intlist__remove ( struct intlist * ilist , struct int_node * in ) ;
int intlist__add ( struct intlist * ilist , int i ) ;
struct int_node * intlist__entry ( const struct intlist * ilist , unsigned int idx ) ;
struct int_node * intlist__find ( struct intlist * ilist , int i ) ;
2013-10-08 21:26:52 -06:00
struct int_node * intlist__findnew ( struct intlist * ilist , int i ) ;
2012-07-30 22:31:34 -06:00
static inline bool intlist__has_entry ( struct intlist * ilist , int i )
{
return intlist__find ( ilist , i ) ! = NULL ;
}
static inline bool intlist__empty ( const struct intlist * ilist )
{
return rblist__empty ( & ilist - > rblist ) ;
}
static inline unsigned int intlist__nr_entries ( const struct intlist * ilist )
{
return rblist__nr_entries ( & ilist - > rblist ) ;
}
/* For intlist iteration */
static inline struct int_node * intlist__first ( struct intlist * ilist )
{
struct rb_node * rn = rb_first ( & ilist - > rblist . entries ) ;
return rn ? rb_entry ( rn , struct int_node , rb_node ) : NULL ;
}
static inline struct int_node * intlist__next ( struct int_node * in )
{
struct rb_node * rn ;
if ( ! in )
return NULL ;
rn = rb_next ( & in - > rb_node ) ;
return rn ? rb_entry ( rn , struct int_node , rb_node ) : NULL ;
}
/**
* intlist_for_each - iterate over a intlist
* @ pos : the & struct int_node to use as a loop cursor .
* @ ilist : the & struct intlist for loop .
*/
# define intlist__for_each(pos, ilist) \
for ( pos = intlist__first ( ilist ) ; pos ; pos = intlist__next ( pos ) )
/**
* intlist_for_each_safe - iterate over a intlist safe against removal of
* int_node
* @ pos : the & struct int_node to use as a loop cursor .
* @ n : another & struct int_node to use as temporary storage .
* @ ilist : the & struct intlist for loop .
*/
# define intlist__for_each_safe(pos, n, ilist) \
for ( pos = intlist__first ( ilist ) , n = intlist__next ( pos ) ; pos ; \
pos = n , n = intlist__next ( n ) )
# endif /* __PERF_INTLIST_H */