2 Bacula® - The Network Backup Solution
4 Copyright (C) 2005-2014 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from many
7 others, a complete list can be found in the file AUTHORS.
9 You may use this file and others of this release according to the
10 license defined in the LICENSE file, which includes the Affero General
11 Public License, v3.0 ("AGPLv3") and some additional permissions and
12 terms pursuant to its AGPLv3 Section 7.
14 Bacula® is a registered trademark of Kern Sibbald.
21 /* ========================================================================
23 * red-black binary tree routines -- rblist.h
32 * There is a lot of extra casting here to work around the fact
33 * that some compilers (Sun and Visual C++) do not accept
34 * (bnode *) as an lvalue on the left side of an equal.
36 * Loop var through each member of list
39 #define foreach_rblist(var, tree) \
40 for (((var)=(typeof(var))(tree)->first()); (var); ((var)=(typeof(var))(tree)->next(var)))
42 #define foreach_rblist(var, tree) \
43 for ((*((void **)&(var))=(void*)((tree)->first())); (var); (*((void **)&(var))=(void*)((tree)->next(var))))
53 class rblist : public SMARTALLOC {
58 void left_rotate(void *item);
59 void right_rotate(void *item);
61 rblist(void *item, rblink *link);
63 ~rblist(void) { destroy(); }
64 void init(void *item, rblink *link);
65 void set_parent(void *item, void *parent);
66 void set_left(void *item, void *left);
67 void set_right(void *item, void *right);
68 void set_red(void *item, bool red);
69 void *parent(const void *item) const;
70 void *left(const void *item) const;
71 void *right(const void *item) const;
72 bool red(const void *item) const;
73 void *insert(void *item, int compare(void *item1, void *item2));
74 void *search(void *item, int compare(void *item1, void *item2));
76 void *next(void *item);
77 void *any(void *item);
78 void remove(void *item);
79 bool empty(void) const;
86 * This allows us to do explicit initialization,
87 * allowing us to mix C++ classes inside malloc'ed
88 * C structures. Define before called in constructor.
90 inline void rblist::init(void *item, rblink *link)
93 loffset = (int)((char *)link - (char *)item);
94 if (loffset < 0 || loffset > 5000) {
95 Emsg0(M_ABORT, 0, "Improper rblist initialization.\n");
100 inline rblist::rblist(void *item, rblink *link)
105 /* Constructor with link at head of item */
106 inline rblist::rblist(void): head(0), loffset(0), num_items(0)
110 inline void rblist::set_parent(void *item, void *parent)
112 ((rblink *)(((char *)item)+loffset))->parent = parent;
115 inline void rblist::set_left(void *item, void *left)
117 ((rblink *)(((char *)item)+loffset))->left = left;
120 inline void rblist::set_right(void *item, void *right)
122 ((rblink *)(((char *)item)+loffset))->right = right;
125 inline void rblist::set_red(void *item, bool red)
127 ((rblink *)(((char *)item)+loffset))->red = red;
130 inline bool rblist::empty(void) const
135 inline int rblist::size() const
140 inline void *rblist::parent(const void *item) const
142 return ((rblink *)(((char *)item)+loffset))->parent;
145 inline void *rblist::left(const void *item) const
147 return ((rblink *)(((char *)item)+loffset))->left;
150 inline void *rblist::right(const void *item) const
152 return ((rblink *)(((char *)item)+loffset))->right;
155 inline bool rblist::red(const void *item) const
157 return ((rblink *)(((char *)item)+loffset))->red;