cctools
skip_list.h
Go to the documentation of this file.
1 /* Copyright (C) 2022 The University of Notre Dame
2 This software is distributed under the GNU General Public License.
3 See the file COPYING for details.
4 */
5 
6 #ifndef SKIP_LIST_H
7 #define SKIP_LIST_H
8 
9 #include <stdint.h>
10 #include <stdbool.h>
11 
54 struct skip_list;
55 struct skip_list_cursor;
56 
64 struct skip_list *skip_list_create(unsigned priority_size, double probability);
65 
73 bool skip_list_delete(struct skip_list *sl);
74 
79 int skip_list_size(struct skip_list *sl);
80 
85 const double *skip_list_peek_head_priority(struct skip_list *sl);
86 
91 const void *skip_list_peek_head(struct skip_list *sl);
92 
97 void *skip_list_pop_head(struct skip_list *sl);
98 
103 struct skip_list_cursor *skip_list_cursor_create(struct skip_list *sl);
104 
108 void skip_list_cursor_delete(struct skip_list_cursor *cur);
109 
114 struct skip_list_cursor *skip_list_cursor_clone(struct skip_list_cursor *cur);
115 
121 void skip_list_cursor_move(struct skip_list_cursor *to_move, struct skip_list_cursor *destination);
122 
126 void skip_list_reset(struct skip_list_cursor *cur);
127 
134 bool skip_list_seek(struct skip_list_cursor *cur, int index);
135 
142 bool skip_list_tell(struct skip_list_cursor *cur, unsigned *index);
143 
149 bool skip_list_next(struct skip_list_cursor *cur);
150 
156 bool skip_list_prev(struct skip_list_cursor *cur);
157 
166 bool skip_list_cursor_move_to_priority_arr(struct skip_list_cursor *cur, double *priority);
167 
176 #define skip_list_cursor_move_to_priority(cur, ...) \
177  skip_list_cursor_move_to_priority_arr(cur, (double[]){__VA_ARGS__})
178 
185 bool skip_list_get(struct skip_list_cursor *cur, void **item);
186 
191 const double *skip_list_get_priority(struct skip_list_cursor *cur);
192 
199 bool skip_list_set(struct skip_list_cursor *cur, void *item);
200 
206 bool skip_list_remove_here(struct skip_list_cursor *cur);
207 
214 bool skip_list_remove(struct skip_list *sl, void *data);
215 
223 bool skip_list_remove_by_priority_arr(struct skip_list *sl, double *priority);
224 
232 #define skip_list_remove_by_priority(sl, ...) \
233  skip_list_remove_by_priority_arr(sl, (double[]){__VA_ARGS__})
234 
242 void skip_list_insert_arr(struct skip_list *lst, void *item, double *priority);
243 
258 #define skip_list_insert(lst, item, ...) \
259  skip_list_insert_arr(lst, item, (double[]){__VA_ARGS__})
260 
261 
296 #define SKIP_LIST_ITERATE(cursor, item) \
297  for(; skip_list_get(cursor, (void **)&item); skip_list_next(cursor))
298 
299 #endif
skip_list_get_priority
const double * skip_list_get_priority(struct skip_list_cursor *cur)
Get the priority tuple of the item under a cursor.
skip_list_next
bool skip_list_next(struct skip_list_cursor *cur)
Move a cursor to the next item.
skip_list_reset
void skip_list_reset(struct skip_list_cursor *cur)
Reset the position of a cursor.
skip_list_prev
bool skip_list_prev(struct skip_list_cursor *cur)
Move a cursor to the previous item.
skip_list_cursor_move
void skip_list_cursor_move(struct skip_list_cursor *to_move, struct skip_list_cursor *destination)
Move a cursor's position to match another cursor.
skip_list_cursor_create
struct skip_list_cursor * skip_list_cursor_create(struct skip_list *sl)
Create a cursor for traversing a skip list.
skip_list_cursor_move_to_priority_arr
bool skip_list_cursor_move_to_priority_arr(struct skip_list_cursor *cur, double *priority)
Move a cursor to the first item with the given priority tuple (internal function).
skip_list_set
bool skip_list_set(struct skip_list_cursor *cur, void *item)
Set the value under the cursor.
skip_list_size
int skip_list_size(struct skip_list *sl)
Get the number of items in a skip list.
skip_list_pop_head
void * skip_list_pop_head(struct skip_list *sl)
Remove and return the first item in the skip list.
skip_list_get
bool skip_list_get(struct skip_list_cursor *cur, void **item)
Get the item under a cursor.
skip_list_peek_head
const void * skip_list_peek_head(struct skip_list *sl)
Get the first item in the skip list without removing it.
skip_list_remove
bool skip_list_remove(struct skip_list *sl, void *data)
Remove the first node found with the given data pointer.
skip_list_remove_by_priority_arr
bool skip_list_remove_by_priority_arr(struct skip_list *sl, double *priority)
Remove the first node found with the given priority tuple.
skip_list_create
struct skip_list * skip_list_create(unsigned priority_size, double probability)
Create an empty skip list with priority-based sorting.
skip_list_delete
bool skip_list_delete(struct skip_list *sl)
Delete a skip list.
skip_list_insert_arr
void skip_list_insert_arr(struct skip_list *lst, void *item, double *priority)
Insert an item with priority into the skip list (internal function).
skip_list_cursor_clone
struct skip_list_cursor * skip_list_cursor_clone(struct skip_list_cursor *cur)
Get a copy of an existing cursor.
skip_list_tell
bool skip_list_tell(struct skip_list_cursor *cur, unsigned *index)
Get the position of a cursor within a skip list.
skip_list_cursor_delete
void skip_list_cursor_delete(struct skip_list_cursor *cur)
Delete a previously created cursor.
skip_list_seek
bool skip_list_seek(struct skip_list_cursor *cur, int index)
Move a cursor to an item by index.
skip_list_remove_here
bool skip_list_remove_here(struct skip_list_cursor *cur)
Remove the item under the cursor.
skip_list_peek_head_priority
const double * skip_list_peek_head_priority(struct skip_list *sl)
Get the priority tuple of the first item in the skip list.