/** * 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; } }
/** * Testing of the first iterator is less than the second iterator. */ bool_t _deque_iterator_less(deque_iterator_t it_first, deque_iterator_t it_second) { assert(_iterator_same_type(it_first, it_second)); 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_MAP_POINTER(it_first) < _DEQUE_ITERATOR_MAP_POINTER(it_second)) { /* it_first and it_second are deque_begin(); */ if(_DEQUE_ITERATOR_COREPOS(it_first) == _DEQUE_ITERATOR_AFTERLAST_POS(it_first) && _DEQUE_ITERATOR_COREPOS(it_second) == _DEQUE_ITERATOR_FIRST_POS(it_second) && _DEQUE_ITERATOR_MAP_POINTER(it_first) + 1 == _DEQUE_ITERATOR_MAP_POINTER(it_second)) { return false; } else { return true; } } else if(_DEQUE_ITERATOR_MAP_POINTER(it_first) == _DEQUE_ITERATOR_MAP_POINTER(it_second)) { return _DEQUE_ITERATOR_COREPOS(it_first) < _DEQUE_ITERATOR_COREPOS(it_second) ? true : false; } else { return false; } }
/** * Compare two iterators for equality. */ bool_t _vector_iterator_equal(vector_iterator_t it_first, vector_iterator_t it_second) { assert(_iterator_same_type(it_first, it_second)); assert(_VECTOR_ITERATOR_CONTAINER(it_first) == _VECTOR_ITERATOR_CONTAINER(it_second)); assert(_vector_iterator_belong_to_vector(_VECTOR_ITERATOR_CONTAINER(it_first), it_first)); assert(_vector_iterator_belong_to_vector(_VECTOR_ITERATOR_CONTAINER(it_second), it_second)); return _VECTOR_ITERATOR_COREPOS(it_first) == _VECTOR_ITERATOR_COREPOS(it_second) ? true : false; }
/** * Test the two slist iterator are equal. */ bool_t _slist_iterator_equal(slist_iterator_t it_first, slist_iterator_t it_second) { 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)); return _SLIST_ITERATOR_COREPOS(it_first) == _SLIST_ITERATOR_COREPOS(it_second) ? true : false; }
/** * Calculate the distance between two iterators. */ int _vector_iterator_minus(vector_iterator_t it_first, vector_iterator_t it_second) { assert(_iterator_same_type(it_first, it_second)); assert(_VECTOR_ITERATOR_CONTAINER(it_first) == _VECTOR_ITERATOR_CONTAINER(it_second)); assert(_vector_iterator_belong_to_vector(_VECTOR_ITERATOR_CONTAINER(it_first), it_first)); assert(_vector_iterator_belong_to_vector(_VECTOR_ITERATOR_CONTAINER(it_second), it_second)); return (_VECTOR_ITERATOR_COREPOS(it_first) - _VECTOR_ITERATOR_COREPOS(it_second)) / (int)_GET_VECTOR_TYPE_SIZE(_VECTOR_ITERATOR_CONTAINER(it_first)); }
/** * Compare two iterators for equality. */ bool_t _deque_iterator_equal(deque_iterator_t it_first, deque_iterator_t it_second) { assert(_iterator_same_type(it_first, it_second)); 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_MAP_POINTER(it_first) == _DEQUE_ITERATOR_MAP_POINTER(it_second) && _DEQUE_ITERATOR_FIRST_POS(it_first) == _DEQUE_ITERATOR_FIRST_POS(it_second) && _DEQUE_ITERATOR_AFTERLAST_POS(it_first) == _DEQUE_ITERATOR_AFTERLAST_POS(it_second) && _DEQUE_ITERATOR_COREPOS(it_first) == _DEQUE_ITERATOR_COREPOS(it_second)) { return true; } else { /* * if the start corepos equal to the after last node and the finish * corepos equal to the first position, the two iterator equal to. */ if(_DEQUE_ITERATOR_MAP_POINTER(it_first) < _DEQUE_ITERATOR_MAP_POINTER(it_second)) { if(_DEQUE_ITERATOR_MAP_POINTER(it_first) + 1 == _DEQUE_ITERATOR_MAP_POINTER(it_second) && _DEQUE_ITERATOR_COREPOS(it_first) == _DEQUE_ITERATOR_AFTERLAST_POS(it_first) && _DEQUE_ITERATOR_COREPOS(it_second) == _DEQUE_ITERATOR_FIRST_POS(it_second)) { /* the it_first must be deque_begin. */ assert(_DEQUE_ITERATOR_MAP_POINTER(it_first) == _DEQUE_ITERATOR_MAP_POINTER(_DEQUE_ITERATOR_CONTAINER(it_first)->_t_start)); return true; } else { return false; } } else { if(_DEQUE_ITERATOR_MAP_POINTER(it_second) + 1 == _DEQUE_ITERATOR_MAP_POINTER(it_first) && _DEQUE_ITERATOR_COREPOS(it_second) == _DEQUE_ITERATOR_AFTERLAST_POS(it_second) && _DEQUE_ITERATOR_COREPOS(it_first) == _DEQUE_ITERATOR_FIRST_POS(it_first)) { /* the it_second must be deque_begin. */ assert(_DEQUE_ITERATOR_MAP_POINTER(it_second) == _DEQUE_ITERATOR_MAP_POINTER(_DEQUE_ITERATOR_CONTAINER(it_second)->_t_start)); return true; } else { return false; } } } }
/** * 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; } }
/** * Test the first iterator is before the second. */ bool_t _slist_iterator_before(slist_iterator_t it_first, slist_iterator_t it_second) { _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_COREPOS(it_first) == _SLIST_ITERATOR_COREPOS(it_second)) { return false; } for (pt_node = (_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_first); pt_node != NULL; pt_node = pt_node->_pt_next) { if (pt_node == (_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_second)) { return true; } } return _SLIST_ITERATOR_COREPOS(it_second) == NULL ? true : false; }
/** * Iterator distance for all iterator type. */ int iterator_distance(iterator_t it_first, iterator_t it_second) { assert(_iterator_is_valid(it_first)); assert(_iterator_is_valid(it_second)); assert(_iterator_same_type(it_first, it_second)); switch (it_first._t_containertype) { case _VECTOR_CONTAINER: case _DEQUE_CONTAINER: case _BASIC_STRING_CONTAINER: return iterator_minus(it_second, it_first); break; case _LIST_CONTAINER: return _list_iterator_distance(it_first, it_second); break; /* case _SLIST_CONTAINER: return _slist_iterator_distance(it_first, it_second); break; */ case _SET_CONTAINER: return _set_iterator_distance(it_first, it_second); break; case _MAP_CONTAINER: return _map_iterator_distance(it_first, it_second); break; case _HASH_SET_CONTAINER: return _hash_set_iterator_distance(it_first, it_second); break; case _HASH_MAP_CONTAINER: return _hash_map_iterator_distance(it_first, it_second); break; default: assert(false); return 0; break; } }
/** * Test whether the [it_first, it_end) is valid range. */ bool_t _iterator_valid_range(iterator_t it_first, iterator_t it_end, iteratortype_t t_type) { return _iterator_same_type(it_first, it_end) && _iterator_limit_type(it_first, t_type) && (iterator_equal(it_first, it_end) || _iterator_before(it_first, it_end)); }