cb_skiplist.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * SPDX-License-Identifier: Apache-2.0
  3. *
  4. * Change Logs:
  5. * Date Author Notes
  6. * 2023-06-05 tyx first implementation
  7. */
  8. #ifndef CB_SKIPLIST_H_
  9. #define CB_SKIPLIST_H_
  10. #include "cb_list.h"
  11. #ifdef __cplusplus
  12. extern "C" {
  13. #endif
  14. #define CB_SKIPLIST_MAX_LEVEL (3U)
  15. typedef struct cb_skiplist_node
  16. {
  17. cb_list_t row[CB_SKIPLIST_MAX_LEVEL];
  18. }cb_skiplist_node_t;
  19. struct cb_skiplist;
  20. typedef struct cb_skiplist cb_skiplist_t;
  21. struct cb_skiplist
  22. {
  23. cb_skiplist_node_t head;
  24. int reverse;
  25. int (*cmp)(const cb_skiplist_node_t* v1, const cb_skiplist_node_t* v2);
  26. };
  27. typedef struct cb_skiplist_iterator
  28. {
  29. cb_skiplist_t *skiplist;
  30. int level;
  31. cb_list_t* list[CB_SKIPLIST_MAX_LEVEL];
  32. cb_list_t* next;
  33. }cb_skiplist_iter;
  34. cb_inline int cb_skiplist_iter_skip(cb_skiplist_iter *iter)
  35. {
  36. if (iter->level > 0)
  37. {
  38. iter->next = iter->list[iter->level] - 1;
  39. }
  40. if (iter->level >= 0)
  41. {
  42. iter->level -= 1;
  43. }
  44. return iter->level;
  45. }
  46. cb_inline cb_skiplist_iter *cb_skiplist_iter_begin(cb_skiplist_iter *iter, cb_skiplist_t* skiplist)
  47. {
  48. iter->skiplist = skiplist;
  49. iter->level = CB_SKIPLIST_MAX_LEVEL - 1;
  50. //iter->list[iter->level] = &skiplist->head.row[iter->level];
  51. iter->next = &skiplist->head.row[iter->level];
  52. return iter;
  53. }
  54. cb_skiplist_node_t *cb_skiplist_iter_next(cb_skiplist_iter *iter);
  55. cb_skiplist_t *cb_skiplist_init(cb_skiplist_t *skiplist, int reverse,
  56. int (*cmp)(const cb_skiplist_node_t *v1, const cb_skiplist_node_t *v2));
  57. cb_skiplist_node_t *cb_skiplist_node_init(cb_skiplist_node_t *item);
  58. cb_skiplist_node_t *cb_skiplist_insert(cb_skiplist_t* skiplist, cb_skiplist_node_t* item);
  59. cb_skiplist_node_t *cb_skiplist_remove(cb_skiplist_node_t* item);
  60. cb_skiplist_node_t *cb_skiplist_first(cb_skiplist_t *skiplist);
  61. int cb_skiplist_isempty(cb_skiplist_t *skiplist);
  62. cb_inline cb_skiplist_node_t* cb_skiplist_of(cb_list_t* next, unsigned int lvl)
  63. {
  64. cb_list_t* l = cb_container_of(next, cb_list_t, next);
  65. return (cb_skiplist_node_t*)cb_container_of(l, cb_skiplist_node_t, row[lvl]);
  66. }
  67. cb_inline cb_skiplist_node_t* cb_skiplist_next(cb_skiplist_node_t* item)
  68. {
  69. return (cb_skiplist_node_t*)cb_skiplist_of(item->row[0].next, 0);
  70. }
  71. #define cb_skiplist_for_each(pos, skiplist) \
  72. for (cb_skiplist_node_t* pos = cb_skiplist_next(&(skiplist)->head), \
  73. *nn = cb_skiplist_next(pos); pos != &((skiplist)->head); pos = nn, nn = cb_skiplist_next(nn))
  74. #ifdef __cplusplus
  75. }
  76. #endif
  77. #endif