/** * 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); }
/** * Add specificed element from variable argument list at the end of vector container. */ void _vector_push_back_varg(vector_t* pvec_vector, va_list val_elemlist) { _byte_t* pby_last = NULL; assert(pvec_vector != NULL); assert(_vector_is_inited(pvec_vector)); /* if the remain capacity is less then the element count */ if (vector_capacity(pvec_vector) == vector_size(pvec_vector)) { vector_reserve(pvec_vector, _vector_calculate_new_capacity(vector_size(pvec_vector), 1)); } /* initialize the last element */ pby_last = pvec_vector->_pby_finish; assert(pby_last != NULL); pvec_vector->_pby_finish += _GET_VECTOR_TYPE_SIZE(pvec_vector); _vector_init_elem_auxiliary(pvec_vector, pby_last); /* copy value from varg */ _type_get_varg_value(&pvec_vector->_t_typeinfo, val_elemlist, pby_last); }
/** * Initialize an element according to the type of iterator pointed data. */ void* _iterator_allocate_init_elem(iterator_t it_iter) { void* pv_value = NULL; assert(_iterator_is_valid(it_iter)); switch (it_iter._t_containertype) { case _VECTOR_CONTAINER: pv_value = _alloc_allocate(&((vector_t*)it_iter._pt_container)->_t_allocator, ((vector_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typesize, 1); _vector_init_elem_auxiliary((vector_t*)it_iter._pt_container, pv_value); break; case _DEQUE_CONTAINER: pv_value = _alloc_allocate(&((deque_t*)it_iter._pt_container)->_t_allocator, ((deque_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typesize, 1); _deque_init_elem_auxiliary((deque_t*)it_iter._pt_container, pv_value); break; case _BASIC_STRING_CONTAINER: pv_value = _alloc_allocate(&((basic_string_t*)it_iter._pt_container)->_vec_base._t_allocator, ((basic_string_t*)it_iter._pt_container)->_vec_base._t_typeinfo._pt_type->_t_typesize, 1); _basic_string_init_elem_auxiliary((basic_string_t*)it_iter._pt_container, pv_value); break; case _LIST_CONTAINER: pv_value = _alloc_allocate(&((list_t*)it_iter._pt_container)->_t_allocator, ((list_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typesize, 1); _list_init_elem_auxiliary((list_t*)it_iter._pt_container, pv_value); break; case _SLIST_CONTAINER: pv_value = _alloc_allocate(&((slist_t*)it_iter._pt_container)->_t_allocator, ((slist_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typesize, 1); _slist_init_elem_auxiliary((slist_t*)it_iter._pt_container, pv_value); break; case _SET_CONTAINER: pv_value = _alloc_allocate(&((set_t*)it_iter._pt_container)->_t_tree._t_allocator, ((set_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typesize, 1); _set_init_elem_auxiliary((set_t*)it_iter._pt_container, pv_value); break; case _MULTISET_CONTAINER: pv_value = _alloc_allocate(&((multiset_t*)it_iter._pt_container)->_t_tree._t_allocator, ((set_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typesize, 1); _multiset_init_elem_auxiliary((multiset_t*)it_iter._pt_container, pv_value); break; case _MAP_CONTAINER: pv_value = _alloc_allocate(&((map_t*)it_iter._pt_container)->_t_tree._t_allocator, ((map_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typesize, 1); _map_init_elem_auxiliary((map_t*)it_iter._pt_container, pv_value); break; case _MULTIMAP_CONTAINER: pv_value = _alloc_allocate(&((multimap_t*)it_iter._pt_container)->_t_tree._t_allocator, ((multimap_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typesize, 1); _multimap_init_elem_auxiliary((multimap_t*)it_iter._pt_container, pv_value); break; case _HASH_SET_CONTAINER: pv_value = _alloc_allocate(&((hash_set_t*)it_iter._pt_container)->_t_hashtable._t_allocator, ((hash_set_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typesize, 1); _hash_set_init_elem_auxiliary((hash_set_t*)it_iter._pt_container, pv_value); break; case _HASH_MULTISET_CONTAINER: pv_value = _alloc_allocate(&((hash_multiset_t*)it_iter._pt_container)->_t_hashtable._t_allocator, ((hash_multiset_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typesize, 1); _hash_multiset_init_elem_auxiliary((hash_multiset_t*)it_iter._pt_container, pv_value); break; case _HASH_MAP_CONTAINER: pv_value = _alloc_allocate(&((hash_map_t*)it_iter._pt_container)->_t_hashtable._t_allocator, ((hash_map_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typesize, 1); _hash_map_init_elem_auxiliary((hash_map_t*)it_iter._pt_container, pv_value); break; case _HASH_MULTIMAP_CONTAINER: pv_value = _alloc_allocate(&((hash_multimap_t*)it_iter._pt_container)->_t_hashtable._t_allocator, ((hash_multimap_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typesize, 1); _hash_multimap_init_elem_auxiliary((hash_multimap_t*)it_iter._pt_container, pv_value); break; default: assert(false); pv_value = NULL; break; } return pv_value; }