/**
 * Calculate distance between two iterators.
 */
int _avl_tree_iterator_distance(_avl_tree_iterator_t it_first, _avl_tree_iterator_t it_second)
{
    _avl_tree_iterator_t it_iter;
    int                  n_distance = 0;

    assert(_avl_tree_iterator_belong_to_avl_tree(_AVL_TREE_ITERATOR_TREE(it_first), it_first));
    assert(_avl_tree_iterator_belong_to_avl_tree(_AVL_TREE_ITERATOR_TREE(it_second), it_second));
    assert(_AVL_TREE_ITERATOR_TREE(it_first) == _AVL_TREE_ITERATOR_TREE(it_second));

    if (_avl_tree_iterator_before(it_first, it_second)) {
        for (it_iter = it_first; !_avl_tree_iterator_equal(it_iter, it_second); it_iter = _avl_tree_iterator_next(it_iter)) {
            n_distance++;
        }

        return n_distance;
    } else if (_avl_tree_iterator_before(it_second, it_first)) {
        for (it_iter = it_second; !_avl_tree_iterator_equal(it_iter, it_first); it_iter = _avl_tree_iterator_next(it_iter)) {
            n_distance++;
        }

        return -n_distance;
    } else {
        return 0;
    }
}
Example #2
0
/**
 * Test the first iterator is before the second.
 */
bool_t _set_iterator_before(set_iterator_t it_first, set_iterator_t it_second)
{
    assert(_GET_SET_CONTAINER_TYPE(it_first) == _SET_CONTAINER);
    assert(_GET_SET_ITERATOR_TYPE(it_first) == _BIDIRECTIONAL_ITERATOR);
    assert(_GET_SET_CONTAINER_TYPE(it_second) == _SET_CONTAINER);
    assert(_GET_SET_ITERATOR_TYPE(it_second) == _BIDIRECTIONAL_ITERATOR);
    assert(_GET_SET_CONTAINER(it_first) == _GET_SET_CONTAINER(it_second));

#ifdef CSTL_SET_AVL_TREE
    return _avl_tree_iterator_before(it_first, it_second);
#else
    return _rb_tree_iterator_before(it_first, it_second);
#endif
}
Example #3
0
bool_t _map_iterator_before(
    const map_iterator_t* cpt_iteratorfirst, const map_iterator_t* cpt_iteratorsecond)
{
    assert(cpt_iteratorfirst != NULL && cpt_iteratorsecond != NULL);
    assert(
        _GET_MAP_CONTAINER_TYPE(cpt_iteratorfirst) == _MAP_CONTAINER &&
        _GET_MAP_ITERATOR_TYPE(cpt_iteratorfirst) == _BIDIRECTIONAL_ITERATOR &&
        _GET_MAP_CONTAINER_TYPE(cpt_iteratorsecond) == _MAP_CONTAINER &&
        _GET_MAP_ITERATOR_TYPE(cpt_iteratorsecond) == _BIDIRECTIONAL_ITERATOR &&
        _GET_MAP_CONTAINER(cpt_iteratorfirst) == _GET_MAP_CONTAINER(cpt_iteratorsecond));

#ifdef CSTL_MAP_AVL_TREE
    return _avl_tree_iterator_before(cpt_iteratorfirst, cpt_iteratorsecond);
#else
    return _rb_tree_iterator_before(cpt_iteratorfirst, cpt_iteratorsecond);
#endif
}
Example #4
0
/*
 * Erase a range of element in an avl tree.
 */
void _avl_tree_erase_range(_avl_tree_t* pt_avl_tree, _avl_tree_iterator_t it_begin, _avl_tree_iterator_t it_end)
{
    _avl_tree_iterator_t it_iter;
    _avl_tree_iterator_t it_next;

    assert(pt_avl_tree != NULL);
    assert(_avl_tree_is_inited(pt_avl_tree));
    assert(_avl_tree_iterator_belong_to_avl_tree(pt_avl_tree, it_begin));
    assert(_avl_tree_iterator_belong_to_avl_tree(pt_avl_tree, it_end));
    assert(_avl_tree_iterator_equal(it_begin, it_end) || _avl_tree_iterator_before(it_begin, it_end));

    it_iter = it_next = it_begin;
    if (!_avl_tree_iterator_equal(it_next, _avl_tree_end(pt_avl_tree))) {
        it_next = _avl_tree_iterator_next(it_next);
    }
    while (!_avl_tree_iterator_equal(it_iter, it_end)) {
        _avl_tree_erase_pos(pt_avl_tree, it_iter);
        
        it_iter = it_next;
        if (!_avl_tree_iterator_equal(it_next, _avl_tree_end(pt_avl_tree))) {
            it_next = _avl_tree_iterator_next(it_next);
        }
    }
}