Exemple #1
0
/**
 * Return an iterator range that is equal to a specific element.
 */
range_t _set_equal_range_varg(const set_t* cpset_set, va_list val_elemlist)
{
    void*          pv_varg = NULL;
    range_t        r_range;

    assert(cpset_set != NULL);

    pv_varg = _alloc_allocate(&((set_t*)cpset_set)->_t_tree._t_allocator, _GET_SET_TYPE_SIZE(cpset_set), 1);
    assert(pv_varg != NULL);
    _set_get_varg_value_auxiliary((set_t*)cpset_set, val_elemlist, pv_varg);

#ifdef CSTL_SET_AVL_TREE
    r_range = _avl_tree_equal_range(&cpset_set->_t_tree, pv_varg);
#else
    r_range = _rb_tree_equal_range(&cpset_set->_t_tree, pv_varg);
#endif

    _set_destroy_varg_value_auxiliary((set_t*)cpset_set, pv_varg);
    _alloc_deallocate(&((set_t*)cpset_set)->_t_tree._t_allocator, pv_varg, _GET_SET_TYPE_SIZE(cpset_set), 1);

    _ITERATOR_CONTAINER(r_range.it_begin) = (set_t*)cpset_set;
    _SET_ITERATOR_CONTAINER_TYPE(r_range.it_begin) = _SET_CONTAINER;
    _SET_ITERATOR_ITERATOR_TYPE(r_range.it_begin) = _BIDIRECTIONAL_ITERATOR;

    _ITERATOR_CONTAINER(r_range.it_end) = (set_t*)cpset_set;
    _SET_ITERATOR_CONTAINER_TYPE(r_range.it_end) = _SET_CONTAINER;
    _SET_ITERATOR_ITERATOR_TYPE(r_range.it_end) = _BIDIRECTIONAL_ITERATOR;

    return r_range;
}
Exemple #2
0
/**
 * Test the two set iterator are equal.
 */
bool_t _set_iterator_equal(set_iterator_t it_first, set_iterator_t it_second)
{
    assert(_SET_ITERATOR_CONTAINER_TYPE(it_first) == _SET_CONTAINER);
    assert(_SET_ITERATOR_ITERATOR_TYPE(it_first) == _BIDIRECTIONAL_ITERATOR);
    assert(_SET_ITERATOR_CONTAINER_TYPE(it_second) == _SET_CONTAINER);
    assert(_SET_ITERATOR_ITERATOR_TYPE(it_second) == _BIDIRECTIONAL_ITERATOR);

#ifdef CSTL_SET_AVL_TREE
    return _avl_tree_iterator_equal(it_first, it_second);
#else
    return _rb_tree_iterator_equal(it_first, it_second);
#endif
}
Exemple #3
0
/*
 * Erase a range of element in an set.
 */
void set_erase_range(set_t* pset_set, set_iterator_t it_begin, set_iterator_t it_end)
{
    assert(pset_set != NULL);
    assert(_SET_ITERATOR_CONTAINER_TYPE(it_begin) == _SET_CONTAINER);
    assert(_SET_ITERATOR_ITERATOR_TYPE(it_begin) == _BIDIRECTIONAL_ITERATOR);
    assert(_SET_ITERATOR_CONTAINER_TYPE(it_end) == _SET_CONTAINER);
    assert(_SET_ITERATOR_ITERATOR_TYPE(it_end) == _BIDIRECTIONAL_ITERATOR);
    assert(_SET_ITERATOR_CONTAINER(it_begin) == pset_set);
    assert(_SET_ITERATOR_CONTAINER(it_end) == pset_set);

#ifdef CSTL_SET_AVL_TREE
    _avl_tree_erase_range(&pset_set->_t_tree, it_begin, it_end);
#else
    _rb_tree_erase_range(&pset_set->_t_tree, it_begin, it_end);
#endif
}
Exemple #4
0
/**
 * Inserts an unique element into a set with hint.
 */
set_iterator_t _set_insert_hint_varg(set_t* pset_set, set_iterator_t it_hint, va_list val_elemlist)
{
    void* pv_varg = NULL;

    assert(pset_set != NULL);

    pv_varg = _alloc_allocate(&pset_set->_t_tree._t_allocator, _GET_SET_TYPE_SIZE(pset_set), 1);
    assert(pv_varg != NULL);
    _set_get_varg_value_auxiliary(pset_set, val_elemlist, pv_varg);

#ifdef CSTL_SET_AVL_TREE
    it_hint = _avl_tree_insert_unique(&pset_set->_t_tree, pv_varg);
#else
    it_hint = _rb_tree_insert_unique(&pset_set->_t_tree, pv_varg);
#endif

    _set_destroy_varg_value_auxiliary(pset_set, pv_varg);
    _alloc_deallocate(&pset_set->_t_tree._t_allocator, pv_varg, _GET_SET_TYPE_SIZE(pset_set), 1);

    _ITERATOR_CONTAINER(it_hint) = pset_set;
    _SET_ITERATOR_CONTAINER_TYPE(it_hint) = _SET_CONTAINER;
    _SET_ITERATOR_ITERATOR_TYPE(it_hint) = _BIDIRECTIONAL_ITERATOR;

    return it_hint;
}
Exemple #5
0
/**
 * Return an iterator to the first element that is greater than a specific element.
 */
set_iterator_t _set_upper_bound_varg(const set_t* cpset_set, va_list val_elemlist)
{
    void*          pv_varg = NULL;
    set_iterator_t it_iter;

    assert(cpset_set != NULL);

    pv_varg = _alloc_allocate(&((set_t*)cpset_set)->_t_tree._t_allocator, _GET_SET_TYPE_SIZE(cpset_set), 1);
    assert(pv_varg != NULL);
    _set_get_varg_value_auxiliary((set_t*)cpset_set, val_elemlist, pv_varg);

#ifdef CSTL_SET_AVL_TREE
    it_iter = _avl_tree_upper_bound(&cpset_set->_t_tree, pv_varg);
#else
    it_iter = _rb_tree_upper_bound(&cpset_set->_t_tree, pv_varg);
#endif

    _set_destroy_varg_value_auxiliary((set_t*)cpset_set, pv_varg);
    _alloc_deallocate(&((set_t*)cpset_set)->_t_tree._t_allocator, pv_varg, _GET_SET_TYPE_SIZE(cpset_set), 1);

    _ITERATOR_CONTAINER(it_iter) = (set_t*)cpset_set;
    _SET_ITERATOR_CONTAINER_TYPE(it_iter) = _SET_CONTAINER;
    _SET_ITERATOR_ITERATOR_TYPE(it_iter) = _BIDIRECTIONAL_ITERATOR;

    return it_iter;
}
Exemple #6
0
/**
 * Initialize set container with specific range and compare function.
 */
void set_init_copy_range_ex(
    set_t* pset_dest, set_iterator_t it_begin, set_iterator_t it_end, binary_function_t bfun_compare)
{
    assert(pset_dest != NULL);
    assert(_SET_ITERATOR_CONTAINER_TYPE(it_begin) == _SET_CONTAINER);
    assert(_SET_ITERATOR_ITERATOR_TYPE(it_begin) == _BIDIRECTIONAL_ITERATOR);
    assert(_SET_ITERATOR_CONTAINER_TYPE(it_end) == _SET_CONTAINER);
    assert(_SET_ITERATOR_ITERATOR_TYPE(it_end) == _BIDIRECTIONAL_ITERATOR);
    assert(_SET_ITERATOR_CONTAINER(it_begin) != pset_dest);
    assert(_SET_ITERATOR_CONTAINER(it_end) != pset_dest);
    assert(_SET_ITERATOR_CONTAINER(it_begin) == _SET_ITERATOR_CONTAINER(it_end));

#ifdef CSTL_SET_AVL_TREE
    _avl_tree_init_copy_range_ex(&pset_dest->_t_tree, it_begin, it_end, bfun_compare);
#else
    _rb_tree_init_copy_range_ex(&pset_dest->_t_tree, it_begin, it_end, bfun_compare);
#endif
}
Exemple #7
0
/**
 * Get data value pointer referenced by iterator, but ignore char*.
 */
const void* _set_iterator_get_pointer_ignore_cstr(set_iterator_t it_iter)
{
    assert(_SET_ITERATOR_CONTAINER_TYPE(it_iter) == _SET_CONTAINER);
    assert(_SET_ITERATOR_ITERATOR_TYPE(it_iter) == _BIDIRECTIONAL_ITERATOR); 

#ifdef CSTL_SET_AVL_TREE
    return _avl_tree_iterator_get_pointer_ignore_cstr(it_iter);
#else
    return _rb_tree_iterator_get_pointer_ignore_cstr(it_iter);
#endif
}
Exemple #8
0
/**
 * Return iterator reference previous element.
 */
set_iterator_t _set_iterator_prev(set_iterator_t it_iter)
{
    assert(_SET_ITERATOR_CONTAINER_TYPE(it_iter) == _SET_CONTAINER);
    assert(_SET_ITERATOR_ITERATOR_TYPE(it_iter) == _BIDIRECTIONAL_ITERATOR); 

#ifdef CSTL_SET_AVL_TREE
    return _avl_tree_iterator_prev(it_iter);
#else
    return _rb_tree_iterator_prev(it_iter);
#endif
}
Exemple #9
0
/**
 * Get data value referenced by iterator.
 */
void _set_iterator_get_value(set_iterator_t it_iter, void* pv_value)
{
    assert(pv_value != NULL);
    assert(_SET_ITERATOR_CONTAINER_TYPE(it_iter) == _SET_CONTAINER); 
    assert(_SET_ITERATOR_ITERATOR_TYPE(it_iter) == _BIDIRECTIONAL_ITERATOR);

#ifdef CSTL_SET_AVL_TREE
    _avl_tree_iterator_get_value(it_iter, pv_value);
#else
    _rb_tree_iterator_get_value(it_iter, pv_value);
#endif
}
Exemple #10
0
/*
 * Erase an element in an set from specificed position.
 */
void set_erase_pos(set_t* pset_set, set_iterator_t t_pos)
{
    assert(pset_set != NULL);
    assert(_SET_ITERATOR_CONTAINER_TYPE(t_pos) == _SET_CONTAINER);
    assert(_SET_ITERATOR_ITERATOR_TYPE(t_pos) == _BIDIRECTIONAL_ITERATOR);
    assert(_SET_ITERATOR_CONTAINER(t_pos) == pset_set);

#ifdef CSTL_SET_AVL_TREE
    _avl_tree_erase_pos(&pset_set->_t_tree, t_pos);
#else
    _rb_tree_erase_pos(&pset_set->_t_tree, t_pos);
#endif
}
Exemple #11
0
/**
 * Create set iterator.
 */
set_iterator_t create_set_iterator(void)
{
    set_iterator_t it_iter;

#ifdef CSTL_SET_AVL_TREE
    it_iter = _create_avl_tree_iterator();
#else
    it_iter = _create_rb_tree_iterator();
#endif

    _SET_ITERATOR_CONTAINER_TYPE(it_iter) = _SET_CONTAINER;
    _SET_ITERATOR_ITERATOR_TYPE(it_iter) = _BIDIRECTIONAL_ITERATOR;

    return it_iter;
}
Exemple #12
0
set_iterator_t set_rend(const set_t* cpset_set)
{
    set_iterator_t it_rend;

    assert(cpset_set != NULL);

#ifdef CSTL_SET_AVL_TREE
    it_rend = _avl_tree_rend(&cpset_set->_t_tree);
#else
    it_rend = _rb_tree_rend(&cpset_set->_t_tree);
#endif

    _ITERATOR_CONTAINER(it_rend) = (set_t*)cpset_set;
    _SET_ITERATOR_CONTAINER_TYPE(it_rend) = _SET_CONTAINER;
    _SET_ITERATOR_ITERATOR_TYPE(it_rend) = _BIDIRECTIONAL_ITERATOR;

    return it_rend;
}