skiplist add function find_ge

pull/37/head
YuQing 2020-04-10 10:19:53 +08:00
parent 01b1841fda
commit 4e53bd3e2d
7 changed files with 43 additions and 1 deletions

View File

@ -364,6 +364,16 @@ int flat_skiplist_find_all(FlatSkiplist *sl, void *data, FlatSkiplistIterator *i
return 0; return 0;
} }
void *flat_skiplist_find_ge(FlatSkiplist *sl, void *data)
{
FlatSkiplistNode *node;
node = flat_skiplist_get_first_larger_or_equal(sl, data);
if (node == sl->top) {
return NULL;
}
return node->data;
}
int flat_skiplist_find_range(FlatSkiplist *sl, void *start_data, void *end_data, int flat_skiplist_find_range(FlatSkiplist *sl, void *start_data, void *end_data,
FlatSkiplistIterator *iterator) FlatSkiplistIterator *iterator)
{ {

View File

@ -64,6 +64,7 @@ void *flat_skiplist_find(FlatSkiplist *sl, void *data);
int flat_skiplist_find_all(FlatSkiplist *sl, void *data, FlatSkiplistIterator *iterator); int flat_skiplist_find_all(FlatSkiplist *sl, void *data, FlatSkiplistIterator *iterator);
int flat_skiplist_find_range(FlatSkiplist *sl, void *start_data, void *end_data, int flat_skiplist_find_range(FlatSkiplist *sl, void *start_data, void *end_data,
FlatSkiplistIterator *iterator); FlatSkiplistIterator *iterator);
void *flat_skiplist_find_ge(FlatSkiplist *sl, void *data);
static inline void flat_skiplist_iterator(FlatSkiplist *sl, FlatSkiplistIterator *iterator) static inline void flat_skiplist_iterator(FlatSkiplist *sl, FlatSkiplistIterator *iterator)
{ {

View File

@ -406,6 +406,16 @@ int multi_skiplist_find_all(MultiSkiplist *sl, void *data,
} }
} }
void *multi_skiplist_find_ge(MultiSkiplist *sl, void *data)
{
MultiSkiplistNode *node;
node = multi_skiplist_get_first_larger_or_equal(sl, data);
if (node == sl->tail) {
return NULL;
}
return node->head->data;
}
int multi_skiplist_find_range(MultiSkiplist *sl, void *start_data, void *end_data, int multi_skiplist_find_range(MultiSkiplist *sl, void *start_data, void *end_data,
MultiSkiplistIterator *iterator) MultiSkiplistIterator *iterator)
{ {

View File

@ -75,6 +75,7 @@ int multi_skiplist_find_all(MultiSkiplist *sl, void *data,
MultiSkiplistIterator *iterator); MultiSkiplistIterator *iterator);
int multi_skiplist_find_range(MultiSkiplist *sl, void *start_data, void *end_data, int multi_skiplist_find_range(MultiSkiplist *sl, void *start_data, void *end_data,
MultiSkiplistIterator *iterator); MultiSkiplistIterator *iterator);
void *multi_skiplist_find_ge(MultiSkiplist *sl, void *data);
static inline void multi_skiplist_iterator(MultiSkiplist *sl, static inline void multi_skiplist_iterator(MultiSkiplist *sl,
MultiSkiplistIterator *iterator) MultiSkiplistIterator *iterator)

View File

@ -83,6 +83,13 @@ typedef struct
FCServerInfo *servers; FCServerInfo *servers;
} FCServerInfoArray; } FCServerInfoArray;
typedef struct
{
int alloc;
int count;
FCServerInfo **servers;
} FCServerInfoPtrArray;
typedef struct typedef struct
{ {
int count; int count;

View File

@ -482,6 +482,17 @@ int uniq_skiplist_find_all(UniqSkiplist *sl, void *data,
return 0; return 0;
} }
void *uniq_skiplist_find_ge(UniqSkiplist *sl, void *data)
{
UniqSkiplistNode *node;
node = uniq_skiplist_get_first_larger_or_equal(sl, data);
if (node == sl->factory->tail) {
return NULL;
}
return node->data;
}
int uniq_skiplist_find_range(UniqSkiplist *sl, void *start_data, int uniq_skiplist_find_range(UniqSkiplist *sl, void *start_data,
void *end_data, UniqSkiplistIterator *iterator) void *end_data, UniqSkiplistIterator *iterator)
{ {

View File

@ -81,8 +81,10 @@ int uniq_skiplist_find_all(UniqSkiplist *sl, void *data,
UniqSkiplistIterator *iterator); UniqSkiplistIterator *iterator);
int uniq_skiplist_find_range(UniqSkiplist *sl, void *start_data, int uniq_skiplist_find_range(UniqSkiplist *sl, void *start_data,
void *end_data, UniqSkiplistIterator *iterator); void *end_data, UniqSkiplistIterator *iterator);
void *uniq_skiplist_find_ge(UniqSkiplist *sl, void *data);
static inline void uniq_skiplist_iterator(UniqSkiplist *sl, UniqSkiplistIterator *iterator) static inline void uniq_skiplist_iterator(UniqSkiplist *sl,
UniqSkiplistIterator *iterator)
{ {
iterator->current = sl->top->links[0]; iterator->current = sl->top->links[0];
iterator->tail = sl->factory->tail; iterator->tail = sl->factory->tail;