2 * Based on strlist.c by:
3 * (c) 2009 Arnaldo Carvalho de Melo <acme@redhat.com>
5 * Licensed under the GPLv2.
14 int rblist__add_node(struct rblist
*rblist
, const void *new_entry
)
16 struct rb_node
**p
= &rblist
->entries
.rb_node
;
17 struct rb_node
*parent
= NULL
, *new_node
;
24 rc
= rblist
->node_cmp(parent
, new_entry
);
33 new_node
= rblist
->node_new(rblist
, new_entry
);
37 rb_link_node(new_node
, parent
, p
);
38 rb_insert_color(new_node
, &rblist
->entries
);
44 void rblist__remove_node(struct rblist
*rblist
, struct rb_node
*rb_node
)
46 rb_erase(rb_node
, &rblist
->entries
);
48 rblist
->node_delete(rblist
, rb_node
);
51 static struct rb_node
*__rblist__findnew(struct rblist
*rblist
,
55 struct rb_node
**p
= &rblist
->entries
.rb_node
;
56 struct rb_node
*parent
= NULL
, *new_node
= NULL
;
63 rc
= rblist
->node_cmp(parent
, entry
);
73 new_node
= rblist
->node_new(rblist
, entry
);
75 rb_link_node(new_node
, parent
, p
);
76 rb_insert_color(new_node
, &rblist
->entries
);
84 struct rb_node
*rblist__find(struct rblist
*rblist
, const void *entry
)
86 return __rblist__findnew(rblist
, entry
, false);
89 struct rb_node
*rblist__findnew(struct rblist
*rblist
, const void *entry
)
91 return __rblist__findnew(rblist
, entry
, true);
94 void rblist__init(struct rblist
*rblist
)
97 rblist
->entries
= RB_ROOT
;
98 rblist
->nr_entries
= 0;
104 void rblist__exit(struct rblist
*rblist
)
106 struct rb_node
*pos
, *next
= rb_first(&rblist
->entries
);
111 rblist__remove_node(rblist
, pos
);
115 void rblist__delete(struct rblist
*rblist
)
117 if (rblist
!= NULL
) {
118 rblist__exit(rblist
);
123 struct rb_node
*rblist__entry(const struct rblist
*rblist
, unsigned int idx
)
125 struct rb_node
*node
;
127 for (node
= rb_first(&rblist
->entries
); node
; node
= rb_next(node
)) {