cf_skiplist.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. #include <stdlib.h>
  2. #include <assert.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "cf_skiplist.h"
  6. static uint32_t wb_skip_depth()
  7. {
  8. uint32_t d;
  9. for(d = 1; d < SKIPLIST_MAXDEPTH; d++){
  10. if((rand() & 0xffff) > 0x4000)
  11. break;
  12. }
  13. return d;
  14. }
  15. static int skiplist_compare(skiplist_item_t k1, skiplist_item_t k2)
  16. {
  17. return memcmp(&k1, &k2, sizeof(skiplist_item_t));
  18. }
  19. skiplist_t* skiplist_create(skiplist_compare_f compare_cb, skiplist_free_f free_cb, void* args)
  20. {
  21. skiplist_t* sl = (skiplist_t *)calloc(1, sizeof(skiplist_t));
  22. sl->compare_fun = compare_cb;
  23. if (sl->compare_fun == NULL)
  24. sl->compare_fun = skiplist_compare;
  25. sl->free_fun = free_cb;
  26. sl->args = args;
  27. return sl;
  28. }
  29. void skiplist_clear(skiplist_t* sl)
  30. {
  31. skiplist_iter_t* iter, *next;
  32. int i;
  33. for(iter = sl->entries[0]; iter != NULL; iter = next){
  34. next = iter->next[0];
  35. if(sl->free_fun != NULL)
  36. sl->free_fun(iter->key, iter->val, sl->args);
  37. free(iter);
  38. }
  39. for(i = 0; i < SKIPLIST_MAXDEPTH; ++i)
  40. sl->entries[i] = 0;
  41. sl->size = 0;
  42. }
  43. void skiplist_destroy(skiplist_t* sl)
  44. {
  45. assert(sl != NULL);
  46. if(sl == NULL)
  47. return ;
  48. skiplist_clear(sl);
  49. free(sl);
  50. }
  51. /*search skiplist*/
  52. static int skiplist_insert_stack(skiplist_t* sl, skiplist_iter_t*** stack, skiplist_item_t key)
  53. {
  54. int i, cmp;
  55. skiplist_iter_t** iterp, *iter;
  56. for(i = SKIPLIST_MAXDEPTH - 1, iterp = &sl->entries[i]; i >= 0;){
  57. iter = *iterp;
  58. if(iter == NULL){ /*empty level, dropdown a level*/
  59. stack[i--] = iterp --;
  60. continue;
  61. }
  62. /*compare key!!*/
  63. cmp = sl->compare_fun(iter->key, key);
  64. if(cmp > 0) /*fix pos, dropdown a level*/
  65. stack[i--] = iterp--;
  66. else if(cmp == 0) /*repeat!!*/
  67. return -1;
  68. else
  69. iterp = &(iter->next[i]);
  70. }
  71. return 0;
  72. }
  73. void skiplist_insert(skiplist_t* sl, skiplist_item_t key, skiplist_item_t val)
  74. {
  75. skiplist_iter_t* iter, **stack[SKIPLIST_MAXDEPTH];
  76. uint32_t i, depth;
  77. if(skiplist_insert_stack(sl, stack, key) != 0){
  78. if (sl->free_fun != NULL)
  79. sl->free_fun(key, val, sl->args);
  80. }
  81. else{
  82. i = 0;
  83. depth = wb_skip_depth();
  84. iter = (skiplist_iter_t*)calloc(1, sizeof(skiplist_iter_t) + depth * sizeof(skiplist_iter_t*));
  85. iter->key = key;
  86. iter->val = val;
  87. iter->depth = depth;
  88. for(i = 0; i < depth; ++i){
  89. iter->next[i] = *stack[i];
  90. *stack[i] = iter;
  91. }
  92. ++sl->size;
  93. }
  94. }
  95. static skiplist_iter_t* skip_remove_stack(skiplist_t* sl, skiplist_iter_t*** stack, skiplist_item_t key)
  96. {
  97. int i, cmp;
  98. skiplist_iter_t** iterp, *ret, *iter;
  99. ret = NULL;
  100. for(i = SKIPLIST_MAXDEPTH - 1, iterp = &sl->entries[i]; i >= 0;){
  101. iter = *iterp;
  102. if(iter == NULL){ /*empty level, dropdown a level*/
  103. stack[i--] = iterp --;
  104. continue;
  105. }
  106. /*compare key!!*/
  107. cmp = sl->compare_fun(iter->key, key);
  108. if(cmp == 0){
  109. ret = iter;
  110. if(i > 0)
  111. stack[i--] = iterp --;
  112. else{
  113. stack[i] = iterp;
  114. break;
  115. }
  116. }
  117. else if(cmp < 0)
  118. iterp = &iter->next[i];
  119. else /*nonexistent key*/
  120. if(i > 0)
  121. stack[i--] = iterp --;
  122. else
  123. break;
  124. }
  125. return ret;
  126. }
  127. skiplist_iter_t* skiplist_remove(skiplist_t* sl, skiplist_item_t key)
  128. {
  129. skiplist_iter_t **stack[SKIPLIST_MAXDEPTH], *iter, *ret;
  130. int i;
  131. iter = skip_remove_stack(sl, stack, key);
  132. if (iter != NULL){
  133. for (i = 0; i < iter->depth; ++i)
  134. *stack[i] = iter->next[i];
  135. if (sl->free_fun != NULL)
  136. sl->free_fun(iter->key, iter->val, sl->args);
  137. free(iter);
  138. if (sl->size > 0)
  139. --sl->size;
  140. ret = *stack[0];
  141. }
  142. else
  143. ret = NULL;
  144. return ret;
  145. }
  146. static skiplist_iter_t* skiplist_search_iter(skiplist_t* sl, skiplist_item_t key)
  147. {
  148. int i, cmp;
  149. skiplist_iter_t** iterp;
  150. skiplist_iter_t* iter;
  151. for (i = SKIPLIST_MAXDEPTH - 1, iterp = &sl->entries[i]; i >= 0;){
  152. iter = *iterp;
  153. if (iter == NULL){
  154. --i;
  155. --iterp;
  156. continue;
  157. }
  158. /*compare key!!*/
  159. cmp = sl->compare_fun(iter->key, key);
  160. if(cmp == 0)
  161. return iter;
  162. else if(cmp > 0){
  163. --i;
  164. --iterp;
  165. }
  166. else{
  167. iterp = &iter->next[i];
  168. }
  169. }
  170. return NULL;
  171. }
  172. skiplist_iter_t* skiplist_search(skiplist_t* sl, skiplist_item_t key)
  173. {
  174. return skiplist_search_iter(sl, key);
  175. }
  176. skiplist_iter_t* skiplist_first(skiplist_t* sl) {
  177. return sl->entries[0];
  178. }
  179. size_t skiplist_size(skiplist_t* sl)
  180. {
  181. return sl->size;
  182. }
  183. int idu64_compare(skiplist_item_t k1, skiplist_item_t k2)
  184. {
  185. if (k1.u64 > k2.u64)
  186. return 1;
  187. else if (k1.u64 < k2.u64)
  188. return -1;
  189. else
  190. return 0;
  191. }
  192. int idu32_compare(skiplist_item_t k1, skiplist_item_t k2)
  193. {
  194. if (k1.u32 > k2.u32)
  195. return 1;
  196. else if (k1.u32 < k2.u32)
  197. return -1;
  198. else
  199. return 0;
  200. }
  201. int idu16_compare(skiplist_item_t k1, skiplist_item_t k2)
  202. {
  203. if (k1.u16 > k2.u16)
  204. return 1;
  205. else if (k1.u16 < k2.u16)
  206. return -1;
  207. else
  208. return 0;
  209. }
  210. int idu8_compare(skiplist_item_t k1, skiplist_item_t k2)
  211. {
  212. if (k1.u8 > k2.u8)
  213. return 1;
  214. else if (k1.u8 < k2.u8)
  215. return -1;
  216. else
  217. return 0;
  218. }
  219. int id64_compare(skiplist_item_t k1, skiplist_item_t k2)
  220. {
  221. if (k1.i64 > k2.i64)
  222. return 1;
  223. else if (k1.i64 < k2.i64)
  224. return -1;
  225. else
  226. return 0;
  227. }
  228. int id32_compare(skiplist_item_t k1, skiplist_item_t k2)
  229. {
  230. if (k1.i32 > k2.i32)
  231. return 1;
  232. else if (k1.i32 < k2.i32)
  233. return -1;
  234. else
  235. return 0;
  236. }
  237. int id16_compare(skiplist_item_t k1, skiplist_item_t k2)
  238. {
  239. if (k1.i16 > k2.i16)
  240. return 1;
  241. else if (k1.i16 < k2.i16)
  242. return -1;
  243. else
  244. return 0;
  245. }
  246. int id8_compare(skiplist_item_t k1, skiplist_item_t k2)
  247. {
  248. if (k1.i8 > k2.i8)
  249. return 1;
  250. else if (k1.i8 < k2.i8)
  251. return -1;
  252. else
  253. return 0;
  254. }