Пример #1
0
/**
 * Initialize vector container with an exist vector range.
 */
void vector_init_copy_range(vector_t* pvec_dest, vector_iterator_t it_begin, vector_iterator_t it_end)
{
    vector_iterator_t it_dest;
    vector_iterator_t it_src;
    bool_t            b_result = false;

    assert(pvec_dest != NULL);
    assert(_vector_is_created(pvec_dest));
    assert(_vector_iterator_belong_to_vector(_VECTOR_ITERATOR_CONTAINER(it_begin), it_begin));
    assert(_vector_iterator_belong_to_vector(_VECTOR_ITERATOR_CONTAINER(it_end), it_end));
    assert(iterator_equal(it_begin, it_end) || _vector_iterator_before(it_begin, it_end));
    assert(_vector_same_vector_iterator_type(pvec_dest, it_begin));
    assert(_vector_same_vector_iterator_type(pvec_dest, it_end));

    /* initialize all elements with default value */
    vector_init_n(pvec_dest, iterator_distance(it_begin, it_end));

    /* copy values for range */
    for(it_dest = vector_begin(pvec_dest), it_src = it_begin;
        !iterator_equal(it_dest, vector_end(pvec_dest)) && !iterator_equal(it_src, it_end);
        it_dest = iterator_next(it_dest), it_src = iterator_next(it_src))
    {
        b_result = _GET_VECTOR_TYPE_SIZE(pvec_dest);
        _GET_VECTOR_TYPE_COPY_FUNCTION(pvec_dest)(_VECTOR_ITERATOR_COREPOS(it_dest), _VECTOR_ITERATOR_COREPOS(it_src), &b_result);
        assert(b_result);
    }
    assert(iterator_equal(it_dest, vector_end(pvec_dest)) && iterator_equal(it_src, it_end));
}
Пример #2
0
/**
 * Assign vector element with an exist vector container range.
 */
void vector_assign_range(vector_t* pvec_vector, vector_iterator_t it_begin, vector_iterator_t it_end)
{
    iterator_t it_dest;
    iterator_t it_src;
    bool_t     b_result = false;

    /* assign the two iterator is as the same type as pvec_vector */
    assert(pvec_vector != NULL);
    assert(_vector_is_inited(pvec_vector));
    /*assert(!_vector_iterator_belong_to_vector(pvec_vector, it_begin));*/
    /*assert(!_vector_iterator_belong_to_vector(pvec_vector, it_end));*/
    assert(_vector_same_vector_iterator_type(pvec_vector, it_begin));
    assert(_vector_same_vector_iterator_type(pvec_vector, it_end));
    assert(iterator_equal(it_begin, it_end) || _vector_iterator_before(it_begin, it_end));

    /* copy value from range [it_begin, it_end) for each element */
    vector_resize(pvec_vector, iterator_distance(it_begin, it_end));
    for(it_dest = vector_begin(pvec_vector), it_src = it_begin;
        !iterator_equal(it_dest, vector_end(pvec_vector)) && !iterator_equal(it_src, it_end);
        it_dest = iterator_next(it_dest), it_src = iterator_next(it_src))
    {
        b_result = _GET_VECTOR_TYPE_SIZE(pvec_vector);
        _GET_VECTOR_TYPE_COPY_FUNCTION(pvec_vector)(_VECTOR_ITERATOR_COREPOS(it_dest), _VECTOR_ITERATOR_COREPOS(it_src), &b_result);
        assert(b_result);
    }
    assert(iterator_equal(it_dest, vector_end(pvec_vector)) && iterator_equal(it_src, it_end));
}
Пример #3
0
/**
 * Test whether an iterator on another front.
 */
bool_t _iterator_before(iterator_t it_first, iterator_t it_second)
{
    assert(_iterator_same_type(it_first, it_second));

    switch (it_first._t_containertype) {
        case _VECTOR_CONTAINER:
            return _vector_iterator_before(it_first, it_second);
            break;
        case _DEQUE_CONTAINER:
            return _deque_iterator_before(it_first, it_second);
            break;
        case _LIST_CONTAINER:
            return _list_iterator_before(it_first, it_second);
            break;
        case _SLIST_CONTAINER:
            return _slist_iterator_before(it_first, it_second);
            break;
        case _SET_CONTAINER:
            return _set_iterator_before(it_first, it_second);
            break;
        case _MULTISET_CONTAINER:
            return _multiset_iterator_before(it_first, it_second);
            break;
        case _MAP_CONTAINER:
            return _map_iterator_before(it_first, it_second);
            break;
        case _MULTIMAP_CONTAINER:
            return _multimap_iterator_before(it_first, it_second);
            break;
        case _HASH_SET_CONTAINER:
            return _hash_set_iterator_before(it_first, it_second);
            break;
        case _HASH_MULTISET_CONTAINER:
            return _hash_multiset_iterator_before(it_first, it_second);
            break;
        case _HASH_MAP_CONTAINER:
            return _hash_map_iterator_before(it_first, it_second);
            break;
        case _HASH_MULTIMAP_CONTAINER:
            return _hash_multimap_iterator_before(it_first, it_second);
            break;
        case _BASIC_STRING_CONTAINER:
            return _basic_string_iterator_before(it_first, it_second);
            break;
        default:
            return false;
            break;
    }
}
/**
 * Testing of the first iterator is located in front of the second iterator.
 */
bool_t _basic_string_iterator_before(basic_string_iterator_t it_first, basic_string_iterator_t it_second)
{
    bool_t b_result;

    assert(_GET_BASIC_STRING_CONTAINER_TYPE(it_first) == _BASIC_STRING_CONTAINER);
    assert(_GET_BASIC_STRING_CONTAINER_TYPE(it_second) == _BASIC_STRING_CONTAINER);

    _GET_VECTOR_CONTAINER_TYPE(it_first) = _VECTOR_CONTAINER;
    _GET_VECTOR_CONTAINER_TYPE(it_second) = _VECTOR_CONTAINER;

    b_result = _vector_iterator_before(it_first, it_second);

    _GET_BASIC_STRING_CONTAINER_TYPE(it_first) = _BASIC_STRING_CONTAINER;
    _GET_BASIC_STRING_CONTAINER_TYPE(it_second) = _BASIC_STRING_CONTAINER;

    return b_result;
}
Пример #5
0
/**
 * Removes a range of elements in vector from specificed position.
 */
vector_iterator_t vector_erase_range(vector_t* pvec_vector, vector_iterator_t it_begin, vector_iterator_t it_end)
{
    size_t            t_erasesize = 0;
    bool_t            b_result = false;
    vector_iterator_t it_iter;

    assert(pvec_vector != NULL);
    assert(_vector_is_inited(pvec_vector));
    assert(_vector_iterator_belong_to_vector(pvec_vector, it_begin));
    assert(_vector_iterator_belong_to_vector(pvec_vector, it_end));
    assert(iterator_equal(it_begin, it_end) || _vector_iterator_before(it_begin, it_end));

    if(iterator_equal(it_begin, it_end))
    {
        return it_end;
    }

    it_iter = it_begin;
    t_erasesize = iterator_distance(it_begin, it_end);

    for(; !iterator_equal(it_end, vector_end(pvec_vector)); it_begin = iterator_next(it_begin), it_end = iterator_next(it_end))
    {
        b_result = _GET_VECTOR_TYPE_SIZE(pvec_vector);
        _GET_VECTOR_TYPE_COPY_FUNCTION(pvec_vector)(_VECTOR_ITERATOR_COREPOS(it_begin), _VECTOR_ITERATOR_COREPOS(it_end), &b_result);
        assert(b_result);
    }
    assert(_VECTOR_ITERATOR_COREPOS(it_begin) == pvec_vector->_pby_finish - t_erasesize * _GET_VECTOR_TYPE_SIZE(pvec_vector));

    /* destroy the deleted elements */
    for(; !iterator_equal(it_begin, it_end); it_begin = iterator_next(it_begin))
    {
        b_result = _GET_VECTOR_TYPE_SIZE(pvec_vector);
        _GET_VECTOR_TYPE_DESTROY_FUNCTION(pvec_vector)(_VECTOR_ITERATOR_COREPOS(it_begin), &b_result);
        assert(b_result);
    }
    pvec_vector->_pby_finish -= t_erasesize * _GET_VECTOR_TYPE_SIZE(pvec_vector);

    return it_iter;
}
Пример #6
0
/**
 * Insert a range of elements into vector at a specificed position.
 */
void vector_insert_range(vector_t* pvec_vector, vector_iterator_t it_pos, vector_iterator_t it_begin, vector_iterator_t it_end)
{
    size_t            t_count = 0; /* the element count */
    bool_t            b_result = false;
    vector_iterator_t it_first;
    vector_iterator_t it_second;
    _byte_t*          pby_oldfinish = NULL;
    _byte_t*          pby_pos = NULL;
    _byte_t*          pby_destpos = NULL;

    /* test the vector and iterator is valid */
    assert(pvec_vector != NULL);
    assert(_vector_is_inited(pvec_vector));
    assert(_vector_iterator_belong_to_vector(pvec_vector, it_pos));
    /*assert(!_vector_iterator_belong_to_vector(pvec_vector, it_begin));*/
    /*assert(!_vector_iterator_belong_to_vector(pvec_vector, it_end));*/
    assert(_vector_same_vector_iterator_type(pvec_vector, it_begin));
    assert(_vector_same_vector_iterator_type(pvec_vector, it_end));
    assert(iterator_equal(it_begin, it_end) || _vector_iterator_before(it_begin, it_end));

    t_count = iterator_distance(it_begin, it_end);
    if(t_count > 0)
    {
        /* if the remain capacity is less then the element count */
        if(vector_size(pvec_vector) + t_count > vector_capacity(pvec_vector))
        {
            size_t t_distance = _VECTOR_ITERATOR_COREPOS(it_pos) - pvec_vector->_pby_start;
            /* reserve the new size */
            vector_reserve(pvec_vector, _vector_calculate_new_capacity(vector_size(pvec_vector), t_count));
            _VECTOR_ITERATOR_COREPOS(it_pos) = pvec_vector->_pby_start + t_distance;
        }

        /* initialize new elements */
        pby_oldfinish = pvec_vector->_pby_finish;
        assert(pby_oldfinish != NULL);
        pvec_vector->_pby_finish += t_count * _GET_VECTOR_TYPE_SIZE(pvec_vector);
        _vector_init_elem_range_auxiliary(pvec_vector, pby_oldfinish, pvec_vector->_pby_finish);

        /* move element from old finish to new finish */
        for(pby_pos = pby_oldfinish - _GET_VECTOR_TYPE_SIZE(pvec_vector),
            pby_destpos = pvec_vector->_pby_finish - _GET_VECTOR_TYPE_SIZE(pvec_vector);
            pby_pos >= _VECTOR_ITERATOR_COREPOS(it_pos);
            pby_pos -= _GET_VECTOR_TYPE_SIZE(pvec_vector),
            pby_destpos -= _GET_VECTOR_TYPE_SIZE(pvec_vector))
        {
            b_result = _GET_VECTOR_TYPE_SIZE(pvec_vector);
            _GET_VECTOR_TYPE_COPY_FUNCTION(pvec_vector)(pby_destpos, pby_pos, &b_result);
            assert(b_result);
        }

        /* insert element counts copys to the pos */
        for(it_first = it_pos, it_second = it_begin;
            !iterator_equal(it_second, it_end);
            it_first = iterator_next(it_first), it_second = iterator_next(it_second))
        {
            b_result = _GET_VECTOR_TYPE_SIZE(pvec_vector);
            _GET_VECTOR_TYPE_COPY_FUNCTION(pvec_vector)(_VECTOR_ITERATOR_COREPOS(it_first), _VECTOR_ITERATOR_COREPOS(it_second), &b_result);
            assert(b_result);
        }
        assert(_VECTOR_ITERATOR_COREPOS(it_first) == _VECTOR_ITERATOR_COREPOS(it_pos) + 
               (_VECTOR_ITERATOR_COREPOS(it_end) - _VECTOR_ITERATOR_COREPOS(it_begin)));
    }
}