/** * Calculate the distance between two iterators. */ int _deque_iterator_minus(deque_iterator_t it_first, deque_iterator_t it_second) { int n_span = 0; int n_prefix = 0; int n_suffix = 0; assert(_DEQUE_ITERATOR_CONTAINER(it_first) == _DEQUE_ITERATOR_CONTAINER(it_second)); assert(_deque_iterator_belong_to_deque(_DEQUE_ITERATOR_CONTAINER(it_first), it_first)); assert(_deque_iterator_belong_to_deque(_DEQUE_ITERATOR_CONTAINER(it_second), it_second)); if(_deque_iterator_equal(it_first, it_second)) { return 0; } else if(_deque_iterator_before(it_first, it_second)) { n_span = (_DEQUE_ITERATOR_MAP_POINTER(it_second) - _DEQUE_ITERATOR_MAP_POINTER(it_first) - 1) * _DEQUE_ELEM_COUNT; n_prefix = (_DEQUE_ITERATOR_AFTERLAST_POS(it_first) - _DEQUE_ITERATOR_COREPOS(it_first)) / _GET_DEQUE_TYPE_SIZE(_DEQUE_ITERATOR_CONTAINER(it_first)); n_suffix = (_DEQUE_ITERATOR_COREPOS(it_second) - _DEQUE_ITERATOR_FIRST_POS(it_second)) / _GET_DEQUE_TYPE_SIZE(_DEQUE_ITERATOR_CONTAINER(it_second)); return -(n_prefix + n_span + n_suffix); } else { n_span = (_DEQUE_ITERATOR_MAP_POINTER(it_first) - _DEQUE_ITERATOR_MAP_POINTER(it_second) - 1) * _DEQUE_ELEM_COUNT; n_prefix = (_DEQUE_ITERATOR_AFTERLAST_POS(it_second) - _DEQUE_ITERATOR_COREPOS(it_second)) / _GET_DEQUE_TYPE_SIZE(_DEQUE_ITERATOR_CONTAINER(it_second)); n_suffix = (_DEQUE_ITERATOR_COREPOS(it_first) - _DEQUE_ITERATOR_FIRST_POS(it_first)) / _GET_DEQUE_TYPE_SIZE(_DEQUE_ITERATOR_CONTAINER(it_first)); return n_prefix + n_span + n_suffix; } }
/** * 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); } } }
/** * 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; }
/** * Test whether an iterator on another front. */ bool_t _iterator_before(iterator_t it_first, iterator_t it_second) { assert(_iterator_same_type(it_first, it_second)); switch (it_first._t_containertype) { case _VECTOR_CONTAINER: return _vector_iterator_before(it_first, it_second); break; case _DEQUE_CONTAINER: return _deque_iterator_before(it_first, it_second); break; case _LIST_CONTAINER: return _list_iterator_before(it_first, it_second); break; case _SLIST_CONTAINER: return _slist_iterator_before(it_first, it_second); break; case _SET_CONTAINER: return _set_iterator_before(it_first, it_second); break; case _MULTISET_CONTAINER: return _multiset_iterator_before(it_first, it_second); break; case _MAP_CONTAINER: return _map_iterator_before(it_first, it_second); break; case _MULTIMAP_CONTAINER: return _multimap_iterator_before(it_first, it_second); break; case _HASH_SET_CONTAINER: return _hash_set_iterator_before(it_first, it_second); break; case _HASH_MULTISET_CONTAINER: return _hash_multiset_iterator_before(it_first, it_second); break; case _HASH_MAP_CONTAINER: return _hash_map_iterator_before(it_first, it_second); break; case _HASH_MULTIMAP_CONTAINER: return _hash_multimap_iterator_before(it_first, it_second); break; case _BASIC_STRING_CONTAINER: return _basic_string_iterator_before(it_first, it_second); break; default: return false; break; } }