|
317 | 317 | #define __KB_ITR(name, key_t, kbnode_t) \
|
318 | 318 | static inline void kb_itr_first_##name(kbtree_##name##_t *b, kbitr_##name##_t *itr) \
|
319 | 319 | { \
|
320 |
| - itr->p = 0; \ |
| 320 | + itr->p = NULL; \ |
321 | 321 | if (b->n_keys == 0) return; \
|
322 | 322 | itr->p = itr->stack; \
|
323 | 323 | itr->p->x = b->root; itr->p->i = 0; \
|
|
329 | 329 | } \
|
330 | 330 | static inline int kb_itr_next_##name(kbtree_##name##_t *b, kbitr_##name##_t *itr) \
|
331 | 331 | { \
|
332 |
| - if (itr->p < itr->stack) return 0; \ |
| 332 | + if (itr->p == NULL) return 0; \ |
333 | 333 | for (;;) { \
|
334 | 334 | ++itr->p->i; \
|
335 | 335 | while (itr->p->x && itr->p->i <= itr->p->x->n) { \
|
336 | 336 | itr->p[1].i = 0; \
|
337 | 337 | itr->p[1].x = itr->p->x->is_internal? __KB_PTR(b, itr->p->x)[itr->p->i] : 0; \
|
338 | 338 | ++itr->p; \
|
339 | 339 | } \
|
| 340 | + if (itr->p == itr->stack) { \ |
| 341 | + itr->p = NULL; \ |
| 342 | + return 0; \ |
| 343 | + } \ |
340 | 344 | --itr->p; \
|
341 |
| - if (itr->p < itr->stack) return 0; \ |
342 | 345 | if (itr->p->x && itr->p->i < itr->p->x->n) return 1; \
|
343 | 346 | } \
|
344 | 347 | } \
|
345 | 348 | static inline int kb_itr_prev_##name(kbtree_##name##_t *b, kbitr_##name##_t *itr) \
|
346 | 349 | { \
|
347 |
| - if (itr->p < itr->stack) return 0; \ |
| 350 | + if (itr->p == NULL) return 0; \ |
348 | 351 | for (;;) { \
|
349 | 352 | while (itr->p->x && itr->p->i >= 0) { \
|
350 | 353 | itr->p[1].x = itr->p->x->is_internal? __KB_PTR(b, itr->p->x)[itr->p->i] : 0; \
|
351 | 354 | itr->p[1].i = itr->p[1].x ? itr->p[1].x->n : -1; \
|
352 | 355 | ++itr->p; \
|
353 | 356 | } \
|
| 357 | + if (itr->p == itr->stack) { \ |
| 358 | + itr->p = NULL; \ |
| 359 | + return 0; \ |
| 360 | + } \ |
354 | 361 | --itr->p; \
|
355 |
| - if (itr->p < itr->stack) return 0; \ |
356 | 362 | --itr->p->i; \
|
357 | 363 | if (itr->p->x && itr->p->i >= 0) return 1; \
|
358 | 364 | } \
|
|
374 | 380 | itr->p[1].x = itr->p->x->is_internal? __KB_PTR(b, itr->p->x)[i + 1] : 0; \
|
375 | 381 | ++itr->p; \
|
376 | 382 | } \
|
| 383 | + itr->p->i = 0; \ |
377 | 384 | return 0; \
|
378 | 385 | } \
|
379 | 386 | static inline int kb_itr_get_##name(kbtree_##name##_t *b, key_t k, kbitr_##name##_t *itr) \
|
|
0 commit comments