Beispiel #1
0
/**
 * Initialize data within range [it_begin, it_end) according to deque element data type.
 */
void _deque_init_elem_range_auxiliary(deque_t* pdeq_deque, deque_iterator_t it_begin, deque_iterator_t it_end)
{
    deque_iterator_t it_iter;

    assert(pdeq_deque != NULL);
    assert(_deque_is_inited(pdeq_deque) || _deque_is_created(pdeq_deque));
    assert(_deque_iterator_belong_to_deque(_GET_DEQUE_CONTAINER(it_begin), it_begin));
    assert(_deque_iterator_belong_to_deque(_GET_DEQUE_CONTAINER(it_end), it_end));
    assert(iterator_equal(it_begin, it_end) || _deque_iterator_before(it_begin, it_end));

    /* initialize new elements */
    if(_GET_DEQUE_TYPE_STYLE(pdeq_deque) == _TYPE_CSTL_BUILTIN)
    {
        /* get element type name */
        char s_elemtypename[_TYPE_NAME_SIZE + 1];
        _type_get_elem_typename(_GET_DEQUE_TYPE_NAME(pdeq_deque), s_elemtypename);

        for(it_iter = it_begin; !iterator_equal(it_iter, it_end); it_iter = iterator_next(it_iter))
        {
            _GET_DEQUE_TYPE_INIT_FUNCTION(pdeq_deque)(_deque_iterator_get_pointer_auxiliary(it_iter), s_elemtypename);
        }
    }
    else
    {
        for(it_iter = it_begin; !iterator_equal(it_iter, it_end); it_iter = iterator_next(it_iter))
        {
            bool_t t_result = _GET_DEQUE_TYPE_SIZE(pdeq_deque);
            _GET_DEQUE_TYPE_INIT_FUNCTION(pdeq_deque)(_deque_iterator_get_pointer_auxiliary(it_iter), &t_result);
            assert(t_result);
        }
    }
}
/**
 * Get the pointer that point to the iterator reference data.
 */
const void* _deque_iterator_get_pointer(deque_iterator_t it_iter)
{
    assert(_deque_iterator_belong_to_deque(_DEQUE_ITERATOR_CONTAINER(it_iter), it_iter));
    assert(!iterator_equal(it_iter, deque_end(_DEQUE_ITERATOR_CONTAINER(it_iter))));

    /* char* */
    if(strncmp(_GET_DEQUE_TYPE_BASENAME(_DEQUE_ITERATOR_CONTAINER(it_iter)), _C_STRING_TYPE, _TYPE_NAME_SIZE) == 0)
    {
        return string_c_str((string_t*)_deque_iterator_get_pointer_auxiliary(it_iter));
    }
    else
    {
        return _deque_iterator_get_pointer_auxiliary(it_iter);
    }
}
Beispiel #3
0
/**
 * Shrink deque at begin.
 */
void _deque_shrink_at_begin(deque_t* pdeq_deque, size_t t_shrinksize)
{
    deque_iterator_t it_oldbegin;
    deque_iterator_t it_newbegin;
    deque_iterator_t it_iter;
    _mappointer_t    ppby_map = NULL;
    bool_t           b_result = false;

    assert(pdeq_deque != NULL);
    assert(_deque_is_inited(pdeq_deque));

    it_oldbegin = deque_begin(pdeq_deque);
    t_shrinksize = t_shrinksize < deque_size(pdeq_deque) ? t_shrinksize : deque_size(pdeq_deque);
    it_newbegin = iterator_next_n(deque_begin(pdeq_deque), t_shrinksize);
    assert(_deque_iterator_belong_to_deque(pdeq_deque, it_newbegin));

    /* destroy all elements */
    for(it_iter = it_oldbegin; !iterator_equal(it_iter, it_newbegin); it_iter = iterator_next(it_iter))
    {
        b_result = _GET_DEQUE_TYPE_SIZE(pdeq_deque);
        _GET_DEQUE_TYPE_DESTROY_FUNCTION(pdeq_deque)(_deque_iterator_get_pointer_auxiliary(it_iter), &b_result);
        assert(b_result);
    }
    pdeq_deque->_t_start = it_newbegin;

    for(ppby_map = _GET_DEQUE_MAP_POINTER(pdeq_deque->_t_start) - 1; ppby_map >= _GET_DEQUE_MAP_POINTER(it_oldbegin); --ppby_map)
    {
        _alloc_deallocate(&pdeq_deque->_t_allocator, *ppby_map, _GET_DEQUE_TYPE_SIZE(pdeq_deque), _DEQUE_ELEM_COUNT);
        *ppby_map = NULL;
    }
}
/**
 * Set iterator reference data.
 */
void _deque_iterator_set_value(deque_iterator_t it_iter, const void* cpv_value)
{
    bool_t b_result = false;

    assert(cpv_value != NULL);
    assert(_deque_iterator_belong_to_deque(_DEQUE_ITERATOR_CONTAINER(it_iter), it_iter));
    assert(!iterator_equal(it_iter, deque_end(_DEQUE_ITERATOR_CONTAINER(it_iter))));

    /* char* */
    if(strncmp(_GET_DEQUE_TYPE_BASENAME(_DEQUE_ITERATOR_CONTAINER(it_iter)), _C_STRING_TYPE, _TYPE_NAME_SIZE) == 0)
    {
        string_assign_cstr((string_t*)_deque_iterator_get_pointer_auxiliary(it_iter), (char*)cpv_value);
    }
    else
    {
        b_result = _GET_DEQUE_TYPE_SIZE(_DEQUE_ITERATOR_CONTAINER(it_iter));
        _GET_DEQUE_TYPE_COPY_FUNCTION(_DEQUE_ITERATOR_CONTAINER(it_iter))(
            _deque_iterator_get_pointer_auxiliary(it_iter), cpv_value, &b_result);
        assert(b_result);
    }
}
Beispiel #5
0
/**
 * Move element range to deque begin.
 */
deque_iterator_t _deque_move_elem_to_begin(
    deque_t* pdeq_deque, deque_iterator_t it_begin, deque_iterator_t it_end, size_t t_step)
{
    assert(pdeq_deque != NULL);
    assert(_deque_is_inited(pdeq_deque));
    assert(_deque_iterator_belong_to_deque(pdeq_deque, it_begin));
    assert(_deque_iterator_belong_to_deque(pdeq_deque, it_end));
    assert(iterator_equal(it_begin, it_end) || _deque_iterator_before(it_begin, it_end));

    if(!iterator_equal(it_begin, it_end) && t_step != 0)
    {
        deque_iterator_t it_targetbegin;
        deque_iterator_t it_targetend;
        bool_t           b_result = false;

        it_targetbegin = it_begin;
        it_targetend = it_end;
        it_targetbegin = iterator_prev_n(it_targetbegin, t_step);
        it_targetend = iterator_prev_n(it_targetend, t_step);
        assert(_deque_iterator_before(it_targetbegin, it_targetend));

        for(;
            iterator_less(it_targetbegin, it_targetend) && iterator_less(it_begin, it_end);
            it_targetbegin = iterator_next(it_targetbegin), it_begin = iterator_next(it_begin))
        {
            b_result = _GET_DEQUE_TYPE_SIZE(pdeq_deque);
            _GET_DEQUE_TYPE_COPY_FUNCTION(pdeq_deque)(
                _deque_iterator_get_pointer_auxiliary(it_targetbegin),
                _deque_iterator_get_pointer_auxiliary(it_begin), &b_result);
            assert(b_result);
        }
        assert(iterator_equal(it_targetbegin, it_targetend) && iterator_equal(it_begin, it_end));

        return it_targetend;
    }
    else
    {
        return iterator_prev_n(it_end, t_step);
    }
}
Beispiel #6
0
/**
 * Move element range to deque end.
 */
deque_iterator_t _deque_move_elem_to_end(
    deque_t* pdeq_deque, deque_iterator_t it_begin, deque_iterator_t it_end, size_t t_step)
{
    assert(pdeq_deque != NULL);
    assert(_deque_is_inited(pdeq_deque));
    assert(_deque_iterator_belong_to_deque(pdeq_deque, it_begin));
    assert(_deque_iterator_belong_to_deque(pdeq_deque, it_end));
    assert(iterator_equal(it_begin, it_end) || _deque_iterator_before(it_begin, it_end));

    /* if it_begin != it_end then do move */
    if(!iterator_equal(it_begin, it_end) && t_step != 0)
    {
        /* the target range of move */
        deque_iterator_t it_targetbegin;
        deque_iterator_t it_targetend;
        bool_t           b_result = false;

        it_targetbegin = it_begin;
        it_targetend = it_end;
        it_targetbegin = iterator_next_n(it_targetbegin, t_step);
        it_targetend = iterator_next_n(it_targetend, t_step);
        assert(_deque_iterator_before(it_targetbegin, it_targetend));

        while(!iterator_equal(it_targetbegin, it_targetend) && !iterator_equal(it_begin, it_end))
        {
            it_targetend = iterator_prev(it_targetend);
            it_end = iterator_prev(it_end);
            b_result = _GET_DEQUE_TYPE_SIZE(pdeq_deque);
            _GET_DEQUE_TYPE_COPY_FUNCTION(pdeq_deque)(
                _deque_iterator_get_pointer_auxiliary(it_targetend),
                _deque_iterator_get_pointer_auxiliary(it_end), &b_result);
            assert(b_result);
        }
        assert(iterator_equal(it_begin, it_end) && iterator_equal(it_targetbegin, it_targetend));
    }

    return it_begin;
}