162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __PERF_RBLIST_H
362306a36Sopenharmony_ci#define __PERF_RBLIST_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/rbtree.h>
662306a36Sopenharmony_ci#include <stdbool.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci/*
962306a36Sopenharmony_ci * create node structs of the form:
1062306a36Sopenharmony_ci * struct my_node {
1162306a36Sopenharmony_ci *     struct rb_node rb_node;
1262306a36Sopenharmony_ci *     ... my data ...
1362306a36Sopenharmony_ci * };
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci * create list structs of the form:
1662306a36Sopenharmony_ci * struct mylist {
1762306a36Sopenharmony_ci *     struct rblist rblist;
1862306a36Sopenharmony_ci *     ... my data ...
1962306a36Sopenharmony_ci * };
2062306a36Sopenharmony_ci */
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct rblist {
2362306a36Sopenharmony_ci	struct rb_root_cached entries;
2462306a36Sopenharmony_ci	unsigned int   nr_entries;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	int (*node_cmp)(struct rb_node *rbn, const void *entry);
2762306a36Sopenharmony_ci	struct rb_node *(*node_new)(struct rblist *rlist, const void *new_entry);
2862306a36Sopenharmony_ci	void (*node_delete)(struct rblist *rblist, struct rb_node *rb_node);
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_civoid rblist__init(struct rblist *rblist);
3262306a36Sopenharmony_civoid rblist__exit(struct rblist *rblist);
3362306a36Sopenharmony_civoid rblist__delete(struct rblist *rblist);
3462306a36Sopenharmony_ciint rblist__add_node(struct rblist *rblist, const void *new_entry);
3562306a36Sopenharmony_civoid rblist__remove_node(struct rblist *rblist, struct rb_node *rb_node);
3662306a36Sopenharmony_cistruct rb_node *rblist__find(struct rblist *rblist, const void *entry);
3762306a36Sopenharmony_cistruct rb_node *rblist__findnew(struct rblist *rblist, const void *entry);
3862306a36Sopenharmony_cistruct rb_node *rblist__entry(const struct rblist *rblist, unsigned int idx);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistatic inline bool rblist__empty(const struct rblist *rblist)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	return rblist->nr_entries == 0;
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic inline unsigned int rblist__nr_entries(const struct rblist *rblist)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	return rblist->nr_entries;
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#endif /* __PERF_RBLIST_H */
51