/** exported function implementation section **/ void test_avl_tree(void) { avl_tree_t t_tree = _create_avl_tree(sizeof(int), "int"); avl_tree_t t_tree2 = _create_avl_tree(sizeof(int), "int"); int n_value = 900; _avl_tree_init(&t_tree, NULL, NULL); _avl_tree_insert_equal(&t_tree, &n_value); printf("avl tree1 - size:%u, max_size:%u, empty:%d\n", _avl_tree_size(&t_tree), _avl_tree_max_size(&t_tree), _avl_tree_empty(&t_tree)); /*_avl_tree_init_copy_range(*/ /*&t_tree2, _avl_tree_begin(&t_tree), _avl_tree_begin(&t_tree));*/ /*printf("avl tree2 - size:%u, max_size:%u, empty:%d\n",*/ /*_avl_tree_size(&t_tree2), _avl_tree_max_size(&t_tree2), _avl_tree_empty(&t_tree2));*/ _avl_tree_init_copy_range_cmp( &t_tree2, _avl_tree_begin(&t_tree), _avl_tree_begin(&t_tree), NULL); printf("avl tree2 - size:%u, max_size:%u, empty:%d\n", _avl_tree_size(&t_tree2), _avl_tree_max_size(&t_tree2), _avl_tree_empty(&t_tree2)); _avl_tree_insert_equal_range( &t_tree2, _avl_tree_begin(&t_tree), _avl_tree_begin(&t_tree)); printf("avl tree2 - size:%u, max_size:%u, empty:%d\n", _avl_tree_size(&t_tree2), _avl_tree_max_size(&t_tree2), _avl_tree_empty(&t_tree2)); _avl_tree_insert_unique_range( &t_tree2, _avl_tree_end(&t_tree), _avl_tree_end(&t_tree)); printf("avl tree2 - size:%u, max_size:%u, empty:%d\n", _avl_tree_size(&t_tree2), _avl_tree_max_size(&t_tree2), _avl_tree_empty(&t_tree2)); _avl_tree_erase_range(&t_tree2, _avl_tree_begin(&t_tree2), _avl_tree_begin(&t_tree2)); printf("avl tree2 - size:%u, max_size:%u, empty:%d\n", _avl_tree_size(&t_tree2), _avl_tree_max_size(&t_tree2), _avl_tree_empty(&t_tree2)); _avl_tree_destroy(&t_tree); _avl_tree_destroy(&t_tree2); }
/** * Tests if the two avl tree are equal. */ bool_t _avl_tree_equal(const _avl_tree_t* cpt_first, const _avl_tree_t* cpt_second) { _avl_tree_iterator_t it_first; _avl_tree_iterator_t it_first_begin; _avl_tree_iterator_t it_first_end; _avl_tree_iterator_t it_second; _avl_tree_iterator_t it_second_begin; _avl_tree_iterator_t it_second_end; bool_t b_less = false; bool_t b_greater = false; assert(cpt_first != NULL); assert(cpt_second != NULL); assert(_avl_tree_is_inited(cpt_first)); assert(_avl_tree_is_inited(cpt_second)); assert(_avl_tree_same_type_ex(cpt_first, cpt_second)); if (cpt_first == cpt_second) { return true; } /* test avl tree size */ if (_avl_tree_size(cpt_first) != _avl_tree_size(cpt_second)) { return false; } it_first_begin = _avl_tree_begin(cpt_first); it_first_end = _avl_tree_end(cpt_first); it_second_begin = _avl_tree_begin(cpt_second); it_second_end = _avl_tree_end(cpt_second); /* test each element */ for (it_first = it_first_begin, it_second = it_second_begin; !_avl_tree_iterator_equal(it_first, it_first_end) && !_avl_tree_iterator_equal(it_second, it_second_end); it_first = _avl_tree_iterator_next(it_first), it_second = _avl_tree_iterator_next(it_second)) { b_less = b_greater = _GET_AVL_TREE_TYPE_SIZE(cpt_first); _GET_AVL_TREE_TYPE_LESS_FUNCTION(cpt_first)( ((_avlnode_t*)_AVL_TREE_ITERATOR_COREPOS(it_first))->_pby_data, ((_avlnode_t*)_AVL_TREE_ITERATOR_COREPOS(it_second))->_pby_data, &b_less); _GET_AVL_TREE_TYPE_LESS_FUNCTION(cpt_first)( ((_avlnode_t*)_AVL_TREE_ITERATOR_COREPOS(it_second))->_pby_data, ((_avlnode_t*)_AVL_TREE_ITERATOR_COREPOS(it_first))->_pby_data, &b_greater); if (b_less || b_greater) { return false; } } assert(_avl_tree_iterator_equal(it_first, it_first_end) && _avl_tree_iterator_equal(it_second, it_second_end)); return true; }
size_t multimap_size(const multimap_t* cpt_multimap) { assert(cpt_multimap != NULL); #ifdef CSTL_MULTIMAP_AVL_TREE return _avl_tree_size(_GET_MULTIMAP_AVL_TREE(cpt_multimap)); #else return _rb_tree_size(_GET_MULTIMAP_RB_TREE(cpt_multimap)); #endif }
/** * Tests if the first avl tree is less than the second avl tree. */ bool_t _avl_tree_less(const _avl_tree_t* cpt_first, const _avl_tree_t* cpt_second) { _avl_tree_iterator_t it_first; _avl_tree_iterator_t it_first_begin; _avl_tree_iterator_t it_first_end; _avl_tree_iterator_t it_second; _avl_tree_iterator_t it_second_begin; _avl_tree_iterator_t it_second_end; bool_t b_result = false; assert(cpt_first != NULL); assert(cpt_second != NULL); assert(_avl_tree_is_inited(cpt_first)); assert(_avl_tree_is_inited(cpt_second)); assert(_avl_tree_same_type_ex(cpt_first, cpt_second)); it_first_begin = _avl_tree_begin(cpt_first); it_first_end = _avl_tree_end(cpt_first); it_second_begin = _avl_tree_begin(cpt_second); it_second_end = _avl_tree_end(cpt_second); /* test each element */ for (it_first = it_first_begin, it_second = it_second_begin; !_avl_tree_iterator_equal(it_first, it_first_end) && !_avl_tree_iterator_equal(it_second, it_second_end); it_first = _avl_tree_iterator_next(it_first), it_second = _avl_tree_iterator_next(it_second)) { b_result = _GET_AVL_TREE_TYPE_SIZE(cpt_first); _GET_AVL_TREE_TYPE_LESS_FUNCTION(cpt_first)( ((_avlnode_t*)_AVL_TREE_ITERATOR_COREPOS(it_first))->_pby_data, ((_avlnode_t*)_AVL_TREE_ITERATOR_COREPOS(it_second))->_pby_data, &b_result); if (b_result) { return true; } b_result = _GET_AVL_TREE_TYPE_SIZE(cpt_first); _GET_AVL_TREE_TYPE_LESS_FUNCTION(cpt_first)( ((_avlnode_t*)_AVL_TREE_ITERATOR_COREPOS(it_second))->_pby_data, ((_avlnode_t*)_AVL_TREE_ITERATOR_COREPOS(it_first))->_pby_data, &b_result); if (b_result) { return false; } } return _avl_tree_size(cpt_first) < _avl_tree_size(cpt_second) ? true : false; }
/** * Get the number of elements int the set. */ size_t set_size(const set_t* cpset_set) { assert(cpset_set != NULL); #ifdef CSTL_SET_AVL_TREE return _avl_tree_size(&cpset_set->_t_tree); #else return _rb_tree_size(&cpset_set->_t_tree); #endif }
/** * Get the number of elements int the multiset. */ size_t multiset_size(const multiset_t* cpmset_mset) { assert(cpmset_mset != NULL); #ifdef CSTL_MULTISET_AVL_TREE return _avl_tree_size(&cpmset_mset->_t_tree); #else return _rb_tree_size(&cpmset_mset->_t_tree); #endif }
/** * Get the number of elements int the map. */ size_t map_size(const map_t* cpmap_map) { assert(cpmap_map != NULL); assert(_pair_is_inited(&cpmap_map->_pair_temp)); #ifdef CSTL_MAP_AVL_TREE return _avl_tree_size(&cpmap_map->_t_tree); #else return _rb_tree_size(&cpmap_map->_t_tree); #endif }