Blame view

tools/perf/util/intlist.h 2.11 KB
70b40c4a4   David Ahern   perf tools: Intro...
1
2
3
4
5
6
7
8
9
10
11
  #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;
2969b1299   David Ahern   perf intlist: Add...
12
  	void *priv;
70b40c4a4   David Ahern   perf tools: Intro...
13
14
15
16
17
  };
  
  struct intlist {
  	struct rblist rblist;
  };
ffe0fb769   Arnaldo Carvalho de Melo   perf tools: Allow...
18
  struct intlist *intlist__new(const char *slist);
70b40c4a4   David Ahern   perf tools: Intro...
19
20
21
22
23
24
25
  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);
813335b8b   David Ahern   perf util: Add fi...
26
  struct int_node *intlist__findnew(struct intlist *ilist, int i);
70b40c4a4   David Ahern   perf tools: Intro...
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  
  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;
  }
  
  /**
10daf4d01   Arnaldo Carvalho de Melo   perf intlist: Ren...
59
   * intlist__for_each_entry      - iterate over a intlist
70b40c4a4   David Ahern   perf tools: Intro...
60
61
62
   * @pos:	the &struct int_node to use as a loop cursor.
   * @ilist:	the &struct intlist for loop.
   */
10daf4d01   Arnaldo Carvalho de Melo   perf intlist: Ren...
63
  #define intlist__for_each_entry(pos, ilist)	\
70b40c4a4   David Ahern   perf tools: Intro...
64
65
66
  	for (pos = intlist__first(ilist); pos; pos = intlist__next(pos))
  
  /**
10daf4d01   Arnaldo Carvalho de Melo   perf intlist: Ren...
67
   * intlist__for_each_entry_safe - iterate over a intlist safe against removal of
70b40c4a4   David Ahern   perf tools: Intro...
68
69
70
71
72
   *                         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.
   */
10daf4d01   Arnaldo Carvalho de Melo   perf intlist: Ren...
73
  #define intlist__for_each_entry_safe(pos, n, ilist)	\
70b40c4a4   David Ahern   perf tools: Intro...
74
75
76
  	for (pos = intlist__first(ilist), n = intlist__next(pos); pos;\
  	     pos = n, n = intlist__next(n))
  #endif /* __PERF_INTLIST_H */