btree-type.h 3.9 KB

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