18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __PERF_INTLIST_H
38c2ecf20Sopenharmony_ci#define __PERF_INTLIST_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/rbtree.h>
68c2ecf20Sopenharmony_ci#include <stdbool.h>
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include "rblist.h"
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_cistruct int_node {
118c2ecf20Sopenharmony_ci	struct rb_node rb_node;
128c2ecf20Sopenharmony_ci	int i;
138c2ecf20Sopenharmony_ci	void *priv;
148c2ecf20Sopenharmony_ci};
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_cistruct intlist {
178c2ecf20Sopenharmony_ci	struct rblist rblist;
188c2ecf20Sopenharmony_ci};
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cistruct intlist *intlist__new(const char *slist);
218c2ecf20Sopenharmony_civoid intlist__delete(struct intlist *ilist);
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_civoid intlist__remove(struct intlist *ilist, struct int_node *in);
248c2ecf20Sopenharmony_ciint intlist__add(struct intlist *ilist, int i);
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistruct int_node *intlist__entry(const struct intlist *ilist, unsigned int idx);
278c2ecf20Sopenharmony_cistruct int_node *intlist__find(struct intlist *ilist, int i);
288c2ecf20Sopenharmony_cistruct int_node *intlist__findnew(struct intlist *ilist, int i);
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistatic inline bool intlist__has_entry(struct intlist *ilist, int i)
318c2ecf20Sopenharmony_ci{
328c2ecf20Sopenharmony_ci	return intlist__find(ilist, i) != NULL;
338c2ecf20Sopenharmony_ci}
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_cistatic inline bool intlist__empty(const struct intlist *ilist)
368c2ecf20Sopenharmony_ci{
378c2ecf20Sopenharmony_ci	return rblist__empty(&ilist->rblist);
388c2ecf20Sopenharmony_ci}
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_cistatic inline unsigned int intlist__nr_entries(const struct intlist *ilist)
418c2ecf20Sopenharmony_ci{
428c2ecf20Sopenharmony_ci	return rblist__nr_entries(&ilist->rblist);
438c2ecf20Sopenharmony_ci}
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci/* For intlist iteration */
468c2ecf20Sopenharmony_cistatic inline struct int_node *intlist__first(struct intlist *ilist)
478c2ecf20Sopenharmony_ci{
488c2ecf20Sopenharmony_ci	struct rb_node *rn = rb_first_cached(&ilist->rblist.entries);
498c2ecf20Sopenharmony_ci	return rn ? rb_entry(rn, struct int_node, rb_node) : NULL;
508c2ecf20Sopenharmony_ci}
518c2ecf20Sopenharmony_cistatic inline struct int_node *intlist__next(struct int_node *in)
528c2ecf20Sopenharmony_ci{
538c2ecf20Sopenharmony_ci	struct rb_node *rn;
548c2ecf20Sopenharmony_ci	if (!in)
558c2ecf20Sopenharmony_ci		return NULL;
568c2ecf20Sopenharmony_ci	rn = rb_next(&in->rb_node);
578c2ecf20Sopenharmony_ci	return rn ? rb_entry(rn, struct int_node, rb_node) : NULL;
588c2ecf20Sopenharmony_ci}
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci/**
618c2ecf20Sopenharmony_ci * intlist__for_each_entry      - iterate over a intlist
628c2ecf20Sopenharmony_ci * @pos:	the &struct int_node to use as a loop cursor.
638c2ecf20Sopenharmony_ci * @ilist:	the &struct intlist for loop.
648c2ecf20Sopenharmony_ci */
658c2ecf20Sopenharmony_ci#define intlist__for_each_entry(pos, ilist)	\
668c2ecf20Sopenharmony_ci	for (pos = intlist__first(ilist); pos; pos = intlist__next(pos))
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci/**
698c2ecf20Sopenharmony_ci * intlist__for_each_entry_safe - iterate over a intlist safe against removal of
708c2ecf20Sopenharmony_ci *                         int_node
718c2ecf20Sopenharmony_ci * @pos:	the &struct int_node to use as a loop cursor.
728c2ecf20Sopenharmony_ci * @n:		another &struct int_node to use as temporary storage.
738c2ecf20Sopenharmony_ci * @ilist:	the &struct intlist for loop.
748c2ecf20Sopenharmony_ci */
758c2ecf20Sopenharmony_ci#define intlist__for_each_entry_safe(pos, n, ilist)	\
768c2ecf20Sopenharmony_ci	for (pos = intlist__first(ilist), n = intlist__next(pos); pos;\
778c2ecf20Sopenharmony_ci	     pos = n, n = intlist__next(n))
788c2ecf20Sopenharmony_ci#endif /* __PERF_INTLIST_H */
79