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