| #ifndef __PERF_INTLIST_H |
| #define __PERF_INTLIST_H |
| |
| #include <linux/rbtree.h> |
| #include <stdbool.h> |
| |
| #include "rblist.h" |
| |
| struct int_node { |
| struct rb_node rb_node; |
| int i; |
| void *priv; |
| }; |
| |
| struct intlist { |
| struct rblist rblist; |
| }; |
| |
| struct intlist *intlist__new(const char *slist); |
| void intlist__delete(struct intlist *ilist); |
| |
| void intlist__remove(struct intlist *ilist, struct int_node *in); |
| int intlist__add(struct intlist *ilist, int i); |
| |
| struct int_node *intlist__entry(const struct intlist *ilist, unsigned int idx); |
| struct int_node *intlist__find(struct intlist *ilist, int i); |
| struct int_node *intlist__findnew(struct intlist *ilist, int i); |
| |
| static inline bool intlist__has_entry(struct intlist *ilist, int i) |
| { |
| return intlist__find(ilist, i) != NULL; |
| } |
| |
| static inline bool intlist__empty(const struct intlist *ilist) |
| { |
| return rblist__empty(&ilist->rblist); |
| } |
| |
| static inline unsigned int intlist__nr_entries(const struct intlist *ilist) |
| { |
| return rblist__nr_entries(&ilist->rblist); |
| } |
| |
| /* For intlist iteration */ |
| static inline struct int_node *intlist__first(struct intlist *ilist) |
| { |
| struct rb_node *rn = rb_first(&ilist->rblist.entries); |
| return rn ? rb_entry(rn, struct int_node, rb_node) : NULL; |
| } |
| static inline struct int_node *intlist__next(struct int_node *in) |
| { |
| struct rb_node *rn; |
| if (!in) |
| return NULL; |
| rn = rb_next(&in->rb_node); |
| return rn ? rb_entry(rn, struct int_node, rb_node) : NULL; |
| } |
| |
| /** |
| * intlist_for_each - iterate over a intlist |
| * @pos: the &struct int_node to use as a loop cursor. |
| * @ilist: the &struct intlist for loop. |
| */ |
| #define intlist__for_each(pos, ilist) \ |
| for (pos = intlist__first(ilist); pos; pos = intlist__next(pos)) |
| |
| /** |
| * intlist_for_each_safe - iterate over a intlist safe against removal of |
| * int_node |
| * @pos: the &struct int_node to use as a loop cursor. |
| * @n: another &struct int_node to use as temporary storage. |
| * @ilist: the &struct intlist for loop. |
| */ |
| #define intlist__for_each_safe(pos, n, ilist) \ |
| for (pos = intlist__first(ilist), n = intlist__next(pos); pos;\ |
| pos = n, n = intlist__next(n)) |
| #endif /* __PERF_INTLIST_H */ |