/** * Erase a range of element in an hash_multimap. */ void hash_multimap_erase_range(hash_multimap_t* phmmap_map, hash_multimap_iterator_t it_begin, hash_multimap_iterator_t it_end) { assert(phmmap_map != NULL); assert(_pair_is_inited(&phmmap_map->_pair_temp)); assert(_HASH_MULTIMAP_ITERATOR_CONTAINER_TYPE(it_begin) == _HASH_MULTIMAP_CONTAINER); assert(_HASH_MULTIMAP_ITERATOR_ITERATOR_TYPE(it_begin) == _BIDIRECTIONAL_ITERATOR); assert(_HASH_MULTIMAP_ITERATOR_CONTAINER_TYPE(it_end) == _HASH_MULTIMAP_CONTAINER); assert(_HASH_MULTIMAP_ITERATOR_ITERATOR_TYPE(it_end) == _BIDIRECTIONAL_ITERATOR); assert(_HASH_MULTIMAP_ITERATOR_CONTAINER(it_begin) == phmmap_map); assert(_HASH_MULTIMAP_ITERATOR_CONTAINER(it_end) == phmmap_map); _hashtable_erase_range(&phmmap_map->_t_hashtable, it_begin, it_end); }
/** * Return an iterator range that is equal to a specific element. */ range_t _hash_multimap_equal_range_varg(const hash_multimap_t* cphmmap_map, va_list val_elemlist) { range_t r_range; assert(cphmmap_map != NULL); _type_get_varg_value(&((hash_multimap_t*)cphmmap_map)->_pair_temp._t_typeinfofirst, val_elemlist, cphmmap_map->_pair_temp._pv_first); r_range = _hashtable_equal_range(&cphmmap_map->_t_hashtable, &cphmmap_map->_pair_temp); _ITERATOR_CONTAINER(r_range.it_begin) = (hash_multimap_t*)cphmmap_map; _HASH_MULTIMAP_ITERATOR_CONTAINER_TYPE(r_range.it_begin) = _HASH_MULTIMAP_CONTAINER; _HASH_MULTIMAP_ITERATOR_ITERATOR_TYPE(r_range.it_begin) = _BIDIRECTIONAL_ITERATOR; _ITERATOR_CONTAINER(r_range.it_end) = (hash_multimap_t*)cphmmap_map; _HASH_MULTIMAP_ITERATOR_CONTAINER_TYPE(r_range.it_end) = _HASH_MULTIMAP_CONTAINER; _HASH_MULTIMAP_ITERATOR_ITERATOR_TYPE(r_range.it_end) = _BIDIRECTIONAL_ITERATOR; return r_range; }
/** * Return an iterator that addresses the location succeeding the last element in the hash_multimap. */ hash_multimap_iterator_t hash_multimap_end(const hash_multimap_t* cphmmap_map) { hash_multimap_iterator_t it_end; assert(cphmmap_map != NULL); assert(_pair_is_inited(&cphmmap_map->_pair_temp)); it_end = _hashtable_end(&cphmmap_map->_t_hashtable); _ITERATOR_CONTAINER(it_end) = (hash_multimap_t*)cphmmap_map; _HASH_MULTIMAP_ITERATOR_CONTAINER_TYPE(it_end) = _HASH_MULTIMAP_CONTAINER; _HASH_MULTIMAP_ITERATOR_ITERATOR_TYPE(it_end) = _BIDIRECTIONAL_ITERATOR; return it_end; }
/** * Find specific element. */ hash_multimap_iterator_t _hash_multimap_find_varg(const hash_multimap_t* cphmmap_map, va_list val_elemlist) { hash_multimap_iterator_t it_iter; assert(cphmmap_map != NULL); _type_get_varg_value(&((hash_multimap_t*)cphmmap_map)->_pair_temp._t_typeinfofirst, val_elemlist, cphmmap_map->_pair_temp._pv_first); it_iter = _hashtable_find(&cphmmap_map->_t_hashtable, &cphmmap_map->_pair_temp); _ITERATOR_CONTAINER(it_iter) = (hash_multimap_t*)cphmmap_map; _HASH_MULTIMAP_ITERATOR_CONTAINER_TYPE(it_iter) = _HASH_MULTIMAP_CONTAINER; _HASH_MULTIMAP_ITERATOR_ITERATOR_TYPE(it_iter) = _BIDIRECTIONAL_ITERATOR; return it_iter; }
/** * Inserts an unique element into a hash_multimap. */ hash_multimap_iterator_t hash_multimap_insert(hash_multimap_t* phmmap_map, const pair_t* cppair_pair) { hash_multimap_iterator_t it_iter; assert(phmmap_map != NULL); assert(cppair_pair != NULL); assert(_pair_is_inited(&phmmap_map->_pair_temp)); assert(_pair_is_inited(cppair_pair)); ((pair_t*)cppair_pair)->_bfun_mapkeycompare = phmmap_map->_bfun_keycompare; ((pair_t*)cppair_pair)->_bfun_mapvaluecompare = phmmap_map->_bfun_valuecompare; assert(_hash_multimap_same_pair_type_ex(&phmmap_map->_pair_temp, cppair_pair)); /* insert int hashtable */ it_iter = _hashtable_insert_equal(&phmmap_map->_t_hashtable, cppair_pair); _ITERATOR_CONTAINER(it_iter) = phmmap_map; _HASH_MULTIMAP_ITERATOR_CONTAINER_TYPE(it_iter) = _HASH_MULTIMAP_CONTAINER; _HASH_MULTIMAP_ITERATOR_ITERATOR_TYPE(it_iter) = _BIDIRECTIONAL_ITERATOR; return it_iter; }