/** * Calculate distance between two iterators. */ int _rb_tree_iterator_distance(_rb_tree_iterator_t it_first, _rb_tree_iterator_t it_second) { _rb_tree_iterator_t it_iter; int n_distance = 0; assert(_rb_tree_iterator_belong_to_rb_tree(_RB_TREE_ITERATOR_TREE(it_first), it_first)); assert(_rb_tree_iterator_belong_to_rb_tree(_RB_TREE_ITERATOR_TREE(it_second), it_second)); assert(_RB_TREE_ITERATOR_TREE(it_first) == _RB_TREE_ITERATOR_TREE(it_second)); if (_rb_tree_iterator_before(it_first, it_second)) { for (it_iter = it_first; !_rb_tree_iterator_equal(it_iter, it_second); it_iter = _rb_tree_iterator_next(it_iter)) { n_distance++; } return n_distance; } else if (_rb_tree_iterator_before(it_second, it_first)) { for (it_iter = it_second; !_rb_tree_iterator_equal(it_iter, it_first); it_iter = _rb_tree_iterator_next(it_iter)) { n_distance++; } return -n_distance; } else { return 0; } }
/** * Test the first iterator is before the second. */ bool_t _set_iterator_before(set_iterator_t it_first, set_iterator_t it_second) { assert(_GET_SET_CONTAINER_TYPE(it_first) == _SET_CONTAINER); assert(_GET_SET_ITERATOR_TYPE(it_first) == _BIDIRECTIONAL_ITERATOR); assert(_GET_SET_CONTAINER_TYPE(it_second) == _SET_CONTAINER); assert(_GET_SET_ITERATOR_TYPE(it_second) == _BIDIRECTIONAL_ITERATOR); assert(_GET_SET_CONTAINER(it_first) == _GET_SET_CONTAINER(it_second)); #ifdef CSTL_SET_AVL_TREE return _avl_tree_iterator_before(it_first, it_second); #else return _rb_tree_iterator_before(it_first, it_second); #endif }
void test__rb_tree_iterator_before__invalid_second(void** state) { _rb_tree_t* pt_rb_tree = _create_rb_tree("int"); _rb_tree_iterator_t it_first; _rb_tree_iterator_t it_second; _rb_tree_init(pt_rb_tree, NULL); it_first = _rb_tree_begin(pt_rb_tree); it_second = _rb_tree_begin(pt_rb_tree); it_second._t_pos._t_treepos._pby_corepos = NULL; expect_assert_failure(_rb_tree_iterator_before(it_first, it_second)); _rb_tree_destroy(pt_rb_tree); }
void test__rb_tree_iterator_before__equal(void** state) { _rb_tree_t* pt_rb_tree = _create_rb_tree("int"); _rb_tree_iterator_t it_first; _rb_tree_iterator_t it_second; int elem = 100; _rb_tree_init(pt_rb_tree, NULL); _rb_tree_insert_unique(pt_rb_tree, &elem); it_first = _rb_tree_begin(pt_rb_tree); it_second = _rb_tree_begin(pt_rb_tree); assert_false(_rb_tree_iterator_before(it_first, it_second)); _rb_tree_destroy(pt_rb_tree); }
void test__rb_tree_iterator_before__not_same_rb_tree(void** state) { _rb_tree_t* pt_first = _create_rb_tree("int"); _rb_tree_t* pt_second = _create_rb_tree("int"); _rb_tree_iterator_t it_first; _rb_tree_iterator_t it_second; _rb_tree_init(pt_first, NULL); _rb_tree_init(pt_second, NULL); it_first = _rb_tree_begin(pt_first); it_second = _rb_tree_begin(pt_second); expect_assert_failure(_rb_tree_iterator_before(it_first, it_second)); _rb_tree_destroy(pt_first); _rb_tree_destroy(pt_second); }
bool_t _map_iterator_before( const map_iterator_t* cpt_iteratorfirst, const map_iterator_t* cpt_iteratorsecond) { assert(cpt_iteratorfirst != NULL && cpt_iteratorsecond != NULL); assert( _GET_MAP_CONTAINER_TYPE(cpt_iteratorfirst) == _MAP_CONTAINER && _GET_MAP_ITERATOR_TYPE(cpt_iteratorfirst) == _BIDIRECTIONAL_ITERATOR && _GET_MAP_CONTAINER_TYPE(cpt_iteratorsecond) == _MAP_CONTAINER && _GET_MAP_ITERATOR_TYPE(cpt_iteratorsecond) == _BIDIRECTIONAL_ITERATOR && _GET_MAP_CONTAINER(cpt_iteratorfirst) == _GET_MAP_CONTAINER(cpt_iteratorsecond)); #ifdef CSTL_MAP_AVL_TREE return _avl_tree_iterator_before(cpt_iteratorfirst, cpt_iteratorsecond); #else return _rb_tree_iterator_before(cpt_iteratorfirst, cpt_iteratorsecond); #endif }