2009-09-24 20:02:18 +04:00
# ifndef __PERF_STRLIST_H
# define __PERF_STRLIST_H
2009-07-01 02:01:20 +04:00
2009-07-01 19:28:37 +04:00
# include <linux/rbtree.h>
2009-07-01 02:01:20 +04:00
# include <stdbool.h>
2012-07-31 08:31:33 +04:00
# include "rblist.h"
2009-07-01 02:01:20 +04:00
struct str_node {
struct rb_node rb_node ;
const char * s ;
} ;
struct strlist {
2012-07-31 08:31:33 +04:00
struct rblist rblist ;
2009-07-11 19:18:34 +04:00
bool dupstr ;
2009-07-01 02:01:20 +04:00
} ;
struct strlist * strlist__new ( bool dupstr , const char * slist ) ;
void strlist__delete ( struct strlist * self ) ;
void strlist__remove ( struct strlist * self , struct str_node * sn ) ;
int strlist__load ( struct strlist * self , const char * filename ) ;
int strlist__add ( struct strlist * self , const char * str ) ;
2009-07-11 19:18:34 +04:00
struct str_node * strlist__entry ( const struct strlist * self , unsigned int idx ) ;
2009-12-15 18:31:49 +03:00
struct str_node * strlist__find ( struct strlist * self , const char * entry ) ;
static inline bool strlist__has_entry ( struct strlist * self , const char * entry )
{
return strlist__find ( self , entry ) ! = NULL ;
}
2009-07-01 02:01:20 +04:00
static inline bool strlist__empty ( const struct strlist * self )
{
2012-07-31 08:31:33 +04:00
return rblist__empty ( & self - > rblist ) ;
2009-07-11 19:18:34 +04:00
}
static inline unsigned int strlist__nr_entries ( const struct strlist * self )
{
2012-07-31 08:31:33 +04:00
return rblist__nr_entries ( & self - > rblist ) ;
2009-07-01 02:01:20 +04:00
}
2009-12-15 18:31:56 +03:00
/* For strlist iteration */
static inline struct str_node * strlist__first ( struct strlist * self )
{
2012-07-31 08:31:33 +04:00
struct rb_node * rn = rb_first ( & self - > rblist . entries ) ;
2009-12-15 18:31:56 +03: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 .
* @ self : the & struct strlist for loop .
*/
# define strlist__for_each(pos, self) \
for ( pos = strlist__first ( self ) ; pos ; pos = strlist__next ( pos ) )
/**
* 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 .
* @ self : the & struct strlist for loop .
*/
# define strlist__for_each_safe(pos, n, self) \
for ( pos = strlist__first ( self ) , n = strlist__next ( pos ) ; pos ; \
pos = n , n = strlist__next ( n ) )
2009-07-01 02:01:20 +04:00
int strlist__parse_list ( struct strlist * self , const char * s ) ;
2009-09-24 20:02:18 +04:00
# endif /* __PERF_STRLIST_H */