/** * Return an iterator range that is equal to a specific element. */ range_t _set_equal_range_varg(const set_t* cpset_set, va_list val_elemlist) { void* pv_varg = NULL; range_t r_range; assert(cpset_set != NULL); pv_varg = _alloc_allocate(&((set_t*)cpset_set)->_t_tree._t_allocator, _GET_SET_TYPE_SIZE(cpset_set), 1); assert(pv_varg != NULL); _set_get_varg_value_auxiliary((set_t*)cpset_set, val_elemlist, pv_varg); #ifdef CSTL_SET_AVL_TREE r_range = _avl_tree_equal_range(&cpset_set->_t_tree, pv_varg); #else r_range = _rb_tree_equal_range(&cpset_set->_t_tree, pv_varg); #endif _set_destroy_varg_value_auxiliary((set_t*)cpset_set, pv_varg); _alloc_deallocate(&((set_t*)cpset_set)->_t_tree._t_allocator, pv_varg, _GET_SET_TYPE_SIZE(cpset_set), 1); _ITERATOR_CONTAINER(r_range.it_begin) = (set_t*)cpset_set; _SET_ITERATOR_CONTAINER_TYPE(r_range.it_begin) = _SET_CONTAINER; _SET_ITERATOR_ITERATOR_TYPE(r_range.it_begin) = _BIDIRECTIONAL_ITERATOR; _ITERATOR_CONTAINER(r_range.it_end) = (set_t*)cpset_set; _SET_ITERATOR_CONTAINER_TYPE(r_range.it_end) = _SET_CONTAINER; _SET_ITERATOR_ITERATOR_TYPE(r_range.it_end) = _BIDIRECTIONAL_ITERATOR; return r_range; }
/** * Test the two set iterator are equal. */ bool_t _set_iterator_equal(set_iterator_t it_first, set_iterator_t it_second) { assert(_SET_ITERATOR_CONTAINER_TYPE(it_first) == _SET_CONTAINER); assert(_SET_ITERATOR_ITERATOR_TYPE(it_first) == _BIDIRECTIONAL_ITERATOR); assert(_SET_ITERATOR_CONTAINER_TYPE(it_second) == _SET_CONTAINER); assert(_SET_ITERATOR_ITERATOR_TYPE(it_second) == _BIDIRECTIONAL_ITERATOR); #ifdef CSTL_SET_AVL_TREE return _avl_tree_iterator_equal(it_first, it_second); #else return _rb_tree_iterator_equal(it_first, it_second); #endif }
/* * Erase a range of element in an set. */ void set_erase_range(set_t* pset_set, set_iterator_t it_begin, set_iterator_t it_end) { assert(pset_set != NULL); assert(_SET_ITERATOR_CONTAINER_TYPE(it_begin) == _SET_CONTAINER); assert(_SET_ITERATOR_ITERATOR_TYPE(it_begin) == _BIDIRECTIONAL_ITERATOR); assert(_SET_ITERATOR_CONTAINER_TYPE(it_end) == _SET_CONTAINER); assert(_SET_ITERATOR_ITERATOR_TYPE(it_end) == _BIDIRECTIONAL_ITERATOR); assert(_SET_ITERATOR_CONTAINER(it_begin) == pset_set); assert(_SET_ITERATOR_CONTAINER(it_end) == pset_set); #ifdef CSTL_SET_AVL_TREE _avl_tree_erase_range(&pset_set->_t_tree, it_begin, it_end); #else _rb_tree_erase_range(&pset_set->_t_tree, it_begin, it_end); #endif }
/** * Inserts an unique element into a set with hint. */ set_iterator_t _set_insert_hint_varg(set_t* pset_set, set_iterator_t it_hint, va_list val_elemlist) { void* pv_varg = NULL; assert(pset_set != NULL); pv_varg = _alloc_allocate(&pset_set->_t_tree._t_allocator, _GET_SET_TYPE_SIZE(pset_set), 1); assert(pv_varg != NULL); _set_get_varg_value_auxiliary(pset_set, val_elemlist, pv_varg); #ifdef CSTL_SET_AVL_TREE it_hint = _avl_tree_insert_unique(&pset_set->_t_tree, pv_varg); #else it_hint = _rb_tree_insert_unique(&pset_set->_t_tree, pv_varg); #endif _set_destroy_varg_value_auxiliary(pset_set, pv_varg); _alloc_deallocate(&pset_set->_t_tree._t_allocator, pv_varg, _GET_SET_TYPE_SIZE(pset_set), 1); _ITERATOR_CONTAINER(it_hint) = pset_set; _SET_ITERATOR_CONTAINER_TYPE(it_hint) = _SET_CONTAINER; _SET_ITERATOR_ITERATOR_TYPE(it_hint) = _BIDIRECTIONAL_ITERATOR; return it_hint; }
/** * Return an iterator to the first element that is greater than a specific element. */ set_iterator_t _set_upper_bound_varg(const set_t* cpset_set, va_list val_elemlist) { void* pv_varg = NULL; set_iterator_t it_iter; assert(cpset_set != NULL); pv_varg = _alloc_allocate(&((set_t*)cpset_set)->_t_tree._t_allocator, _GET_SET_TYPE_SIZE(cpset_set), 1); assert(pv_varg != NULL); _set_get_varg_value_auxiliary((set_t*)cpset_set, val_elemlist, pv_varg); #ifdef CSTL_SET_AVL_TREE it_iter = _avl_tree_upper_bound(&cpset_set->_t_tree, pv_varg); #else it_iter = _rb_tree_upper_bound(&cpset_set->_t_tree, pv_varg); #endif _set_destroy_varg_value_auxiliary((set_t*)cpset_set, pv_varg); _alloc_deallocate(&((set_t*)cpset_set)->_t_tree._t_allocator, pv_varg, _GET_SET_TYPE_SIZE(cpset_set), 1); _ITERATOR_CONTAINER(it_iter) = (set_t*)cpset_set; _SET_ITERATOR_CONTAINER_TYPE(it_iter) = _SET_CONTAINER; _SET_ITERATOR_ITERATOR_TYPE(it_iter) = _BIDIRECTIONAL_ITERATOR; return it_iter; }
/** * Initialize set container with specific range and compare function. */ void set_init_copy_range_ex( set_t* pset_dest, set_iterator_t it_begin, set_iterator_t it_end, binary_function_t bfun_compare) { assert(pset_dest != NULL); assert(_SET_ITERATOR_CONTAINER_TYPE(it_begin) == _SET_CONTAINER); assert(_SET_ITERATOR_ITERATOR_TYPE(it_begin) == _BIDIRECTIONAL_ITERATOR); assert(_SET_ITERATOR_CONTAINER_TYPE(it_end) == _SET_CONTAINER); assert(_SET_ITERATOR_ITERATOR_TYPE(it_end) == _BIDIRECTIONAL_ITERATOR); assert(_SET_ITERATOR_CONTAINER(it_begin) != pset_dest); assert(_SET_ITERATOR_CONTAINER(it_end) != pset_dest); assert(_SET_ITERATOR_CONTAINER(it_begin) == _SET_ITERATOR_CONTAINER(it_end)); #ifdef CSTL_SET_AVL_TREE _avl_tree_init_copy_range_ex(&pset_dest->_t_tree, it_begin, it_end, bfun_compare); #else _rb_tree_init_copy_range_ex(&pset_dest->_t_tree, it_begin, it_end, bfun_compare); #endif }
/** * Get data value pointer referenced by iterator, but ignore char*. */ const void* _set_iterator_get_pointer_ignore_cstr(set_iterator_t it_iter) { assert(_SET_ITERATOR_CONTAINER_TYPE(it_iter) == _SET_CONTAINER); assert(_SET_ITERATOR_ITERATOR_TYPE(it_iter) == _BIDIRECTIONAL_ITERATOR); #ifdef CSTL_SET_AVL_TREE return _avl_tree_iterator_get_pointer_ignore_cstr(it_iter); #else return _rb_tree_iterator_get_pointer_ignore_cstr(it_iter); #endif }
/** * Return iterator reference previous element. */ set_iterator_t _set_iterator_prev(set_iterator_t it_iter) { assert(_SET_ITERATOR_CONTAINER_TYPE(it_iter) == _SET_CONTAINER); assert(_SET_ITERATOR_ITERATOR_TYPE(it_iter) == _BIDIRECTIONAL_ITERATOR); #ifdef CSTL_SET_AVL_TREE return _avl_tree_iterator_prev(it_iter); #else return _rb_tree_iterator_prev(it_iter); #endif }
/** * Get data value referenced by iterator. */ void _set_iterator_get_value(set_iterator_t it_iter, void* pv_value) { assert(pv_value != NULL); assert(_SET_ITERATOR_CONTAINER_TYPE(it_iter) == _SET_CONTAINER); assert(_SET_ITERATOR_ITERATOR_TYPE(it_iter) == _BIDIRECTIONAL_ITERATOR); #ifdef CSTL_SET_AVL_TREE _avl_tree_iterator_get_value(it_iter, pv_value); #else _rb_tree_iterator_get_value(it_iter, pv_value); #endif }
/* * Erase an element in an set from specificed position. */ void set_erase_pos(set_t* pset_set, set_iterator_t t_pos) { assert(pset_set != NULL); assert(_SET_ITERATOR_CONTAINER_TYPE(t_pos) == _SET_CONTAINER); assert(_SET_ITERATOR_ITERATOR_TYPE(t_pos) == _BIDIRECTIONAL_ITERATOR); assert(_SET_ITERATOR_CONTAINER(t_pos) == pset_set); #ifdef CSTL_SET_AVL_TREE _avl_tree_erase_pos(&pset_set->_t_tree, t_pos); #else _rb_tree_erase_pos(&pset_set->_t_tree, t_pos); #endif }
/** * 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 _SET_ITERATOR_CONTAINER_TYPE(it_iter) = _SET_CONTAINER; _SET_ITERATOR_ITERATOR_TYPE(it_iter) = _BIDIRECTIONAL_ITERATOR; return it_iter; }
set_iterator_t set_rend(const set_t* cpset_set) { set_iterator_t it_rend; assert(cpset_set != NULL); #ifdef CSTL_SET_AVL_TREE it_rend = _avl_tree_rend(&cpset_set->_t_tree); #else it_rend = _rb_tree_rend(&cpset_set->_t_tree); #endif _ITERATOR_CONTAINER(it_rend) = (set_t*)cpset_set; _SET_ITERATOR_CONTAINER_TYPE(it_rend) = _SET_CONTAINER; _SET_ITERATOR_ITERATOR_TYPE(it_rend) = _BIDIRECTIONAL_ITERATOR; return it_rend; }