File indexing completed on 2025-09-14 08:58:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #ifndef UV_TREE_H_
0027 #define UV_TREE_H_
0028
0029 #ifndef UV__UNUSED
0030 # if __GNUC__
0031 # define UV__UNUSED __attribute__((unused))
0032 # else
0033 # define UV__UNUSED
0034 # endif
0035 #endif
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 #define RB_HEAD(name, type) \
0052 struct name { \
0053 struct type *rbh_root; \
0054 }
0055
0056 #define RB_INITIALIZER(root) \
0057 { NULL }
0058
0059 #define RB_INIT(root) do { \
0060 (root)->rbh_root = NULL; \
0061 } while ( 0)
0062
0063 #define RB_BLACK 0
0064 #define RB_RED 1
0065 #define RB_ENTRY(type) \
0066 struct { \
0067 struct type *rbe_left; \
0068 struct type *rbe_right; \
0069 struct type *rbe_parent; \
0070 int rbe_color; \
0071 }
0072
0073 #define RB_LEFT(elm, field) (elm)->field.rbe_left
0074 #define RB_RIGHT(elm, field) (elm)->field.rbe_right
0075 #define RB_PARENT(elm, field) (elm)->field.rbe_parent
0076 #define RB_COLOR(elm, field) (elm)->field.rbe_color
0077 #define RB_ROOT(head) (head)->rbh_root
0078 #define RB_EMPTY(head) (RB_ROOT(head) == NULL)
0079
0080 #define RB_SET(elm, parent, field) do { \
0081 RB_PARENT(elm, field) = parent; \
0082 RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \
0083 RB_COLOR(elm, field) = RB_RED; \
0084 } while ( 0)
0085
0086 #define RB_SET_BLACKRED(black, red, field) do { \
0087 RB_COLOR(black, field) = RB_BLACK; \
0088 RB_COLOR(red, field) = RB_RED; \
0089 } while ( 0)
0090
0091 #ifndef RB_AUGMENT
0092 #define RB_AUGMENT(x) do {} while (0)
0093 #endif
0094
0095 #define RB_ROTATE_LEFT(head, elm, tmp, field) do { \
0096 (tmp) = RB_RIGHT(elm, field); \
0097 if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \
0098 RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \
0099 } \
0100 RB_AUGMENT(elm); \
0101 if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \
0102 if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
0103 RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \
0104 else \
0105 RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \
0106 } else \
0107 (head)->rbh_root = (tmp); \
0108 RB_LEFT(tmp, field) = (elm); \
0109 RB_PARENT(elm, field) = (tmp); \
0110 RB_AUGMENT(tmp); \
0111 if ((RB_PARENT(tmp, field))) \
0112 RB_AUGMENT(RB_PARENT(tmp, field)); \
0113 } while ( 0)
0114
0115 #define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \
0116 (tmp) = RB_LEFT(elm, field); \
0117 if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \
0118 RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \
0119 } \
0120 RB_AUGMENT(elm); \
0121 if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \
0122 if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
0123 RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \
0124 else \
0125 RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \
0126 } else \
0127 (head)->rbh_root = (tmp); \
0128 RB_RIGHT(tmp, field) = (elm); \
0129 RB_PARENT(elm, field) = (tmp); \
0130 RB_AUGMENT(tmp); \
0131 if ((RB_PARENT(tmp, field))) \
0132 RB_AUGMENT(RB_PARENT(tmp, field)); \
0133 } while ( 0)
0134
0135
0136 #define RB_PROTOTYPE(name, type, field, cmp) \
0137 RB_PROTOTYPE_INTERNAL(name, type, field, cmp,)
0138 #define RB_PROTOTYPE_STATIC(name, type, field, cmp) \
0139 RB_PROTOTYPE_INTERNAL(name, type, field, cmp, UV__UNUSED static)
0140 #define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \
0141 attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \
0142 attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\
0143 attr struct type *name##_RB_REMOVE(struct name *, struct type *); \
0144 attr struct type *name##_RB_INSERT(struct name *, struct type *); \
0145 attr struct type *name##_RB_FIND(struct name *, struct type *); \
0146 attr struct type *name##_RB_NFIND(struct name *, struct type *); \
0147 attr struct type *name##_RB_NEXT(struct type *); \
0148 attr struct type *name##_RB_PREV(struct type *); \
0149 attr struct type *name##_RB_MINMAX(struct name *, int); \
0150 \
0151
0152
0153
0154
0155 #define RB_GENERATE(name, type, field, cmp) \
0156 RB_GENERATE_INTERNAL(name, type, field, cmp,)
0157 #define RB_GENERATE_STATIC(name, type, field, cmp) \
0158 RB_GENERATE_INTERNAL(name, type, field, cmp, UV__UNUSED static)
0159 #define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \
0160 attr void \
0161 name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
0162 { \
0163 struct type *parent, *gparent, *tmp; \
0164 while ((parent = RB_PARENT(elm, field)) != NULL && \
0165 RB_COLOR(parent, field) == RB_RED) { \
0166 gparent = RB_PARENT(parent, field); \
0167 if (parent == RB_LEFT(gparent, field)) { \
0168 tmp = RB_RIGHT(gparent, field); \
0169 if (tmp && RB_COLOR(tmp, field) == RB_RED) { \
0170 RB_COLOR(tmp, field) = RB_BLACK; \
0171 RB_SET_BLACKRED(parent, gparent, field); \
0172 elm = gparent; \
0173 continue; \
0174 } \
0175 if (RB_RIGHT(parent, field) == elm) { \
0176 RB_ROTATE_LEFT(head, parent, tmp, field); \
0177 tmp = parent; \
0178 parent = elm; \
0179 elm = tmp; \
0180 } \
0181 RB_SET_BLACKRED(parent, gparent, field); \
0182 RB_ROTATE_RIGHT(head, gparent, tmp, field); \
0183 } else { \
0184 tmp = RB_LEFT(gparent, field); \
0185 if (tmp && RB_COLOR(tmp, field) == RB_RED) { \
0186 RB_COLOR(tmp, field) = RB_BLACK; \
0187 RB_SET_BLACKRED(parent, gparent, field); \
0188 elm = gparent; \
0189 continue; \
0190 } \
0191 if (RB_LEFT(parent, field) == elm) { \
0192 RB_ROTATE_RIGHT(head, parent, tmp, field); \
0193 tmp = parent; \
0194 parent = elm; \
0195 elm = tmp; \
0196 } \
0197 RB_SET_BLACKRED(parent, gparent, field); \
0198 RB_ROTATE_LEFT(head, gparent, tmp, field); \
0199 } \
0200 } \
0201 RB_COLOR(head->rbh_root, field) = RB_BLACK; \
0202 } \
0203 \
0204 attr void \
0205 name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, \
0206 struct type *elm) \
0207 { \
0208 struct type *tmp; \
0209 while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \
0210 elm != RB_ROOT(head)) { \
0211 if (RB_LEFT(parent, field) == elm) { \
0212 tmp = RB_RIGHT(parent, field); \
0213 if (RB_COLOR(tmp, field) == RB_RED) { \
0214 RB_SET_BLACKRED(tmp, parent, field); \
0215 RB_ROTATE_LEFT(head, parent, tmp, field); \
0216 tmp = RB_RIGHT(parent, field); \
0217 } \
0218 if ((RB_LEFT(tmp, field) == NULL || \
0219 RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \
0220 (RB_RIGHT(tmp, field) == NULL || \
0221 RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \
0222 RB_COLOR(tmp, field) = RB_RED; \
0223 elm = parent; \
0224 parent = RB_PARENT(elm, field); \
0225 } else { \
0226 if (RB_RIGHT(tmp, field) == NULL || \
0227 RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) { \
0228 struct type *oleft; \
0229 if ((oleft = RB_LEFT(tmp, field)) \
0230 != NULL) \
0231 RB_COLOR(oleft, field) = RB_BLACK; \
0232 RB_COLOR(tmp, field) = RB_RED; \
0233 RB_ROTATE_RIGHT(head, tmp, oleft, field); \
0234 tmp = RB_RIGHT(parent, field); \
0235 } \
0236 RB_COLOR(tmp, field) = RB_COLOR(parent, field); \
0237 RB_COLOR(parent, field) = RB_BLACK; \
0238 if (RB_RIGHT(tmp, field)) \
0239 RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK; \
0240 RB_ROTATE_LEFT(head, parent, tmp, field); \
0241 elm = RB_ROOT(head); \
0242 break; \
0243 } \
0244 } else { \
0245 tmp = RB_LEFT(parent, field); \
0246 if (RB_COLOR(tmp, field) == RB_RED) { \
0247 RB_SET_BLACKRED(tmp, parent, field); \
0248 RB_ROTATE_RIGHT(head, parent, tmp, field); \
0249 tmp = RB_LEFT(parent, field); \
0250 } \
0251 if ((RB_LEFT(tmp, field) == NULL || \
0252 RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \
0253 (RB_RIGHT(tmp, field) == NULL || \
0254 RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \
0255 RB_COLOR(tmp, field) = RB_RED; \
0256 elm = parent; \
0257 parent = RB_PARENT(elm, field); \
0258 } else { \
0259 if (RB_LEFT(tmp, field) == NULL || \
0260 RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) { \
0261 struct type *oright; \
0262 if ((oright = RB_RIGHT(tmp, field)) \
0263 != NULL) \
0264 RB_COLOR(oright, field) = RB_BLACK; \
0265 RB_COLOR(tmp, field) = RB_RED; \
0266 RB_ROTATE_LEFT(head, tmp, oright, field); \
0267 tmp = RB_LEFT(parent, field); \
0268 } \
0269 RB_COLOR(tmp, field) = RB_COLOR(parent, field); \
0270 RB_COLOR(parent, field) = RB_BLACK; \
0271 if (RB_LEFT(tmp, field)) \
0272 RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK; \
0273 RB_ROTATE_RIGHT(head, parent, tmp, field); \
0274 elm = RB_ROOT(head); \
0275 break; \
0276 } \
0277 } \
0278 } \
0279 if (elm) \
0280 RB_COLOR(elm, field) = RB_BLACK; \
0281 } \
0282 \
0283 attr struct type * \
0284 name##_RB_REMOVE(struct name *head, struct type *elm) \
0285 { \
0286 struct type *child, *parent, *old = elm; \
0287 int color; \
0288 if (RB_LEFT(elm, field) == NULL) \
0289 child = RB_RIGHT(elm, field); \
0290 else if (RB_RIGHT(elm, field) == NULL) \
0291 child = RB_LEFT(elm, field); \
0292 else { \
0293 struct type *left; \
0294 elm = RB_RIGHT(elm, field); \
0295 while ((left = RB_LEFT(elm, field)) != NULL) \
0296 elm = left; \
0297 child = RB_RIGHT(elm, field); \
0298 parent = RB_PARENT(elm, field); \
0299 color = RB_COLOR(elm, field); \
0300 if (child) \
0301 RB_PARENT(child, field) = parent; \
0302 if (parent) { \
0303 if (RB_LEFT(parent, field) == elm) \
0304 RB_LEFT(parent, field) = child; \
0305 else \
0306 RB_RIGHT(parent, field) = child; \
0307 RB_AUGMENT(parent); \
0308 } else \
0309 RB_ROOT(head) = child; \
0310 if (RB_PARENT(elm, field) == old) \
0311 parent = elm; \
0312 (elm)->field = (old)->field; \
0313 if (RB_PARENT(old, field)) { \
0314 if (RB_LEFT(RB_PARENT(old, field), field) == old) \
0315 RB_LEFT(RB_PARENT(old, field), field) = elm; \
0316 else \
0317 RB_RIGHT(RB_PARENT(old, field), field) = elm; \
0318 RB_AUGMENT(RB_PARENT(old, field)); \
0319 } else \
0320 RB_ROOT(head) = elm; \
0321 RB_PARENT(RB_LEFT(old, field), field) = elm; \
0322 if (RB_RIGHT(old, field)) \
0323 RB_PARENT(RB_RIGHT(old, field), field) = elm; \
0324 if (parent) { \
0325 left = parent; \
0326 do { \
0327 RB_AUGMENT(left); \
0328 } while ((left = RB_PARENT(left, field)) != NULL); \
0329 } \
0330 goto color; \
0331 } \
0332 parent = RB_PARENT(elm, field); \
0333 color = RB_COLOR(elm, field); \
0334 if (child) \
0335 RB_PARENT(child, field) = parent; \
0336 if (parent) { \
0337 if (RB_LEFT(parent, field) == elm) \
0338 RB_LEFT(parent, field) = child; \
0339 else \
0340 RB_RIGHT(parent, field) = child; \
0341 RB_AUGMENT(parent); \
0342 } else \
0343 RB_ROOT(head) = child; \
0344 color: \
0345 if (color == RB_BLACK) \
0346 name##_RB_REMOVE_COLOR(head, parent, child); \
0347 return (old); \
0348 } \
0349 \
0350 \
0351 attr struct type * \
0352 name##_RB_INSERT(struct name *head, struct type *elm) \
0353 { \
0354 struct type *tmp; \
0355 struct type *parent = NULL; \
0356 int comp = 0; \
0357 tmp = RB_ROOT(head); \
0358 while (tmp) { \
0359 parent = tmp; \
0360 comp = (cmp)(elm, parent); \
0361 if (comp < 0) \
0362 tmp = RB_LEFT(tmp, field); \
0363 else if (comp > 0) \
0364 tmp = RB_RIGHT(tmp, field); \
0365 else \
0366 return (tmp); \
0367 } \
0368 RB_SET(elm, parent, field); \
0369 if (parent != NULL) { \
0370 if (comp < 0) \
0371 RB_LEFT(parent, field) = elm; \
0372 else \
0373 RB_RIGHT(parent, field) = elm; \
0374 RB_AUGMENT(parent); \
0375 } else \
0376 RB_ROOT(head) = elm; \
0377 name##_RB_INSERT_COLOR(head, elm); \
0378 return (NULL); \
0379 } \
0380 \
0381 \
0382 attr struct type * \
0383 name##_RB_FIND(struct name *head, struct type *elm) \
0384 { \
0385 struct type *tmp = RB_ROOT(head); \
0386 int comp; \
0387 while (tmp) { \
0388 comp = cmp(elm, tmp); \
0389 if (comp < 0) \
0390 tmp = RB_LEFT(tmp, field); \
0391 else if (comp > 0) \
0392 tmp = RB_RIGHT(tmp, field); \
0393 else \
0394 return (tmp); \
0395 } \
0396 return (NULL); \
0397 } \
0398 \
0399 \
0400 attr struct type * \
0401 name##_RB_NFIND(struct name *head, struct type *elm) \
0402 { \
0403 struct type *tmp = RB_ROOT(head); \
0404 struct type *res = NULL; \
0405 int comp; \
0406 while (tmp) { \
0407 comp = cmp(elm, tmp); \
0408 if (comp < 0) { \
0409 res = tmp; \
0410 tmp = RB_LEFT(tmp, field); \
0411 } \
0412 else if (comp > 0) \
0413 tmp = RB_RIGHT(tmp, field); \
0414 else \
0415 return (tmp); \
0416 } \
0417 return (res); \
0418 } \
0419 \
0420 \
0421 attr struct type * \
0422 name##_RB_NEXT(struct type *elm) \
0423 { \
0424 if (RB_RIGHT(elm, field)) { \
0425 elm = RB_RIGHT(elm, field); \
0426 while (RB_LEFT(elm, field)) \
0427 elm = RB_LEFT(elm, field); \
0428 } else { \
0429 if (RB_PARENT(elm, field) && \
0430 (elm == RB_LEFT(RB_PARENT(elm, field), field))) \
0431 elm = RB_PARENT(elm, field); \
0432 else { \
0433 while (RB_PARENT(elm, field) && \
0434 (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \
0435 elm = RB_PARENT(elm, field); \
0436 elm = RB_PARENT(elm, field); \
0437 } \
0438 } \
0439 return (elm); \
0440 } \
0441 \
0442 \
0443 attr struct type * \
0444 name##_RB_PREV(struct type *elm) \
0445 { \
0446 if (RB_LEFT(elm, field)) { \
0447 elm = RB_LEFT(elm, field); \
0448 while (RB_RIGHT(elm, field)) \
0449 elm = RB_RIGHT(elm, field); \
0450 } else { \
0451 if (RB_PARENT(elm, field) && \
0452 (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \
0453 elm = RB_PARENT(elm, field); \
0454 else { \
0455 while (RB_PARENT(elm, field) && \
0456 (elm == RB_LEFT(RB_PARENT(elm, field), field))) \
0457 elm = RB_PARENT(elm, field); \
0458 elm = RB_PARENT(elm, field); \
0459 } \
0460 } \
0461 return (elm); \
0462 } \
0463 \
0464 attr struct type * \
0465 name##_RB_MINMAX(struct name *head, int val) \
0466 { \
0467 struct type *tmp = RB_ROOT(head); \
0468 struct type *parent = NULL; \
0469 while (tmp) { \
0470 parent = tmp; \
0471 if (val < 0) \
0472 tmp = RB_LEFT(tmp, field); \
0473 else \
0474 tmp = RB_RIGHT(tmp, field); \
0475 } \
0476 return (parent); \
0477 }
0478
0479 #define RB_NEGINF -1
0480 #define RB_INF 1
0481
0482 #define RB_INSERT(name, x, y) name##_RB_INSERT(x, y)
0483 #define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y)
0484 #define RB_FIND(name, x, y) name##_RB_FIND(x, y)
0485 #define RB_NFIND(name, x, y) name##_RB_NFIND(x, y)
0486 #define RB_NEXT(name, x) name##_RB_NEXT(x)
0487 #define RB_PREV(name, x) name##_RB_PREV(x)
0488 #define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF)
0489 #define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF)
0490
0491 #define RB_FOREACH(x, name, head) \
0492 for ((x) = RB_MIN(name, head); \
0493 (x) != NULL; \
0494 (x) = name##_RB_NEXT(x))
0495
0496 #define RB_FOREACH_FROM(x, name, y) \
0497 for ((x) = (y); \
0498 ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \
0499 (x) = (y))
0500
0501 #define RB_FOREACH_SAFE(x, name, head, y) \
0502 for ((x) = RB_MIN(name, head); \
0503 ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \
0504 (x) = (y))
0505
0506 #define RB_FOREACH_REVERSE(x, name, head) \
0507 for ((x) = RB_MAX(name, head); \
0508 (x) != NULL; \
0509 (x) = name##_RB_PREV(x))
0510
0511 #define RB_FOREACH_REVERSE_FROM(x, name, y) \
0512 for ((x) = (y); \
0513 ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \
0514 (x) = (y))
0515
0516 #define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \
0517 for ((x) = RB_MAX(name, head); \
0518 ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \
0519 (x) = (y))
0520
0521 #endif