PageRenderTime 20ms CodeModel.GetById 15ms app.highlight 4ms RepoModel.GetById 0ms app.codeStats 0ms

/include/skiplist.h

http://github.com/fmela/libdict
C Header | 89 lines | 46 code | 12 blank | 31 comment | 0 complexity | dc56f79c4fc9e9d21a4c0848e4e7ee53 MD5 | raw file
Possible License(s): BSD-2-Clause
 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
28#ifndef LIBDICT_SKIPLIST_H__
29#define LIBDICT_SKIPLIST_H__
30
31#include "dict.h"
32
33BEGIN_DECL
34
35typedef struct skiplist skiplist;
36
37skiplist*	skiplist_new(dict_compare_func cmp_func, unsigned max_link);
38dict*		skiplist_dict_new(dict_compare_func cmp_func, unsigned max_link);
39size_t		skiplist_free(skiplist* list, dict_delete_func delete_func);
40
41dict_insert_result
42		skiplist_insert(skiplist* list, void* key);
43void**		skiplist_search(skiplist* list, const void* key);
44void**		skiplist_search_le(skiplist* list, const void* key);
45void**		skiplist_search_lt(skiplist* list, const void* key);
46void**		skiplist_search_ge(skiplist* list, const void* key);
47void**		skiplist_search_gt(skiplist* list, const void* key);
48dict_remove_result
49		skiplist_remove(skiplist* list, const void* key);
50size_t		skiplist_clear(skiplist* list, dict_delete_func delete_func);
51size_t		skiplist_traverse(skiplist* list, dict_visit_func visit, void* user_data);
52size_t		skiplist_count(const skiplist* list);
53bool		skiplist_verify(const skiplist* list);
54
55/* Compute the histogram of link counts of the skiplist.
56 * For 0 < x < |ncounts|, |counts|[x] will be set to the number of nodes with x
57 * links, and the maximal link count will be returned. If the return value is
58 * greater than or equal to |ncounts|, not all link counts could be stored in
59 * |counts| (i.e. the array was not large enough). */
60size_t		skiplist_link_count_histogram(const skiplist* list,
61					      size_t counts[], size_t ncounts);
62
63typedef struct skiplist_itor skiplist_itor;
64
65skiplist_itor*	skiplist_itor_new(skiplist* list);
66dict_itor*	skiplist_dict_itor_new(skiplist* list);
67void		skiplist_itor_free(skiplist_itor* );
68
69bool		skiplist_itor_valid(const skiplist_itor* itor);
70void		skiplist_itor_invalidate(skiplist_itor* itor);
71bool		skiplist_itor_next(skiplist_itor* itor);
72bool		skiplist_itor_prev(skiplist_itor* itor);
73bool		skiplist_itor_nextn(skiplist_itor* itor, size_t count);
74bool		skiplist_itor_prevn(skiplist_itor* itor, size_t count);
75bool		skiplist_itor_first(skiplist_itor* itor);
76bool		skiplist_itor_last(skiplist_itor* itor);
77bool		skiplist_itor_search(skiplist_itor* itor, const void* key);
78bool		skiplist_itor_search_le(skiplist_itor* itor, const void* key);
79bool		skiplist_itor_search_lt(skiplist_itor* itor, const void* key);
80bool		skiplist_itor_search_ge(skiplist_itor* itor, const void* key);
81bool		skiplist_itor_search_gt(skiplist_itor* itor, const void* key);
82const void*	skiplist_itor_key(const skiplist_itor* itor);
83void**		skiplist_itor_datum(skiplist_itor* itor);
84int             skiplist_itor_compare(const skiplist_itor* it1, const skiplist_itor* it2);
85bool		skiplist_itor_remove(skiplist_itor* itor);
86
87END_DECL
88
89#endif /* !LIBDICT_SKIPLIST_H__ */