linux/tools/perf/util/intlist.h
<<
>>
Prefs
   1#ifndef __PERF_INTLIST_H
   2#define __PERF_INTLIST_H
   3
   4#include <linux/rbtree.h>
   5#include <stdbool.h>
   6
   7#include "rblist.h"
   8
   9struct int_node {
  10        struct rb_node rb_node;
  11        int i;
  12        void *priv;
  13};
  14
  15struct intlist {
  16        struct rblist rblist;
  17};
  18
  19struct intlist *intlist__new(const char *slist);
  20void intlist__delete(struct intlist *ilist);
  21
  22void intlist__remove(struct intlist *ilist, struct int_node *in);
  23int intlist__add(struct intlist *ilist, int i);
  24
  25struct int_node *intlist__entry(const struct intlist *ilist, unsigned int idx);
  26struct int_node *intlist__find(struct intlist *ilist, int i);
  27struct int_node *intlist__findnew(struct intlist *ilist, int i);
  28
  29static inline bool intlist__has_entry(struct intlist *ilist, int i)
  30{
  31        return intlist__find(ilist, i) != NULL;
  32}
  33
  34static inline bool intlist__empty(const struct intlist *ilist)
  35{
  36        return rblist__empty(&ilist->rblist);
  37}
  38
  39static inline unsigned int intlist__nr_entries(const struct intlist *ilist)
  40{
  41        return rblist__nr_entries(&ilist->rblist);
  42}
  43
  44/* For intlist iteration */
  45static inline struct int_node *intlist__first(struct intlist *ilist)
  46{
  47        struct rb_node *rn = rb_first(&ilist->rblist.entries);
  48        return rn ? rb_entry(rn, struct int_node, rb_node) : NULL;
  49}
  50static inline struct int_node *intlist__next(struct int_node *in)
  51{
  52        struct rb_node *rn;
  53        if (!in)
  54                return NULL;
  55        rn = rb_next(&in->rb_node);
  56        return rn ? rb_entry(rn, struct int_node, rb_node) : NULL;
  57}
  58
  59/**
  60 * intlist__for_each_entry      - iterate over a intlist
  61 * @pos:        the &struct int_node to use as a loop cursor.
  62 * @ilist:      the &struct intlist for loop.
  63 */
  64#define intlist__for_each_entry(pos, ilist)     \
  65        for (pos = intlist__first(ilist); pos; pos = intlist__next(pos))
  66
  67/**
  68 * intlist__for_each_entry_safe - iterate over a intlist safe against removal of
  69 *                         int_node
  70 * @pos:        the &struct int_node to use as a loop cursor.
  71 * @n:          another &struct int_node to use as temporary storage.
  72 * @ilist:      the &struct intlist for loop.
  73 */
  74#define intlist__for_each_entry_safe(pos, n, ilist)     \
  75        for (pos = intlist__first(ilist), n = intlist__next(pos); pos;\
  76             pos = n, n = intlist__next(n))
  77#endif /* __PERF_INTLIST_H */
  78