/include/skiplist.h

http://github.com/fmela/libdict · C Header · 89 lines · 46 code · 12 blank · 31 comment · 0 complexity · dc56f79c4fc9e9d21a4c0848e4e7ee53 MD5 · raw file

  1. /*
  2. * libdict -- skiplist interface.
  3. *
  4. * Copyright (c) 2001-2014, Farooq Mela
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. *
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  17. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
  20. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  25. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #ifndef LIBDICT_SKIPLIST_H__
  28. #define LIBDICT_SKIPLIST_H__
  29. #include "dict.h"
  30. BEGIN_DECL
  31. typedef struct skiplist skiplist;
  32. skiplist* skiplist_new(dict_compare_func cmp_func, unsigned max_link);
  33. dict* skiplist_dict_new(dict_compare_func cmp_func, unsigned max_link);
  34. size_t skiplist_free(skiplist* list, dict_delete_func delete_func);
  35. dict_insert_result
  36. skiplist_insert(skiplist* list, void* key);
  37. void** skiplist_search(skiplist* list, const void* key);
  38. void** skiplist_search_le(skiplist* list, const void* key);
  39. void** skiplist_search_lt(skiplist* list, const void* key);
  40. void** skiplist_search_ge(skiplist* list, const void* key);
  41. void** skiplist_search_gt(skiplist* list, const void* key);
  42. dict_remove_result
  43. skiplist_remove(skiplist* list, const void* key);
  44. size_t skiplist_clear(skiplist* list, dict_delete_func delete_func);
  45. size_t skiplist_traverse(skiplist* list, dict_visit_func visit, void* user_data);
  46. size_t skiplist_count(const skiplist* list);
  47. bool skiplist_verify(const skiplist* list);
  48. /* Compute the histogram of link counts of the skiplist.
  49. * For 0 < x < |ncounts|, |counts|[x] will be set to the number of nodes with x
  50. * links, and the maximal link count will be returned. If the return value is
  51. * greater than or equal to |ncounts|, not all link counts could be stored in
  52. * |counts| (i.e. the array was not large enough). */
  53. size_t skiplist_link_count_histogram(const skiplist* list,
  54. size_t counts[], size_t ncounts);
  55. typedef struct skiplist_itor skiplist_itor;
  56. skiplist_itor* skiplist_itor_new(skiplist* list);
  57. dict_itor* skiplist_dict_itor_new(skiplist* list);
  58. void skiplist_itor_free(skiplist_itor* );
  59. bool skiplist_itor_valid(const skiplist_itor* itor);
  60. void skiplist_itor_invalidate(skiplist_itor* itor);
  61. bool skiplist_itor_next(skiplist_itor* itor);
  62. bool skiplist_itor_prev(skiplist_itor* itor);
  63. bool skiplist_itor_nextn(skiplist_itor* itor, size_t count);
  64. bool skiplist_itor_prevn(skiplist_itor* itor, size_t count);
  65. bool skiplist_itor_first(skiplist_itor* itor);
  66. bool skiplist_itor_last(skiplist_itor* itor);
  67. bool skiplist_itor_search(skiplist_itor* itor, const void* key);
  68. bool skiplist_itor_search_le(skiplist_itor* itor, const void* key);
  69. bool skiplist_itor_search_lt(skiplist_itor* itor, const void* key);
  70. bool skiplist_itor_search_ge(skiplist_itor* itor, const void* key);
  71. bool skiplist_itor_search_gt(skiplist_itor* itor, const void* key);
  72. const void* skiplist_itor_key(const skiplist_itor* itor);
  73. void** skiplist_itor_datum(skiplist_itor* itor);
  74. int skiplist_itor_compare(const skiplist_itor* it1, const skiplist_itor* it2);
  75. bool skiplist_itor_remove(skiplist_itor* itor);
  76. END_DECL
  77. #endif /* !LIBDICT_SKIPLIST_H__ */