コード例 #1
0
/**
 * 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);
    }
}
コード例 #2
0
ファイル: cstl_deque_aux.c プロジェクト: astrotycoon/libcstl
/**
 * 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);
    }
}
コード例 #3
0
ファイル: cstl_deque_aux.c プロジェクト: astrotycoon/libcstl
/**
 * 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;
}