Exemplo n.º 1
0
Arquivo: c_rb.c Projeto: AmeyaVS/cstl
static void
__delete_c_rb_node (struct clib_rb* pTree, struct clib_rb_node* x ) {

    void* key;
	void* value;

    if ( pTree->destruct_k_fn ) {
        get_raw_clib_object ( x->key, &key );
        pTree->destruct_k_fn ( key );
    }
    delete_clib_object( x->key );

    if ( x->value ) {
        if ( pTree->destruct_v_fn ) {
            get_raw_clib_object ( x->value, &value);
            pTree->destruct_v_fn ( value );
        }
        delete_clib_object( x->value );
    }
}
Exemplo n.º 2
0
void           
for_each_c_slist (struct clib_slist* pSlist, void (*fn)(void* )) {
    void* elem;
    struct clib_slist_node* current  = pSlist->head;
    while ( current != (struct clib_slist_node*)0 ) {
        get_raw_clib_object(current->elem, &elem);
        (fn)(elem);
        free ( elem );
        current = current->next;
    }    
}
Exemplo n.º 3
0
static void 
__remove_c_list ( struct clib_slist* pSlist, struct clib_slist_node* pSlistNode ) {
    void* elem;
    get_raw_clib_object(pSlistNode->elem, &elem);
    if ( pSlist->destruct_fn) {             
        (pSlist->destruct_fn)(elem);
        delete_clib_object ( pSlistNode->elem );
    }else {
        free ( elem );
        delete_clib_object ( pSlistNode->elem );
    }        
    free ( pSlistNode);
}
Exemplo n.º 4
0
static void
replace_value_c_slist(struct clib_iterator *pIterator, void* elem, size_t elem_size) {
	struct clib_slist*  pSlist = (struct clib_slist*)pIterator->pContainer;
	struct clib_object *pObj = ((struct clib_slist_node*)pIterator->pCurrentElement)->elem;
	
	if ( pSlist->destruct_fn ) {
		void* old_element;
		
		get_raw_clib_object (pObj, &old_element );
		pSlist->destruct_fn(old_element);
    }
	replace_raw_clib_object( pObj, elem, elem_size);
}
Exemplo n.º 5
0
clib_error   
remove_clib_map ( struct clib_map *pMap, void *key) {
    clib_error rc = CLIB_ERROR_SUCCESS;
    struct clib_rb_node* node;
    if (pMap == (struct clib_map*)0)
        return CLIB_MAP_NOT_INITIALIZED;

    node = remove_clib_rb ( pMap->root, key );
    if ( node != (struct clib_rb_node*)0  ) {
        void* removed_node;
        get_raw_clib_object ( node->key, &removed_node );
        free ( removed_node);
        delete_clib_object ( node->key );

        get_raw_clib_object ( node->value, &removed_node );
        free ( removed_node);
        delete_clib_object ( node->value);

        free ( node );
    }
    return rc;
}
Exemplo n.º 6
0
clib_error 
element_at_clib_array (struct clib_array* pArray, int index, void** elem) {
    clib_error rc = CLIB_ERROR_SUCCESS;

    if ( ! pArray )
        return CLIB_ARRAY_NOT_INITIALIZED;

	if ( index < 0 || index >= pArray->no_of_elements )
        return CLIB_ARRAY_INDEX_OUT_OF_BOUND;

    get_raw_clib_object ( pArray->pElements[index], elem );
    return rc;
}
Exemplo n.º 7
0
clib_bool
find_c_slist (struct clib_slist* pSlist, void* find_value, void**out_value) {
    struct clib_slist_node* current  = pSlist->head;  
    while ( current != (struct clib_slist_node*)0 ) {        
        get_raw_clib_object(current->elem, out_value);
        if ((pSlist->compare_key_fn)(find_value,*out_value) != 0){
            break;
        }
        free ( *out_value );
        current = current->next;
    }
    if ( current ) {
        return clib_true;
    }
    return clib_false;
}
Exemplo n.º 8
0
clib_bool    
find_clib_map ( struct clib_map *pMap, void *key, void **value) {
    struct clib_rb_node* node;

    if (pMap == (struct clib_map*)0)
        return clib_false;

    node = find_clib_rb ( pMap->root, key);
    if ( node == (struct clib_rb_node*)0  ) 
        return clib_false;

    get_raw_clib_object ( node->value, value );

    return clib_true;

}
Exemplo n.º 9
0
clib_bool    
find_clib_set ( struct clib_set *pSet, void *key, void* outKey) {
    struct clib_rb_node* node;

    if (pSet == (struct clib_set*)0 )
        return clib_false;

    node = find_clib_rb ( pSet->root, key);
    if ( node == (struct clib_rb_node*)0  ) 
        return clib_false;

    get_raw_clib_object ( node->key, outKey );

    return clib_true;

}
Exemplo n.º 10
0
Arquivo: c_rb.c Projeto: AmeyaVS/cstl
struct clib_rb_node*   
find_c_rb (struct clib_rb* pTree, void* key) {
    struct clib_rb_node* x = pTree->root;

    while (x != rb_sentinel) {
        int c = 0;
        void* cur_key ;
        get_raw_clib_object ( x->key, &cur_key );
        c = pTree->compare_fn (key, cur_key);
        free ( cur_key );
        if (c == 0) {
            break;
        } else {
            x = c < 0 ? x->left : x->right;
        }
    }
    if ( x == rb_sentinel )
        return (struct clib_rb_node*)0 ;

    return x;
}
Exemplo n.º 11
0
Arquivo: c_rb.c Projeto: AmeyaVS/cstl
struct clib_rb_node*
remove_c_rb (struct clib_rb* pTree, void* key) {
    struct clib_rb_node* z = (struct clib_rb_node*)0 ;

    z = pTree->root;
    while (z != rb_sentinel) {
        int c = 0;
        void* cur_key;
        get_raw_clib_object ( z->key, &cur_key );
        c = pTree->compare_fn (key, cur_key);
        free ( cur_key );
        if ( c == 0) {
            break;
        }
        else {
            z = ( c < 0) ? z->left : z->right;
        }
    }
    if (z == rb_sentinel)
        return (struct clib_rb_node*)0 ;
    return __remove_c_rb(pTree, z );
}
Exemplo n.º 12
0
static void* 
get_value_c_slist( void* pObject) {
	void* elem;
	get_raw_clib_object ( pObject, &elem );
	return elem;
}
Exemplo n.º 13
0
Arquivo: c_rb.c Projeto: AmeyaVS/cstl
clib_error  
insert_c_rb(struct clib_rb* pTree, void* k, size_t key_size, void* v, size_t value_size) {

    clib_error rc = CLIB_ERROR_SUCCESS;
    struct clib_rb_node* x;
	struct clib_rb_node* y;
	struct clib_rb_node* z;

    x = (struct clib_rb_node*)malloc (sizeof(struct clib_rb_node));
    if ( x == (struct clib_rb_node*)0  ) 
        return CLIB_ERROR_MEMORY;

    x->left    = rb_sentinel;
    x->right   = rb_sentinel;
    x->color   = clib_red;

    x->key     = new_clib_object ( k, key_size );
    if ( v ) {
        x->value   = new_clib_object ( v, value_size );
    } else {
        x->value =  (struct clib_object*)0;
    }

    y = pTree->root;
    z = (struct clib_rb_node*)0 ;

    while (y != rb_sentinel) {
        int c = 0;
        void* cur_key;
		void* new_key;

        get_raw_clib_object ( y->key, &cur_key );
        get_raw_clib_object ( x->key, &new_key );

        c = (pTree->compare_fn) ( new_key , cur_key);
        free ( cur_key );
        free ( new_key );
        if (c == 0) {
            /* TODO : Delete node here */
            return CLIB_RBTREE_KEY_DUPLICATE;
        }
        z = y;
        if ( c < 0 )
            y = y->left;
        else
            y = y->right;
    }    
    x->parent = z;
    if (z) {
        int c = 0;
        void* cur_key;
		void* new_key;
        get_raw_clib_object ( z->key, &cur_key );
        get_raw_clib_object ( x->key, &new_key );

        c = pTree->compare_fn( new_key, cur_key);
        free ( cur_key );
        free ( new_key );
        if (c < 0) {
            z->left = x;
        } else {
            z->right = x;
        }
    }
    else
        pTree->root = x;

    __rb_insert_fixup (pTree, x);

    debug_verify_properties ( pTree);
    return rc;
}