_avl_tree_reverse_iterator_t _avl_tree_rend(const _avl_tree_t* cpt_avl_tree) { _avl_tree_reverse_iterator_t it_newiterator = _create_avl_tree_iterator(); assert(cpt_avl_tree != NULL); _AVL_TREE_ITERATOR_TREE_POINTER(it_newiterator) = (void*)cpt_avl_tree; _AVL_TREE_ITERATOR_COREPOS(it_newiterator) = (_byte_t*)&cpt_avl_tree->_t_avlroot; return it_newiterator; }
/** * Return an iterator that addresses the location succeeding the last element in the avl tree. */ _avl_tree_iterator_t _avl_tree_end(const _avl_tree_t* cpt_avl_tree) { _avl_tree_iterator_t it_end = _create_avl_tree_iterator(); assert(cpt_avl_tree != NULL); assert(_avl_tree_is_inited(cpt_avl_tree)); _AVL_TREE_ITERATOR_TREE_POINTER(it_end) = (void*)cpt_avl_tree; _AVL_TREE_ITERATOR_COREPOS(it_end) = (_byte_t*)&cpt_avl_tree->_t_avlroot; return it_end; }
/** * Return an iterator that addresses the first element in the avl tree. */ _avl_tree_iterator_t _avl_tree_begin(const _avl_tree_t* cpt_avl_tree) { _avl_tree_iterator_t it_begin = _create_avl_tree_iterator(); assert(cpt_avl_tree != NULL); assert(_avl_tree_is_inited(cpt_avl_tree)); _AVL_TREE_ITERATOR_TREE_POINTER(it_begin) = (void*)cpt_avl_tree; _AVL_TREE_ITERATOR_COREPOS(it_begin) = (_byte_t*)cpt_avl_tree->_t_avlroot._pt_left; return it_begin; }
/* multimap iterator function */ multimap_iterator_t create_multimap_iterator(void) { multimap_iterator_t t_newiterator; #ifdef CSTL_MULTIMAP_AVL_TREE t_newiterator = _create_avl_tree_iterator(); #else t_newiterator = _create_rb_tree_iterator(); #endif _GET_MULTIMAP_CONTAINER_TYPE(&t_newiterator) = _MULTIMAP_CONTAINER; _GET_MULTIMAP_ITERATOR_TYPE(&t_newiterator) = _BIDIRECTIONAL_ITERATOR; return t_newiterator; }
/** * Create set iterator. */ set_iterator_t create_set_iterator(void) { set_iterator_t it_iter; #ifdef CSTL_SET_AVL_TREE it_iter = _create_avl_tree_iterator(); #else it_iter = _create_rb_tree_iterator(); #endif _GET_SET_CONTAINER_TYPE(it_iter) = _SET_CONTAINER; _GET_SET_ITERATOR_TYPE(it_iter) = _BIDIRECTIONAL_ITERATOR; return it_iter; }
/** * Return an iterator to the first element that is equal to or greater than a specific element. */ _avl_tree_iterator_t _avl_tree_lower_bound(const _avl_tree_t* cpt_avl_tree, const void* cpv_value) { _avlnode_t* pt_cur = NULL; _avlnode_t* pt_prev = NULL; bool_t b_less = false; bool_t b_greater = false; _avl_tree_iterator_t it_iter; assert(cpt_avl_tree != NULL); assert(cpv_value != NULL); assert(_avl_tree_is_inited(cpt_avl_tree)); it_iter = _create_avl_tree_iterator(); _AVL_TREE_ITERATOR_TREE_POINTER(it_iter) = (void*)cpt_avl_tree; if (!_avl_tree_empty(cpt_avl_tree)) { pt_prev = cpt_avl_tree->_t_avlroot._pt_parent; b_less = b_greater = _GET_AVL_TREE_TYPE_SIZE(cpt_avl_tree); _avl_tree_elem_compare_auxiliary(cpt_avl_tree, cpv_value, pt_prev->_pby_data, &b_less); _avl_tree_elem_compare_auxiliary(cpt_avl_tree, pt_prev->_pby_data, cpv_value, &b_greater); pt_cur = (b_less || !b_greater) ? pt_prev->_pt_left : pt_prev->_pt_right; while (pt_cur != NULL) { pt_prev = pt_cur; b_less = b_greater = _GET_AVL_TREE_TYPE_SIZE(cpt_avl_tree); _avl_tree_elem_compare_auxiliary(cpt_avl_tree, cpv_value, pt_prev->_pby_data, &b_less); _avl_tree_elem_compare_auxiliary(cpt_avl_tree, pt_prev->_pby_data, cpv_value, &b_greater); pt_cur = (b_less || !b_greater) ? pt_prev->_pt_left : pt_prev->_pt_right; } if (b_less || !b_greater) { assert(pt_prev->_pt_left == NULL); _AVL_TREE_ITERATOR_COREPOS(it_iter) = (_byte_t*)pt_prev; assert(_avl_tree_iterator_belong_to_avl_tree(cpt_avl_tree, it_iter)); } else { assert(pt_prev->_pt_right == NULL); _AVL_TREE_ITERATOR_COREPOS(it_iter) = (_byte_t*)pt_prev; it_iter = _avl_tree_iterator_next(it_iter); } } else { it_iter = _avl_tree_end(cpt_avl_tree); } return it_iter; }
/** * Inserts an element into a avl tree. */ _avl_tree_iterator_t _avl_tree_insert_equal(_avl_tree_t* pt_avl_tree, const void* cpv_value) { _avl_tree_insert_result_t t_result; _avl_tree_iterator_t it_iter = _create_avl_tree_iterator(); assert(pt_avl_tree != NULL); assert(cpv_value != NULL); assert(_avl_tree_is_inited(pt_avl_tree)); t_result = _avl_tree_insert_avlnode(pt_avl_tree, pt_avl_tree->_t_avlroot._pt_parent, cpv_value); assert(t_result._pt_adjust != NULL && t_result._pt_new != NULL); pt_avl_tree->_t_avlroot._pt_parent = t_result._pt_adjust; pt_avl_tree->_t_avlroot._pt_parent->_pt_parent = &pt_avl_tree->_t_avlroot; pt_avl_tree->_t_avlroot._pt_left = _avl_tree_get_min_avlnode(pt_avl_tree->_t_avlroot._pt_parent); pt_avl_tree->_t_avlroot._pt_right = _avl_tree_get_max_avlnode(pt_avl_tree->_t_avlroot._pt_parent); pt_avl_tree->_t_nodecount++; _AVL_TREE_ITERATOR_TREE_POINTER(it_iter) = pt_avl_tree; _AVL_TREE_ITERATOR_COREPOS(it_iter) = (_byte_t*)t_result._pt_new; return it_iter; }