/** * Erase an element from a hashtable that match a specified element. */ size_t _hashtable_erase(_hashtable_t* pt_hashtable, const void* cpv_value) { size_t t_countsize = _hashtable_count(pt_hashtable, cpv_value); range_t t_range = _hashtable_equal_range(pt_hashtable, cpv_value); if (!_hashtable_iterator_equal(t_range.it_begin, _hashtable_end(pt_hashtable))) { _hashtable_erase_range(pt_hashtable, t_range.it_begin, t_range.it_end); } return t_countsize; }
/** * 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 the number of specific elements in an hashtable */ size_t _hashtable_count(const _hashtable_t* cpt_hashtable, const void* cpv_value) { range_t r_range = _hashtable_equal_range(cpt_hashtable, cpv_value); return abs(_hashtable_iterator_distance(r_range.it_begin, r_range.it_end)); }