//
|
|
// Created by fox on 2017/10/10.
|
|
//
|
|
|
|
#ifndef NIF_SKIPLIST_SKIPLIST_H
|
|
#define NIF_SKIPLIST_SKIPLIST_H
|
|
|
|
#ifdef USENIF
|
|
#define imalloc enif_alloc
|
|
#define icalloc enif_alloc
|
|
#define irealloc enif_realloc
|
|
#define ifree enif_free
|
|
#else
|
|
#define imalloc malloc
|
|
#define icalloc(x) calloc(x, 1)
|
|
#define irealloc realloc
|
|
#define ifree free
|
|
#endif
|
|
|
|
typedef int vtype;
|
|
|
|
typedef struct snode {
|
|
int score;
|
|
int value;
|
|
struct skiplistLevel {
|
|
struct snode *forward;
|
|
unsigned int span;
|
|
} level[];
|
|
} snode;
|
|
|
|
typedef struct skiplist {
|
|
int level;
|
|
int size;
|
|
struct snode *header;
|
|
} skiplist;
|
|
|
|
typedef struct skiplist_search_ret {
|
|
int index; // start from 1
|
|
snode *node;
|
|
} skiplist_search_ret;
|
|
|
|
void test_skiplist(void);
|
|
|
|
// functions
|
|
skiplist *skiplist_init(void);
|
|
void skiplist_free(skiplist *list);
|
|
int skiplist_insert(skiplist *list, int score, vtype value);
|
|
int skiplist_update(skiplist *list, int score, vtype value, int old_score);
|
|
int skiplist_delete(skiplist *list, int score, vtype value);
|
|
void skiplist_search(skiplist *list, int score, skiplist_search_ret *ret);
|
|
int skiplist_index_of_score(skiplist *list, int score);
|
|
snode *skiplist_at(skiplist *list, int index);
|
|
|
|
|
|
#endif //NIF_SKIPLIST_SKIPLIST_H
|