1
0
Fork 0

Follow coding style guidelines a bit more. Add nrUsed count.

This commit is contained in:
Max Neunhoeffer 2013-11-18 16:46:56 +01:00
parent e3c0059211
commit c8b8af36b2
2 changed files with 42 additions and 36 deletions

View File

@ -45,7 +45,7 @@
/// @brief Select a node height randomly /// @brief Select a node height randomly
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static int TRI_random_height(void) static int TRI_random_height (void)
{ {
uint32_t r; uint32_t r;
int height = 1; int height = 1;
@ -65,8 +65,8 @@ static int TRI_random_height(void)
/// random height is taken. /// random height is taken.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static TRI_skiplist_node_t* TRI_SkipListAllocNode(TRI_skiplist_t* sl, static TRI_skiplist_node_t* TRI_SkipListAllocNode (TRI_skiplist_t* sl,
int height) { int height) {
TRI_skiplist_node_t* new; TRI_skiplist_node_t* new;
new = (TRI_skiplist_node_t*) malloc(sizeof(TRI_skiplist_node_t)); new = (TRI_skiplist_node_t*) malloc(sizeof(TRI_skiplist_node_t));
if (NULL == new) return new; if (NULL == new) return new;
@ -96,7 +96,7 @@ static TRI_skiplist_node_t* TRI_SkipListAllocNode(TRI_skiplist_t* sl,
/// @brief Free function for a node. /// @brief Free function for a node.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static void TRI_SkipListFreeNode(TRI_skiplist_node_t* node) { static void TRI_SkipListFreeNode (TRI_skiplist_node_t* node) {
TRI_Free(TRI_UNKNOWN_MEM_ZONE,node->next); TRI_Free(TRI_UNKNOWN_MEM_ZONE,node->next);
TRI_Free(TRI_UNKNOWN_MEM_ZONE,node); TRI_Free(TRI_UNKNOWN_MEM_ZONE,node);
} }
@ -117,11 +117,11 @@ static void TRI_SkipListFreeNode(TRI_skiplist_node_t* node) {
// lev. // lev.
// //
static int LookupLess(TRI_skiplist_t *sl, static int LookupLess (TRI_skiplist_t *sl,
void *doc, void *doc,
TRI_skiplist_node_t* (*pos)[TRI_SKIPLIST_MAX_HEIGHT], TRI_skiplist_node_t* (*pos)[TRI_SKIPLIST_MAX_HEIGHT],
TRI_skiplist_node_t** next, TRI_skiplist_node_t** next,
TRI_cmp_type_e cmptype) { TRI_cmp_type_e cmptype) {
int lev; int lev;
int cmp = 0; // just in case to avoid undefined values int cmp = 0; // just in case to avoid undefined values
TRI_skiplist_node_t *cur; TRI_skiplist_node_t *cur;
@ -160,11 +160,11 @@ static int LookupLess(TRI_skiplist_t *sl,
// that have height > lev. // that have height > lev.
// //
static int LookupLessOrEq(TRI_skiplist_t *sl, static int LookupLessOrEq (TRI_skiplist_t *sl,
void *doc, void *doc,
TRI_skiplist_node_t* (*pos)[TRI_SKIPLIST_MAX_HEIGHT], TRI_skiplist_node_t* (*pos)[TRI_SKIPLIST_MAX_HEIGHT],
TRI_skiplist_node_t** next, TRI_skiplist_node_t** next,
TRI_cmp_type_e cmptype) { TRI_cmp_type_e cmptype) {
int lev; int lev;
int cmp = 0; // just in case to avoid undefined values int cmp = 0; // just in case to avoid undefined values
TRI_skiplist_node_t *cur; TRI_skiplist_node_t *cur;
@ -211,9 +211,9 @@ static int LookupLessOrEq(TRI_skiplist_t *sl,
/// otherwise. /// otherwise.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_skiplist_t* TRI_InitSkipList(TRI_skiplist_compare_func_t cmpfunc, TRI_skiplist_t* TRI_InitSkipList (TRI_skiplist_compare_func_t cmpfunc,
TRI_skiplist_free_func_t freefunc, TRI_skiplist_free_func_t freefunc,
bool unique) { bool unique) {
TRI_skiplist_t* sl; TRI_skiplist_t* sl;
sl = (TRI_skiplist_t*) TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sl = (TRI_skiplist_t*) TRI_Allocate(TRI_UNKNOWN_MEM_ZONE,
@ -233,6 +233,7 @@ TRI_skiplist_t* TRI_InitSkipList(TRI_skiplist_compare_func_t cmpfunc,
sl->compare = cmpfunc; sl->compare = cmpfunc;
sl->free = freefunc; sl->free = freefunc;
sl->unique = unique; sl->unique = unique;
sl->nrUsed = 0;
return sl; return sl;
} }
@ -242,7 +243,7 @@ TRI_skiplist_t* TRI_InitSkipList(TRI_skiplist_compare_func_t cmpfunc,
/// @brief frees a skiplist and all its documents /// @brief frees a skiplist and all its documents
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void TRI_FreeSkipList(TRI_skiplist_t* sl) { void TRI_FreeSkipList (TRI_skiplist_t* sl) {
TRI_skiplist_node_t* p; TRI_skiplist_node_t* p;
TRI_skiplist_node_t* next; TRI_skiplist_node_t* next;
@ -264,7 +265,7 @@ void TRI_FreeSkipList(TRI_skiplist_t* sl) {
/// @brief return the start node /// @brief return the start node
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_skiplist_node_t* TRI_SkipListStartNode(TRI_skiplist_t* sl) { TRI_skiplist_node_t* TRI_SkipListStartNode (TRI_skiplist_t* sl) {
return sl->start; return sl->start;
} }
@ -272,7 +273,7 @@ TRI_skiplist_node_t* TRI_SkipListStartNode(TRI_skiplist_t* sl) {
/// @brief return the successor node or NULL if last node /// @brief return the successor node or NULL if last node
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_skiplist_node_t* TRI_SkipListNextNode(TRI_skiplist_node_t* node) { TRI_skiplist_node_t* TRI_SkipListNextNode (TRI_skiplist_node_t* node) {
return node->next[0]; return node->next[0];
} }
@ -289,7 +290,7 @@ TRI_skiplist_node_t* TRI_SkipListNextNode(TRI_skiplist_node_t* node) {
/// total order. In the latter two cases nothing is inserted. /// total order. In the latter two cases nothing is inserted.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int TRI_SkipListInsert(TRI_skiplist_t *sl, void *doc) { int TRI_SkipListInsert (TRI_skiplist_t *sl, void *doc) {
int lev; int lev;
TRI_skiplist_node_t* pos[TRI_SKIPLIST_MAX_HEIGHT]; TRI_skiplist_node_t* pos[TRI_SKIPLIST_MAX_HEIGHT];
TRI_skiplist_node_t* next = NULL; // to please the compiler TRI_skiplist_node_t* next = NULL; // to please the compiler
@ -341,6 +342,8 @@ int TRI_SkipListInsert(TRI_skiplist_t *sl, void *doc) {
pos[lev]->next[lev] = new; pos[lev]->next[lev] = new;
} }
sl->nrUsed++;
return TRI_ERROR_NO_ERROR; return TRI_ERROR_NO_ERROR;
} }
@ -354,7 +357,7 @@ int TRI_SkipListInsert(TRI_skiplist_t *sl, void *doc) {
/// In the latter two cases nothing is removed. /// In the latter two cases nothing is removed.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int TRI_SkipListRemove(TRI_skiplist_t *sl, void *doc) { int TRI_SkipListRemove (TRI_skiplist_t *sl, void *doc) {
int lev; int lev;
TRI_skiplist_node_t* pos[TRI_SKIPLIST_MAX_HEIGHT]; TRI_skiplist_node_t* pos[TRI_SKIPLIST_MAX_HEIGHT];
TRI_skiplist_node_t* next = NULL; // to please the compiler TRI_skiplist_node_t* next = NULL; // to please the compiler
@ -385,6 +388,8 @@ int TRI_SkipListRemove(TRI_skiplist_t *sl, void *doc) {
TRI_SkipListFreeNode(next); TRI_SkipListFreeNode(next);
sl->nrUsed--;
return TRI_ERROR_NO_ERROR; return TRI_ERROR_NO_ERROR;
} }
@ -396,7 +401,7 @@ int TRI_SkipListRemove(TRI_skiplist_t *sl, void *doc) {
/// Only comparisons using the preorder are done. /// Only comparisons using the preorder are done.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_skiplist_node_t* TRI_SkipListLeftLookup(TRI_skiplist_t *sl, void *doc) { TRI_skiplist_node_t* TRI_SkipListLeftLookup (TRI_skiplist_t *sl, void *doc) {
TRI_skiplist_node_t* pos[TRI_SKIPLIST_MAX_HEIGHT]; TRI_skiplist_node_t* pos[TRI_SKIPLIST_MAX_HEIGHT];
TRI_skiplist_node_t* next; TRI_skiplist_node_t* next;
@ -415,7 +420,7 @@ TRI_skiplist_node_t* TRI_SkipListLeftLookup(TRI_skiplist_t *sl, void *doc) {
/// Only comparisons using the preorder are done. /// Only comparisons using the preorder are done.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_skiplist_node_t* TRI_SkipListRightLookup(TRI_skiplist_t *sl, void *doc) { TRI_skiplist_node_t* TRI_SkipListRightLookup (TRI_skiplist_t *sl, void *doc) {
TRI_skiplist_node_t* pos[TRI_SKIPLIST_MAX_HEIGHT]; TRI_skiplist_node_t* pos[TRI_SKIPLIST_MAX_HEIGHT];
TRI_skiplist_node_t* next; TRI_skiplist_node_t* next;
@ -436,7 +441,7 @@ TRI_skiplist_node_t* TRI_SkipListRightLookup(TRI_skiplist_t *sl, void *doc) {
/// if doc is not in the skiplist. /// if doc is not in the skiplist.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_skiplist_node_t* TRI_SkipListLookup(TRI_skiplist_t *sl, void *doc) { TRI_skiplist_node_t* TRI_SkipListLookup (TRI_skiplist_t *sl, void *doc) {
TRI_skiplist_node_t* pos[TRI_SKIPLIST_MAX_HEIGHT]; TRI_skiplist_node_t* pos[TRI_SKIPLIST_MAX_HEIGHT];
TRI_skiplist_node_t* next = NULL; // to please the compiler TRI_skiplist_node_t* next = NULL; // to please the compiler
int cmp; int cmp;

View File

@ -100,6 +100,7 @@ typedef struct TRI_skiplist_s {
TRI_skiplist_free_func_t free; TRI_skiplist_free_func_t free;
bool unique; // indicates whether multiple entries that bool unique; // indicates whether multiple entries that
// are equal in the preorder are allowed in // are equal in the preorder are allowed in
uint64_t nrUsed;
} TRI_skiplist_t; } TRI_skiplist_t;
@ -124,15 +125,15 @@ typedef struct TRI_skiplist_s {
/// otherwise. /// otherwise.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_skiplist_t* TRI_InitSkipList(TRI_skiplist_compare_func_t cmpfunc, TRI_skiplist_t* TRI_InitSkipList (TRI_skiplist_compare_func_t cmpfunc,
TRI_skiplist_free_func_t freefunc, TRI_skiplist_free_func_t freefunc,
bool unique); bool unique);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief frees a skiplist and all its documents /// @brief frees a skiplist and all its documents
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void TRI_FreeSkipList(TRI_skiplist_t* sl); void TRI_FreeSkipList (TRI_skiplist_t* sl);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -152,13 +153,13 @@ void TRI_FreeSkipList(TRI_skiplist_t* sl);
/// @brief return the start node /// @brief return the start node
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_skiplist_node_t* TRI_SkipListStartNode(TRI_skiplist_t* sl); TRI_skiplist_node_t* TRI_SkipListStartNode (TRI_skiplist_t* sl);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief return the successor node or NULL if last node /// @brief return the successor node or NULL if last node
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_skiplist_node_t* TRI_SkipListNextNode(TRI_skiplist_node_t* node); TRI_skiplist_node_t* TRI_SkipListNextNode (TRI_skiplist_node_t* node);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief inserts a new document into a skiplist /// @brief inserts a new document into a skiplist
@ -170,7 +171,7 @@ TRI_skiplist_node_t* TRI_SkipListNextNode(TRI_skiplist_node_t* node);
/// insert. In the latter two cases nothing is inserted. /// insert. In the latter two cases nothing is inserted.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int TRI_SkipListInsert(TRI_skiplist_t *sl, void *doc); int TRI_SkipListInsert (TRI_skiplist_t *sl, void *doc);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief removes a document from a skiplist /// @brief removes a document from a skiplist
@ -180,7 +181,7 @@ int TRI_SkipListInsert(TRI_skiplist_t *sl, void *doc);
/// cases nothing is inserted. /// cases nothing is inserted.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int TRI_SkipListRemove(TRI_skiplist_t *sl, void *doc); int TRI_SkipListRemove (TRI_skiplist_t *sl, void *doc);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief finds the last document that is less to doc in the preorder /// @brief finds the last document that is less to doc in the preorder
@ -189,7 +190,7 @@ int TRI_SkipListRemove(TRI_skiplist_t *sl, void *doc);
/// Only comparisons using the preorder are done. /// Only comparisons using the preorder are done.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_skiplist_node_t* TRI_SkipListLeftLookup(TRI_skiplist_t *sl, void *doc); TRI_skiplist_node_t* TRI_SkipListLeftLookup (TRI_skiplist_t *sl, void *doc);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief finds the last document that is less or equal to doc in /// @brief finds the last document that is less or equal to doc in
@ -198,7 +199,7 @@ TRI_skiplist_node_t* TRI_SkipListLeftLookup(TRI_skiplist_t *sl, void *doc);
/// Only comparisons using the preorder are done. /// Only comparisons using the preorder are done.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_skiplist_node_t* TRI_SkipListRightLookup(TRI_skiplist_t *sl, void *doc); TRI_skiplist_node_t* TRI_SkipListRightLookup (TRI_skiplist_t *sl, void *doc);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief looks up doc in the skiplist using the proper order /// @brief looks up doc in the skiplist using the proper order
@ -208,7 +209,7 @@ TRI_skiplist_node_t* TRI_SkipListRightLookup(TRI_skiplist_t *sl, void *doc);
/// if doc is not in the skiplist. /// if doc is not in the skiplist.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_skiplist_node_t* TRI_SkipListLookup(TRI_skiplist_t *sl, void *doc); TRI_skiplist_node_t* TRI_SkipListLookup (TRI_skiplist_t *sl, void *doc);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @} /// @}