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