btree-type.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #define __BTREE_TP(pfx, type, sfx) pfx ## type ## sfx
  3. #define _BTREE_TP(pfx, type, sfx) __BTREE_TP(pfx, type, sfx)
  4. #define BTREE_TP(pfx) _BTREE_TP(pfx, BTREE_TYPE_SUFFIX,)
  5. #define BTREE_FN(name) BTREE_TP(btree_ ## name)
  6. #define BTREE_TYPE_HEAD BTREE_TP(struct btree_head)
  7. #define VISITOR_FN BTREE_TP(visitor)
  8. #define VISITOR_FN_T _BTREE_TP(visitor, BTREE_TYPE_SUFFIX, _t)
  9. BTREE_TYPE_HEAD {
  10. struct btree_head h;
  11. };
  12. static inline void BTREE_FN(init_mempool)(BTREE_TYPE_HEAD *head,
  13. mempool_t *mempool)
  14. {
  15. btree_init_mempool(&head->h, mempool);
  16. }
  17. static inline int BTREE_FN(init)(BTREE_TYPE_HEAD *head)
  18. {
  19. return btree_init(&head->h);
  20. }
  21. static inline void BTREE_FN(destroy)(BTREE_TYPE_HEAD *head)
  22. {
  23. btree_destroy(&head->h);
  24. }
  25. static inline int BTREE_FN(merge)(BTREE_TYPE_HEAD *target,
  26. BTREE_TYPE_HEAD *victim,
  27. gfp_t gfp)
  28. {
  29. return btree_merge(&target->h, &victim->h, BTREE_TYPE_GEO, gfp);
  30. }
  31. #if (BITS_PER_LONG > BTREE_TYPE_BITS)
  32. static inline void *BTREE_FN(lookup)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key)
  33. {
  34. unsigned long _key = key;
  35. return btree_lookup(&head->h, BTREE_TYPE_GEO, &_key);
  36. }
  37. static inline int BTREE_FN(insert)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key,
  38. void *val, gfp_t gfp)
  39. {
  40. unsigned long _key = key;
  41. return btree_insert(&head->h, BTREE_TYPE_GEO, &_key, val, gfp);
  42. }
  43. static inline int BTREE_FN(update)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key,
  44. void *val)
  45. {
  46. unsigned long _key = key;
  47. return btree_update(&head->h, BTREE_TYPE_GEO, &_key, val);
  48. }
  49. static inline void *BTREE_FN(remove)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key)
  50. {
  51. unsigned long _key = key;
  52. return btree_remove(&head->h, BTREE_TYPE_GEO, &_key);
  53. }
  54. static inline void *BTREE_FN(last)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE *key)
  55. {
  56. unsigned long _key;
  57. void *val = btree_last(&head->h, BTREE_TYPE_GEO, &_key);
  58. if (val)
  59. *key = _key;
  60. return val;
  61. }
  62. static inline void *BTREE_FN(get_prev)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE *key)
  63. {
  64. unsigned long _key = *key;
  65. void *val = btree_get_prev(&head->h, BTREE_TYPE_GEO, &_key);
  66. if (val)
  67. *key = _key;
  68. return val;
  69. }
  70. #else
  71. static inline void *BTREE_FN(lookup)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key)
  72. {
  73. return btree_lookup(&head->h, BTREE_TYPE_GEO, (unsigned long *)&key);
  74. }
  75. static inline int BTREE_FN(insert)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key,
  76. void *val, gfp_t gfp)
  77. {
  78. return btree_insert(&head->h, BTREE_TYPE_GEO, (unsigned long *)&key,
  79. val, gfp);
  80. }
  81. static inline int BTREE_FN(update)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key,
  82. void *val)
  83. {
  84. return btree_update(&head->h, BTREE_TYPE_GEO, (unsigned long *)&key, val);
  85. }
  86. static inline void *BTREE_FN(remove)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key)
  87. {
  88. return btree_remove(&head->h, BTREE_TYPE_GEO, (unsigned long *)&key);
  89. }
  90. static inline void *BTREE_FN(last)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE *key)
  91. {
  92. return btree_last(&head->h, BTREE_TYPE_GEO, (unsigned long *)key);
  93. }
  94. static inline void *BTREE_FN(get_prev)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE *key)
  95. {
  96. return btree_get_prev(&head->h, BTREE_TYPE_GEO, (unsigned long *)key);
  97. }
  98. #endif
  99. void VISITOR_FN(void *elem, unsigned long opaque, unsigned long *key,
  100. size_t index, void *__func);
  101. typedef void (*VISITOR_FN_T)(void *elem, unsigned long opaque,
  102. BTREE_KEYTYPE key, size_t index);
  103. static inline size_t BTREE_FN(visitor)(BTREE_TYPE_HEAD *head,
  104. unsigned long opaque,
  105. VISITOR_FN_T func2)
  106. {
  107. return btree_visitor(&head->h, BTREE_TYPE_GEO, opaque,
  108. visitorl, func2);
  109. }
  110. static inline size_t BTREE_FN(grim_visitor)(BTREE_TYPE_HEAD *head,
  111. unsigned long opaque,
  112. VISITOR_FN_T func2)
  113. {
  114. return btree_grim_visitor(&head->h, BTREE_TYPE_GEO, opaque,
  115. visitorl, func2);
  116. }
  117. #undef VISITOR_FN
  118. #undef VISITOR_FN_T
  119. #undef __BTREE_TP
  120. #undef _BTREE_TP
  121. #undef BTREE_TP
  122. #undef BTREE_FN
  123. #undef BTREE_TYPE_HEAD
  124. #undef BTREE_TYPE_SUFFIX
  125. #undef BTREE_TYPE_GEO
  126. #undef BTREE_KEYTYPE
  127. #undef BTREE_TYPE_BITS