2009-09-24 18:02:18 +02:00
# ifndef __PERF_STRLIST_H
# define __PERF_STRLIST_H
2009-06-30 19:01:20 -03:00
2009-07-01 12:28:37 -03:00
# include <linux/rbtree.h>
2009-06-30 19:01:20 -03:00
# include <stdbool.h>
2012-07-30 22:31:33 -06:00
# include "rblist.h"
2009-06-30 19:01:20 -03:00
struct str_node {
struct rb_node rb_node ;
const char * s ;
} ;
struct strlist {
2012-07-30 22:31:33 -06:00
struct rblist rblist ;
2009-07-11 12:18:34 -03:00
bool dupstr ;
2009-06-30 19:01:20 -03:00
} ;
struct strlist * strlist__new ( bool dupstr , const char * slist ) ;
2013-01-24 21:59:59 -03:00
void strlist__delete ( struct strlist * slist ) ;
2009-06-30 19:01:20 -03:00
2013-01-24 21:59:59 -03:00
void strlist__remove ( struct strlist * slist , struct str_node * sn ) ;
int strlist__load ( struct strlist * slist , const char * filename ) ;
int strlist__add ( struct strlist * slist , const char * str ) ;
2009-06-30 19:01:20 -03:00
2013-01-24 21:59:59 -03:00
struct str_node * strlist__entry ( const struct strlist * slist , unsigned int idx ) ;
struct str_node * strlist__find ( struct strlist * slist , const char * entry ) ;
2009-12-15 10:31:49 -05:00
2013-01-24 21:59:59 -03:00
static inline bool strlist__has_entry ( struct strlist * slist , const char * entry )
2009-12-15 10:31:49 -05:00
{
2013-01-24 21:59:59 -03:00
return strlist__find ( slist , entry ) ! = NULL ;
2009-12-15 10:31:49 -05:00
}
2009-06-30 19:01:20 -03:00
2013-01-24 21:59:59 -03:00
static inline bool strlist__empty ( const struct strlist * slist )
2009-06-30 19:01:20 -03:00
{
2013-01-24 21:59:59 -03:00
return rblist__empty ( & slist - > rblist ) ;
2009-07-11 12:18:34 -03:00
}
2013-01-24 21:59:59 -03:00
static inline unsigned int strlist__nr_entries ( const struct strlist * slist )
2009-07-11 12:18:34 -03:00
{
2013-01-24 21:59:59 -03:00
return rblist__nr_entries ( & slist - > rblist ) ;
2009-06-30 19:01:20 -03:00
}
2009-12-15 10:31:56 -05:00
/* For strlist iteration */
2013-01-24 21:59:59 -03:00
static inline struct str_node * strlist__first ( struct strlist * slist )
2009-12-15 10:31:56 -05:00
{
2013-01-24 21:59:59 -03:00
struct rb_node * rn = rb_first ( & slist - > rblist . entries ) ;
2009-12-15 10:31:56 -05:00
return rn ? rb_entry ( rn , struct str_node , rb_node ) : NULL ;
}
static inline struct str_node * strlist__next ( struct str_node * sn )
{
struct rb_node * rn ;
if ( ! sn )
return NULL ;
rn = rb_next ( & sn - > rb_node ) ;
return rn ? rb_entry ( rn , struct str_node , rb_node ) : NULL ;
}
/**
* strlist_for_each - iterate over a strlist
* @ pos : the & struct str_node to use as a loop cursor .
2013-01-24 21:59:59 -03:00
* @ slist : the & struct strlist for loop .
2009-12-15 10:31:56 -05:00
*/
2013-01-24 21:59:59 -03:00
# define strlist__for_each(pos, slist) \
for ( pos = strlist__first ( slist ) ; pos ; pos = strlist__next ( pos ) )
2009-12-15 10:31:56 -05:00
/**
* strlist_for_each_safe - iterate over a strlist safe against removal of
* str_node
* @ pos : the & struct str_node to use as a loop cursor .
* @ n : another & struct str_node to use as temporary storage .
2013-01-24 21:59:59 -03:00
* @ slist : the & struct strlist for loop .
2009-12-15 10:31:56 -05:00
*/
2013-01-24 21:59:59 -03:00
# define strlist__for_each_safe(pos, n, slist) \
for ( pos = strlist__first ( slist ) , n = strlist__next ( pos ) ; pos ; \
2009-12-15 10:31:56 -05:00
pos = n , n = strlist__next ( n ) )
2013-01-24 21:59:59 -03:00
int strlist__parse_list ( struct strlist * slist , const char * s ) ;
2009-09-24 18:02:18 +02:00
# endif /* __PERF_STRLIST_H */