/** * Calculate distance between two iterators. */ int _slist_iterator_distance(slist_iterator_t it_first, slist_iterator_t it_second) { int n_distance = 0; _slistnode_t* pt_node = NULL; assert(_iterator_same_type(it_first, it_second)); assert(_SLIST_ITERATOR_CONTAINER(it_first) == _SLIST_ITERATOR_CONTAINER(it_second)); assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_first), it_first)); assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_second), it_second)); if (_slist_iterator_before(it_first, it_second)) { for (pt_node = (_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_first); pt_node != (_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_second); pt_node = pt_node->_pt_next) { n_distance++; } return n_distance; } else if (_slist_iterator_before(it_second, it_first)) { for (pt_node = (_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_second); pt_node != (_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_first); pt_node = pt_node->_pt_next) { n_distance++; } return -n_distance; } else { return 0; } }
/** * Transfer the range [it_begin, it_end) to position it_pos. */ void _slist_transfer(slist_iterator_t it_pos, slist_iterator_t it_begin, slist_iterator_t it_end) { assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_pos), it_pos)); assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_begin), it_begin)); assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_end), it_end)); assert(_SLIST_ITERATOR_CONTAINER(it_begin) == _SLIST_ITERATOR_CONTAINER(it_end)); assert(iterator_equal(it_begin, it_end) || _slist_iterator_before(it_begin, it_end)); assert(_slist_same_slist_iterator_type(_SLIST_ITERATOR_CONTAINER(it_pos), it_begin)); /* empty range */ if(iterator_equal(it_begin, it_end)) { return; } /* same slist container */ if(_SLIST_ITERATOR_CONTAINER(it_pos) == _SLIST_ITERATOR_CONTAINER(it_begin)) { assert(iterator_equal(it_pos, it_begin) || iterator_equal(it_pos, it_end) || _slist_iterator_before(it_pos, it_begin) || _slist_iterator_before(it_end, it_pos)); if(iterator_equal(it_pos, it_begin) || iterator_equal(it_pos, it_end)) { return; } } slist_insert_range(_SLIST_ITERATOR_CONTAINER(it_pos), it_pos, it_begin, it_end); slist_erase_range(_SLIST_ITERATOR_CONTAINER(it_begin), it_begin, it_end); }
/** * 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; } }