/** * 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); } }
/** * 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); } }
/** * 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); } }
/** * 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; }