コード例 #1
0
ファイル: cstl_vector_aux.c プロジェクト: Aluonna/libcstl
/**
 * Test the type that saved in the vector container is same.
 */
bool_t _vector_same_type(const vector_t* cpvec_first, const vector_t* cpvec_second)
{
    assert(cpvec_first != NULL);
    assert(cpvec_second != NULL);
    assert(_vector_is_inited(cpvec_first) || _vector_is_created(cpvec_first));
    assert(_vector_is_inited(cpvec_second) || _vector_is_created(cpvec_second));

    if (cpvec_first == cpvec_second) {
        return true;
    }

    return (cpvec_first->_t_typeinfo._pt_type == cpvec_second->_t_typeinfo._pt_type) &&
           (cpvec_first->_t_typeinfo._t_style == cpvec_second->_t_typeinfo._t_style) &&
           _type_is_same(_GET_VECTOR_TYPE_NAME(cpvec_first), _GET_VECTOR_TYPE_NAME(cpvec_second));
}
コード例 #2
0
/**
 * Destroy vector container auxiliary function.
 */
void _vector_destroy_auxiliary(vector_t* pvec_vector)
{
    vector_iterator_t it_iter;
    vector_iterator_t it_begin;
    vector_iterator_t it_end;
    bool_t            b_result = false;

    assert(pvec_vector != NULL);
    assert(_vector_is_inited(pvec_vector) || _vector_is_created(pvec_vector));

    /* destroy all elements */
    it_begin = vector_begin(pvec_vector);
    it_end = vector_end(pvec_vector);
    for (it_iter = it_begin; !iterator_equal(it_iter, it_end); it_iter = iterator_next(it_iter)) {
        b_result = _GET_VECTOR_TYPE_SIZE(pvec_vector);
        _GET_VECTOR_TYPE_DESTROY_FUNCTION(pvec_vector)(_VECTOR_ITERATOR_COREPOS(it_iter), &b_result);
        assert(b_result);
    }
    /* free vector memory */
    if (pvec_vector->_pby_start != NULL) {
        _alloc_deallocate(&pvec_vector->_t_allocator, pvec_vector->_pby_start, _GET_VECTOR_TYPE_SIZE(pvec_vector), 
            (pvec_vector->_pby_endofstorage - pvec_vector->_pby_start) / _GET_VECTOR_TYPE_SIZE(pvec_vector));
    }
    _alloc_destroy(&pvec_vector->_t_allocator);

    pvec_vector->_pby_start = NULL;
    pvec_vector->_pby_finish = NULL;
    pvec_vector->_pby_endofstorage = NULL;
}
コード例 #3
0
/**
 * Initialize vector with variable argument list of specified element.
 */
void _vector_init_elem_varg(vector_t* pvec_vector, size_t t_count, va_list val_elemlist)
{
    void*             pv_varg = NULL;
    bool_t            b_result = false;
    vector_iterator_t it_iter;
    vector_iterator_t it_begin;
    vector_iterator_t it_end;

    assert(pvec_vector != NULL);
    assert(_vector_is_created(pvec_vector));

    /* initialize vector_t */
    vector_init_n(pvec_vector, t_count);
    if (t_count > 0) {
        /* get varg value only once */
        pv_varg = _alloc_allocate(&pvec_vector->_t_allocator, _GET_VECTOR_TYPE_SIZE(pvec_vector), 1);
        assert(pv_varg != NULL);
        _vector_get_varg_value_auxiliary(pvec_vector, val_elemlist, pv_varg);

        /* copy varg value to each element */
        it_begin = vector_begin(pvec_vector);
        it_end = vector_end(pvec_vector);
        for (it_iter = it_begin; !iterator_equal(it_iter, it_end); it_iter = iterator_next(it_iter)) {
            /* copy from varg */
            b_result = _GET_VECTOR_TYPE_SIZE(pvec_vector);
            _GET_VECTOR_TYPE_COPY_FUNCTION(pvec_vector)(_VECTOR_ITERATOR_COREPOS(it_iter), pv_varg, &b_result);
            assert(b_result);
        }

        /* destroy varg value and free memory */
        _vector_destroy_varg_value_auxiliary(pvec_vector, pv_varg);
        _alloc_deallocate(&pvec_vector->_t_allocator, pv_varg, _GET_VECTOR_TYPE_SIZE(pvec_vector), 1);
    }
}
コード例 #4
0
ファイル: cstl_vector.c プロジェクト: coderXing/libcstl
/**
 * 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));
}
コード例 #5
0
ファイル: cstl_vector.c プロジェクト: coderXing/libcstl
/**
 * Initialize empty vector container.
 */
void vector_init(vector_t* pvec_vector)
{
    assert(pvec_vector != NULL);
    assert(_vector_is_created(pvec_vector));

    vector_init_n(pvec_vector, 0);
}
コード例 #6
0
ファイル: cstl_vector_aux.c プロジェクト: Aluonna/libcstl
/**
 * Initialize data within range [pby_start, pby_finish) according to vector element data type.
 */
void _vector_init_elem_range_auxiliary(vector_t* pvec_vector, _byte_t* pby_start, _byte_t* pby_finish)
{
    _byte_t* pby_pos = NULL;

    assert(pvec_vector != NULL);
    assert(pby_start != NULL);
    assert(pby_finish != NULL);
    assert(pby_start <= pby_finish);
    assert(_vector_is_inited(pvec_vector) || _vector_is_created(pvec_vector));

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

        for (pby_pos = pby_start; pby_pos < pby_finish; pby_pos += _GET_VECTOR_TYPE_SIZE(pvec_vector)) {
            _GET_VECTOR_TYPE_INIT_FUNCTION(pvec_vector)(pby_pos, s_elemtypename);
        }
    } else {
        for (pby_pos = pby_start; pby_pos < pby_finish; pby_pos += _GET_VECTOR_TYPE_SIZE(pvec_vector)) {
            bool_t b_result = _GET_VECTOR_TYPE_SIZE(pvec_vector);
            _GET_VECTOR_TYPE_INIT_FUNCTION(pvec_vector)(pby_pos, &b_result);
            assert(b_result);
        }
    }
}
コード例 #7
0
ファイル: cstl_vector_aux.c プロジェクト: Aluonna/libcstl
/**
 * Test the type that saved in the vector container and referenced by it_iter are same.
 */
bool_t _vector_same_iterator_type(const vector_t* cpvec_vector, iterator_t it_iter)
{
    assert(cpvec_vector != NULL);
    assert(_vector_is_inited(cpvec_vector) || _vector_is_created(cpvec_vector));
    assert(_iterator_is_valid(it_iter));

    return _type_is_same_ex(&cpvec_vector->_t_typeinfo, _iterator_get_typeinfo(it_iter));
}
コード例 #8
0
ファイル: cstl_vector.c プロジェクト: coderXing/libcstl
/**
 * Destroy vector container.
 */
void vector_destroy(vector_t* pvec_vector)
{
    assert(pvec_vector != NULL);
    assert(_vector_is_inited(pvec_vector) || _vector_is_created(pvec_vector));

    _vector_destroy_auxiliary(pvec_vector);
    /* free memory that malloced in _create_vector() function */
    free(pvec_vector);
}
コード例 #9
0
ファイル: cstl_vector_aux.c プロジェクト: Aluonna/libcstl
/**
 * Obtain data from variable argument list, the data type and vector element data type are same.
 */
void _vector_get_varg_value_auxiliary(vector_t* pvec_vector, va_list val_elemlist, void* pv_varg)
{
    assert(pvec_vector != NULL);
    assert(pv_varg != NULL);
    assert(_vector_is_inited(pvec_vector) || _vector_is_created(pvec_vector));

    _vector_init_elem_auxiliary(pvec_vector, pv_varg);
    _type_get_varg_value(&pvec_vector->_t_typeinfo, val_elemlist, pv_varg);
}
コード例 #10
0
ファイル: cstl_vector.c プロジェクト: coderXing/libcstl
/**
 * Initialize vector container with an exist vector container.
 */
void vector_init_copy(vector_t* pvec_dest, const vector_t* cpvec_src)
{
    assert(pvec_dest != NULL);
    assert(cpvec_src != NULL);
    assert(_vector_is_created(pvec_dest));
    assert(_vector_is_inited(cpvec_src));
    assert(_vector_same_type(pvec_dest, cpvec_src));

    vector_init_copy_range(pvec_dest, vector_begin(cpvec_src), vector_end(cpvec_src));
}
コード例 #11
0
/**
 * Initialize vector with specified element.
 */
void _vector_init_elem(vector_t* pvec_vector, size_t t_count, ...)
{
    va_list val_elemlist;

    assert(pvec_vector != NULL);
    assert(_vector_is_created(pvec_vector));

    va_start(val_elemlist, t_count);
    _vector_init_elem_varg(pvec_vector, t_count, val_elemlist);
    va_end(val_elemlist);
}
コード例 #12
0
ファイル: cstl_vector_aux.c プロジェクト: Aluonna/libcstl
/**
 * Destroy data, the data type and vector element data type are same.
 */
void _vector_destroy_varg_value_auxiliary(vector_t* pvec_vector, void* pv_varg)
{
    bool_t b_result = false;

    assert(pvec_vector != NULL);
    assert(pv_varg != NULL);
    assert(_vector_is_inited(pvec_vector) || _vector_is_created(pvec_vector));

    /* destroy varg value and free memory */
    b_result = _GET_VECTOR_TYPE_SIZE(pvec_vector);
    _GET_VECTOR_TYPE_DESTROY_FUNCTION(pvec_vector)(pv_varg, &b_result);
    assert(b_result);
}
コード例 #13
0
ファイル: cstl_vector.c プロジェクト: coderXing/libcstl
/**
 * Initialize vector container with mutiple default element.
 */
void vector_init_n(vector_t* pvec_vector, size_t t_count)
{
    assert(pvec_vector != NULL);
    assert(_vector_is_created(pvec_vector));

    if(t_count > 0)
    {
        size_t t_newcapacity = _vector_calculate_new_capacity(0, t_count);

        pvec_vector->_pby_start = _alloc_allocate(&pvec_vector->_t_allocator, _GET_VECTOR_TYPE_SIZE(pvec_vector), t_newcapacity);
        assert(pvec_vector->_pby_start != NULL);
        pvec_vector->_pby_finish = pvec_vector->_pby_start + _GET_VECTOR_TYPE_SIZE(pvec_vector) * t_count;
        pvec_vector->_pby_endofstorage = pvec_vector->_pby_start + _GET_VECTOR_TYPE_SIZE(pvec_vector) * t_newcapacity;

        /* initialize all elements */
        _vector_init_elem_range_auxiliary(pvec_vector, pvec_vector->_pby_start, pvec_vector->_pby_finish);
    }
}
コード例 #14
0
/**
 * Initialize element with vector element type auxiliary function.
 */
void _vector_init_elem_auxiliary(vector_t* pvec_vector, void* pv_elem)
{
    assert(pvec_vector != NULL);
    assert(pv_elem != NULL);
    assert(_vector_is_inited(pvec_vector) || _vector_is_created(pvec_vector));

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

        _GET_VECTOR_TYPE_INIT_FUNCTION(pvec_vector)(pv_elem, s_elemtypename);
    } else {
        bool_t b_result = _GET_VECTOR_TYPE_SIZE(pvec_vector);
        _GET_VECTOR_TYPE_INIT_FUNCTION(pvec_vector)(pv_elem, &b_result);
        assert(b_result);
    }
}
コード例 #15
0
/**
 * Test hashtable is created by _create_hashtable.
 */
bool_t _hashtable_is_created(const _hashtable_t* cpt_hashtable)
{
    assert(cpt_hashtable != NULL);

    if (cpt_hashtable->_t_typeinfo._t_style != _TYPE_C_BUILTIN &&
        cpt_hashtable->_t_typeinfo._t_style != _TYPE_CSTL_BUILTIN &&
        cpt_hashtable->_t_typeinfo._t_style != _TYPE_USER_DEFINE) {
        return false;
    }
    if (cpt_hashtable->_t_typeinfo._pt_type == NULL) {
        return false;
    }

    if (!_vector_is_created(&cpt_hashtable->_vec_bucket)) {
        return false;
    }

    if (cpt_hashtable->_t_nodecount != 0 || cpt_hashtable->_ufun_hash != NULL || cpt_hashtable->_bfun_compare != NULL) {
        return false;
    }

    return _alloc_is_inited(&cpt_hashtable->_t_allocator);
}