xref: /linux/tools/perf/util/rblist.h (revision 597473720f4dc69749542bfcfed4a927a43d935e)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
237bbd3ffSDavid Ahern #ifndef __PERF_RBLIST_H
337bbd3ffSDavid Ahern #define __PERF_RBLIST_H
437bbd3ffSDavid Ahern 
537bbd3ffSDavid Ahern #include <linux/rbtree.h>
637bbd3ffSDavid Ahern #include <stdbool.h>
737bbd3ffSDavid Ahern 
837bbd3ffSDavid Ahern /*
937bbd3ffSDavid Ahern  * create node structs of the form:
1037bbd3ffSDavid Ahern  * struct my_node {
1137bbd3ffSDavid Ahern  *     struct rb_node rb_node;
1237bbd3ffSDavid Ahern  *     ... my data ...
1337bbd3ffSDavid Ahern  * };
1437bbd3ffSDavid Ahern  *
1537bbd3ffSDavid Ahern  * create list structs of the form:
1637bbd3ffSDavid Ahern  * struct mylist {
1737bbd3ffSDavid Ahern  *     struct rblist rblist;
1837bbd3ffSDavid Ahern  *     ... my data ...
1937bbd3ffSDavid Ahern  * };
2037bbd3ffSDavid Ahern  */
2137bbd3ffSDavid Ahern 
2237bbd3ffSDavid Ahern struct rblist {
23*ca227029SDavidlohr Bueso 	struct rb_root_cached entries;
2437bbd3ffSDavid Ahern 	unsigned int   nr_entries;
2537bbd3ffSDavid Ahern 
2637bbd3ffSDavid Ahern 	int (*node_cmp)(struct rb_node *rbn, const void *entry);
2737bbd3ffSDavid Ahern 	struct rb_node *(*node_new)(struct rblist *rlist, const void *new_entry);
2837bbd3ffSDavid Ahern 	void (*node_delete)(struct rblist *rblist, struct rb_node *rb_node);
2937bbd3ffSDavid Ahern };
3037bbd3ffSDavid Ahern 
3137bbd3ffSDavid Ahern void rblist__init(struct rblist *rblist);
3233fec3e3SJin Yao void rblist__exit(struct rblist *rblist);
3337bbd3ffSDavid Ahern void rblist__delete(struct rblist *rblist);
3437bbd3ffSDavid Ahern int rblist__add_node(struct rblist *rblist, const void *new_entry);
3537bbd3ffSDavid Ahern void rblist__remove_node(struct rblist *rblist, struct rb_node *rb_node);
3637bbd3ffSDavid Ahern struct rb_node *rblist__find(struct rblist *rblist, const void *entry);
37813335b8SDavid Ahern struct rb_node *rblist__findnew(struct rblist *rblist, const void *entry);
3837bbd3ffSDavid Ahern struct rb_node *rblist__entry(const struct rblist *rblist, unsigned int idx);
3937bbd3ffSDavid Ahern 
rblist__empty(const struct rblist * rblist)4037bbd3ffSDavid Ahern static inline bool rblist__empty(const struct rblist *rblist)
4137bbd3ffSDavid Ahern {
4237bbd3ffSDavid Ahern 	return rblist->nr_entries == 0;
4337bbd3ffSDavid Ahern }
4437bbd3ffSDavid Ahern 
rblist__nr_entries(const struct rblist * rblist)4537bbd3ffSDavid Ahern static inline unsigned int rblist__nr_entries(const struct rblist *rblist)
4637bbd3ffSDavid Ahern {
4737bbd3ffSDavid Ahern 	return rblist->nr_entries;
4837bbd3ffSDavid Ahern }
4937bbd3ffSDavid Ahern 
5037bbd3ffSDavid Ahern #endif /* __PERF_RBLIST_H */
51