Exemplo n.º 1
0
/**
 * Remove element that specificed by variable argument slist from slist container.
 */
void _slist_remove_varg(slist_t* pslist_slist, va_list val_elemlist)
{
    slist_iterator_t it_iter; /* for iterate */
    _slistnode_t*    pt_varg = NULL;
    bool_t           b_less = false;
    bool_t           b_greater = false;

    /* test the pointer is valid */
    assert(pslist_slist != NULL);
    assert(_slist_is_inited(pslist_slist));

    pt_varg = _alloc_allocate(&pslist_slist->_t_allocator, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
    assert(pt_varg != NULL);
    _slist_get_varg_value_auxiliary(pslist_slist, val_elemlist, pt_varg);

    it_iter = slist_begin(pslist_slist);
    while (!iterator_equal(it_iter, slist_end(pslist_slist))) {
        b_less = b_greater = _GET_SLIST_TYPE_SIZE(pslist_slist);
        _GET_SLIST_TYPE_LESS_FUNCTION(pslist_slist)(
            pt_varg->_pby_data, ((_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_iter))->_pby_data, &b_less);
        _GET_SLIST_TYPE_LESS_FUNCTION(pslist_slist)(
            ((_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_iter))->_pby_data, pt_varg->_pby_data, &b_greater);
        if (b_less || b_greater) {
            it_iter = iterator_next(it_iter);
        } else {
            it_iter = slist_erase(pslist_slist, it_iter);
        }
    }

    _slist_destroy_varg_value_auxiliary(pslist_slist, pt_varg);
    _alloc_deallocate(&pslist_slist->_t_allocator, pt_varg, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
}
Exemplo n.º 2
0
/**
 * Assign slist with variable argument of specificed element.
 */
void _slist_assign_elem_varg(slist_t* pslist_slist, size_t t_count, va_list val_elemlist)
{
    slist_iterator_t it_iter;
    _slistnode_t*    pt_varg = NULL;
    bool_t           b_result = false;

    assert(pslist_slist != NULL);
    assert(_slist_is_inited(pslist_slist));

    slist_resize(pslist_slist, t_count);

    /* get varg value */
    pt_varg = _alloc_allocate(&pslist_slist->_t_allocator, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
    assert(pt_varg != NULL);
    _slist_get_varg_value_auxiliary(pslist_slist, val_elemlist, pt_varg);

    /* copy value from varg */
    for (it_iter = slist_begin(pslist_slist);
         !iterator_equal(it_iter, slist_end(pslist_slist));
         it_iter = iterator_next(it_iter)) {
        b_result = _GET_SLIST_TYPE_SIZE(pslist_slist);
        _GET_SLIST_TYPE_COPY_FUNCTION(pslist_slist)(
            ((_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_iter))->_pby_data, pt_varg->_pby_data, &b_result);
        assert(b_result);
    }

    /* destroy varg value */
    _slist_destroy_varg_value_auxiliary(pslist_slist, pt_varg);
    _alloc_deallocate(&pslist_slist->_t_allocator, pt_varg, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
}
Exemplo n.º 3
0
/**
 * Destroy slist container auxiliary function.
 */
void _slist_destroy_auxiliary(slist_t* pslist_slist)
{
    _slistnode_t* pt_node = NULL;
    bool_t        b_result = false;

    /* test the pslist_slist is valid */
    assert(pslist_slist != NULL);
    assert(_slist_is_inited(pslist_slist) || _slist_is_created(pslist_slist));

    /* _alloc_deallocate all nodes in slist */
    while (pslist_slist->_t_head._pt_next != NULL) {
        /* take out each node from the slist */
        pt_node = pslist_slist->_t_head._pt_next;
        pslist_slist->_t_head._pt_next = pt_node->_pt_next;
        pt_node->_pt_next = NULL;

        /* destroy the node itself */
        b_result = _GET_SLIST_TYPE_SIZE(pslist_slist);
        _GET_SLIST_TYPE_DESTROY_FUNCTION(pslist_slist)(pt_node->_pby_data, &b_result);
        assert(b_result);

        _alloc_deallocate(&pslist_slist->_t_allocator, pt_node, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
        pt_node = NULL;
    }

    /* _alloc_deallocate the allocator */
    _alloc_destroy(&pslist_slist->_t_allocator);
}
Exemplo n.º 4
0
/**
 * Reset the size of slist elements, and filled element is from variable argument slist.
 */
void _slist_resize_elem_varg(slist_t* pslist_slist, size_t t_resize, va_list val_elemlist)
{
    assert(pslist_slist != NULL);
    assert(_slist_is_inited(pslist_slist));

    if (t_resize <= slist_size(pslist_slist)) {
        slist_iterator_t it_pos = iterator_advance(slist_begin(pslist_slist), t_resize);
        slist_erase_range(pslist_slist, it_pos, slist_end(pslist_slist));
    } else {
        slist_iterator_t it_pos;
        _slistnode_t*    pt_node = NULL;
        _slistnode_t*    pt_varg = NULL;
        size_t           t_size = slist_size(pslist_slist);
        size_t           i = 0;
        bool_t           b_result = false;

        if (!slist_empty(pslist_slist)) {
            it_pos = slist_previous(pslist_slist, slist_end(pslist_slist));
        } else {
            _SLIST_ITERATOR_COREPOS(it_pos) = (_byte_t*)&pslist_slist->_t_head;
        }

        /* get varg value only once */
        pt_varg = _alloc_allocate(&pslist_slist->_t_allocator, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
        assert(pt_varg != NULL);
        _slist_get_varg_value_auxiliary(pslist_slist, val_elemlist, pt_varg);

        for (i = 0; i < t_resize - t_size; ++i) {
            pt_node = _alloc_allocate(&pslist_slist->_t_allocator, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
            assert(pt_node != NULL);
            _slist_init_node_auxiliary(pslist_slist, pt_node);

            /* copy value from varg */
            b_result = _GET_SLIST_TYPE_SIZE(pslist_slist);
            _GET_SLIST_TYPE_COPY_FUNCTION(pslist_slist)(pt_node->_pby_data, pt_varg->_pby_data, &b_result);
            assert(b_result);

            pt_node->_pt_next = ((_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_pos))->_pt_next;
            ((_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_pos))->_pt_next = pt_node;
            pt_node = NULL;
        }

        _slist_destroy_varg_value_auxiliary(pslist_slist, pt_varg);
        _alloc_deallocate(&pslist_slist->_t_allocator, pt_varg, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
    }
}
Exemplo n.º 5
0
/**
 * Destroy data, the data type and slist element data type are same.
 */
void _slist_destroy_varg_value_auxiliary(slist_t* pslist_slist, _slistnode_t* pt_node)
{
    bool_t b_result = false;

    assert(pslist_slist != NULL);
    assert(pt_node != NULL);
    assert(_slist_is_inited(pslist_slist) || _slist_is_created(pslist_slist));

    b_result = _GET_SLIST_TYPE_SIZE(pslist_slist);
    _GET_SLIST_TYPE_DESTROY_FUNCTION(pslist_slist)(pt_node->_pby_data, &b_result);
    assert(b_result);
}
Exemplo n.º 6
0
/**
 * Insert multiple copys of element after specificed position.
 */
void _slist_insert_after_n_varg(slist_t* pslist_slist, slist_iterator_t it_pos, size_t t_count, va_list val_elemlist)
{
    size_t        i = 0;
    _slistnode_t* pt_node = NULL;
    _slistnode_t* pt_varg = NULL;
    bool_t        b_result = false;

    assert(pslist_slist != NULL);
    assert(_slist_is_inited(pslist_slist));
    assert(_slist_iterator_belong_to_slist(pslist_slist, it_pos));
    assert(!iterator_equal(it_pos, slist_end(pslist_slist)));

    /* get varg value only once */
    pt_varg = _alloc_allocate(&pslist_slist->_t_allocator, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
    assert(pt_varg != NULL);
    _slist_get_varg_value_auxiliary(pslist_slist, val_elemlist, pt_varg);

    for (i = 0; i < t_count; ++i) {
        /* allocate slist node */
        pt_node = _alloc_allocate(&pslist_slist->_t_allocator, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
        assert(pt_node != NULL);
        _slist_init_node_auxiliary(pslist_slist, pt_node);

        /* copy value from varg */
        b_result = _GET_SLIST_TYPE_SIZE(pslist_slist);
        _GET_SLIST_TYPE_COPY_FUNCTION(pslist_slist)(pt_node->_pby_data, pt_varg->_pby_data, &b_result);
        assert(b_result);

        /* link the node to slist */
        pt_node->_pt_next = ((_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_pos))->_pt_next;
        ((_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_pos))->_pt_next = pt_node;
        pt_node = NULL;
    }

    /* destroy varg value */
    _slist_destroy_varg_value_auxiliary(pslist_slist, pt_varg);
    _alloc_deallocate(&pslist_slist->_t_allocator, pt_varg, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
}
Exemplo n.º 7
0
/**
 * Initialize slist with variable argument slist of specified element.
 */
void _slist_init_elem_varg(slist_t* pslist_slist, size_t t_count, va_list val_elemlist)
{
    _slistnode_t* pt_varg = NULL;
    bool_t        b_result = false;

    assert(pslist_slist != NULL);
    assert(_slist_is_created(pslist_slist));

    /* allocate memory for n_elemcount slist node */
    if (t_count > 0) {
        size_t        i = 0;
        _slistnode_t* pt_node = NULL;

        /* get varg value only once */
        pt_varg = _alloc_allocate(&pslist_slist->_t_allocator, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
        assert(pt_varg != NULL);
        _slist_get_varg_value_auxiliary(pslist_slist, val_elemlist, pt_varg);

        for (i = 0; i < t_count; ++i) {
            pt_node = _alloc_allocate(&pslist_slist->_t_allocator, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
            assert(pt_node != NULL);
            _slist_init_node_auxiliary(pslist_slist, pt_node);
            /* copy value from varg */
            b_result = _GET_SLIST_TYPE_SIZE(pslist_slist);
            _GET_SLIST_TYPE_COPY_FUNCTION(pslist_slist)(pt_node->_pby_data, pt_varg->_pby_data, &b_result);
            assert(b_result);

            /* insert the new slist node after the head */
            pt_node->_pt_next = pslist_slist->_t_head._pt_next;
            pslist_slist->_t_head._pt_next = pt_node;
            pt_node = NULL;
        }

        _slist_destroy_varg_value_auxiliary(pslist_slist, pt_varg);
        _alloc_deallocate(&pslist_slist->_t_allocator, pt_varg, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
    }
}
Exemplo n.º 8
0
/**
 * Add specificed element from variable argument slist at the begin of slist container. 
 */
void _slist_push_front_varg(slist_t* pslist_slist, va_list val_elemlist)
{
    _slistnode_t* pt_node = NULL;

    assert(pslist_slist != NULL);
    assert(_slist_is_inited(pslist_slist));

    /* allocate memory for new element and copy the element from elemlist */
    pt_node = _alloc_allocate(&pslist_slist->_t_allocator, _SLIST_NODE_SIZE(_GET_SLIST_TYPE_SIZE(pslist_slist)), 1);
    assert(pt_node != NULL);
    _slist_get_varg_value_auxiliary(pslist_slist, val_elemlist, pt_node);

    /* insert the element after the head */
    pt_node->_pt_next = pslist_slist->_t_head._pt_next;
    pslist_slist->_t_head._pt_next = pt_node;
}
Exemplo n.º 9
0
/**
 * Set data value referenced by iterator.
 */
void _slist_iterator_set_value(slist_iterator_t it_iter, const void* cpv_value)
{
    assert(cpv_value != NULL);
    assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_iter), it_iter));
    assert(!iterator_equal(it_iter, slist_end(_SLIST_ITERATOR_CONTAINER(it_iter))));

    /* char* */
    if (strncmp(_GET_SLIST_TYPE_BASENAME(_SLIST_ITERATOR_CONTAINER(it_iter)), _C_STRING_TYPE, _TYPE_NAME_SIZE) == 0) {
        string_assign_cstr((string_t*)((_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_iter))->_pby_data, (char*)cpv_value);
    } else {
        bool_t b_result = _GET_SLIST_TYPE_SIZE(_SLIST_ITERATOR_CONTAINER(it_iter));
        _GET_SLIST_TYPE_COPY_FUNCTION(_SLIST_ITERATOR_CONTAINER(it_iter))(
            ((_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_iter))->_pby_data, cpv_value, &b_result);
        assert(b_result);
    }
}
Exemplo n.º 10
0
/**
 * Initialize element with slist element type auxiliary function.
 */
void _slist_init_elem_auxiliary(slist_t* pslist_slist, void* pv_value)
{
    assert(pslist_slist != NULL);
    assert(pv_value != NULL);
    assert(_slist_is_inited(pslist_slist) || _slist_is_created(pslist_slist));

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

        _GET_SLIST_TYPE_INIT_FUNCTION(pslist_slist)(pv_value, s_elemtypename);
    } else {
        bool_t b_result = _GET_SLIST_TYPE_SIZE(pslist_slist);
        _GET_SLIST_TYPE_INIT_FUNCTION(pslist_slist)(pv_value, &b_result);
        assert(b_result);
    }
}