2012-07-31 08:31:34 +04: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 23:13:02 +04:00
void * priv ;
2012-07-31 08:31:34 +04:00
} ;
struct intlist {
struct rblist rblist ;
} ;
2013-01-24 23:17:27 +04:00
struct intlist * intlist__new ( const char * slist ) ;
2012-07-31 08:31:34 +04: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-09 07:26:52 +04:00
struct int_node * intlist__findnew ( struct intlist * ilist , int i ) ;
2012-07-31 08:31:34 +04: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 ;
}
/**
2016-06-23 17:39:19 +03:00
* intlist__for_each_entry - iterate over a intlist
2012-07-31 08:31:34 +04:00
* @ pos : the & struct int_node to use as a loop cursor .
* @ ilist : the & struct intlist for loop .
*/
2016-06-23 17:39:19 +03:00
# define intlist__for_each_entry(pos, ilist) \
2012-07-31 08:31:34 +04:00
for ( pos = intlist__first ( ilist ) ; pos ; pos = intlist__next ( pos ) )
/**
2016-06-23 17:39:19 +03:00
* intlist__for_each_entry_safe - iterate over a intlist safe against removal of
2012-07-31 08:31:34 +04:00
* 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 .
*/
2016-06-23 17:39:19 +03:00
# define intlist__for_each_entry_safe(pos, n, ilist) \
2012-07-31 08:31:34 +04:00
for ( pos = intlist__first ( ilist ) , n = intlist__next ( pos ) ; pos ; \
pos = n , n = intlist__next ( n ) )
# endif /* __PERF_INTLIST_H */