diff --git a/src/flat_skiplist.c b/src/flat_skiplist.c index 6b7a307..1a83dc5 100644 --- a/src/flat_skiplist.c +++ b/src/flat_skiplist.c @@ -364,6 +364,16 @@ int flat_skiplist_find_all(FlatSkiplist *sl, void *data, FlatSkiplistIterator *i 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, FlatSkiplistIterator *iterator) { diff --git a/src/flat_skiplist.h b/src/flat_skiplist.h index 89421bb..4d0adc8 100644 --- a/src/flat_skiplist.h +++ b/src/flat_skiplist.h @@ -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_range(FlatSkiplist *sl, void *start_data, void *end_data, FlatSkiplistIterator *iterator); +void *flat_skiplist_find_ge(FlatSkiplist *sl, void *data); static inline void flat_skiplist_iterator(FlatSkiplist *sl, FlatSkiplistIterator *iterator) { diff --git a/src/multi_skiplist.c b/src/multi_skiplist.c index 1cae4ab..82aae6c 100644 --- a/src/multi_skiplist.c +++ b/src/multi_skiplist.c @@ -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, MultiSkiplistIterator *iterator) { diff --git a/src/multi_skiplist.h b/src/multi_skiplist.h index afc713d..3cf7acd 100644 --- a/src/multi_skiplist.h +++ b/src/multi_skiplist.h @@ -75,6 +75,7 @@ int multi_skiplist_find_all(MultiSkiplist *sl, void *data, MultiSkiplistIterator *iterator); int multi_skiplist_find_range(MultiSkiplist *sl, void *start_data, void *end_data, MultiSkiplistIterator *iterator); +void *multi_skiplist_find_ge(MultiSkiplist *sl, void *data); static inline void multi_skiplist_iterator(MultiSkiplist *sl, MultiSkiplistIterator *iterator) diff --git a/src/server_id_func.h b/src/server_id_func.h index 75e5dff..9ed9235 100644 --- a/src/server_id_func.h +++ b/src/server_id_func.h @@ -83,6 +83,13 @@ typedef struct FCServerInfo *servers; } FCServerInfoArray; +typedef struct +{ + int alloc; + int count; + FCServerInfo **servers; +} FCServerInfoPtrArray; + typedef struct { int count; diff --git a/src/uniq_skiplist.c b/src/uniq_skiplist.c index 885037c..a4d37e1 100644 --- a/src/uniq_skiplist.c +++ b/src/uniq_skiplist.c @@ -482,6 +482,17 @@ int uniq_skiplist_find_all(UniqSkiplist *sl, void *data, 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, void *end_data, UniqSkiplistIterator *iterator) { diff --git a/src/uniq_skiplist.h b/src/uniq_skiplist.h index a79ab10..b402f03 100644 --- a/src/uniq_skiplist.h +++ b/src/uniq_skiplist.h @@ -81,8 +81,10 @@ int uniq_skiplist_find_all(UniqSkiplist *sl, void *data, UniqSkiplistIterator *iterator); int uniq_skiplist_find_range(UniqSkiplist *sl, void *start_data, 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->tail = sl->factory->tail;