1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef __PERF_STRLIST_H
2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define __PERF_STRLIST_H
3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_BEGIN */
5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#if 0
6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/rbtree.h>
7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#else
8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "include/linux/kernel.h"
9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "include/linux/rbtree.h"
10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_END */
12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stdbool.h>
13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct str_node {
15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct rb_node rb_node;
16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	const char     *s;
17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct strlist {
20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct rb_root entries;
21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	unsigned int   nr_entries;
22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	bool	       dupstr;
23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct strlist *strlist__new(bool dupstr, const char *slist);
26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid strlist__delete(struct strlist *self);
27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid strlist__remove(struct strlist *self, struct str_node *sn);
29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint strlist__load(struct strlist *self, const char *filename);
30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint strlist__add(struct strlist *self, const char *str);
31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct str_node *strlist__entry(const struct strlist *self, unsigned int idx);
33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct str_node *strlist__find(struct strlist *self, const char *entry);
34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline bool strlist__has_entry(struct strlist *self, const char *entry)
36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return strlist__find(self, entry) != NULL;
38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline bool strlist__empty(const struct strlist *self)
41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return self->nr_entries == 0;
43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline unsigned int strlist__nr_entries(const struct strlist *self)
46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return self->nr_entries;
48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* For strlist iteration */
51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline struct str_node *strlist__first(struct strlist *self)
52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct rb_node *rn = rb_first(&self->entries);
54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return rn ? rb_entry(rn, struct str_node, rb_node) : NULL;
55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline struct str_node *strlist__next(struct str_node *sn)
57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct rb_node *rn;
59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	if (!sn)
60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		return NULL;
61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	rn = rb_next(&sn->rb_node);
62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return rn ? rb_entry(rn, struct str_node, rb_node) : NULL;
63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/**
66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * strlist_for_each      - iterate over a strlist
67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @pos:	the &struct str_node to use as a loop cursor.
68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @self:	the &struct strlist for loop.
69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */
70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define strlist__for_each(pos, self)	\
71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	for (pos = strlist__first(self); pos; pos = strlist__next(pos))
72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/**
74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * strlist_for_each_safe - iterate over a strlist safe against removal of
75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng *                         str_node
76e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @pos:	the &struct str_node to use as a loop cursor.
77e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @n:		another &struct str_node to use as temporary storage.
78e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @self:	the &struct strlist for loop.
79e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */
80e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define strlist__for_each_safe(pos, n, self)	\
81e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	for (pos = strlist__first(self), n = strlist__next(pos); pos;\
82e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	     pos = n, n = strlist__next(n))
83e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
84e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint strlist__parse_list(struct strlist *self, const char *s);
85e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif /* __PERF_STRLIST_H */
86