1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef __PERF_RBLIST_H
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __PERF_RBLIST_H
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/rbtree.h>
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdbool.h>
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * create node structs of the form:
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * struct my_node {
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *     struct rb_node rb_node;
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *     ... my data ...
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * };
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * create list structs of the form:
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * struct mylist {
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *     struct rblist rblist;
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *     ... my data ...
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * };
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct rblist {
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct rb_root entries;
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned int   nr_entries;
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int (*node_cmp)(struct rb_node *rbn, const void *entry);
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct rb_node *(*node_new)(struct rblist *rlist, const void *new_entry);
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	void (*node_delete)(struct rblist *rblist, struct rb_node *rb_node);
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid rblist__init(struct rblist *rblist);
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid rblist__delete(struct rblist *rblist);
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint rblist__add_node(struct rblist *rblist, const void *new_entry);
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid rblist__remove_node(struct rblist *rblist, struct rb_node *rb_node);
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct rb_node *rblist__find(struct rblist *rblist, const void *entry);
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct rb_node *rblist__entry(const struct rblist *rblist, unsigned int idx);
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline bool rblist__empty(const struct rblist *rblist)
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return rblist->nr_entries == 0;
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline unsigned int rblist__nr_entries(const struct rblist *rblist)
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return rblist->nr_entries;
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* __PERF_RBLIST_H */
48