/*:* *: File: ./src/maps/hashmap.tmpl *: *: yChat; Homepage: ychat.buetow.org; Version 0.9.0-CURRENT *: *: Copyright (C) 2003 Paul C. Buetow, Volker Richter *: Copyright (C) 2004 Paul C. Buetow *: Copyright (C) 2005 EXA Digital Solutions GbR *: Copyright (C) 2006, 2007 Paul C. Buetow *: *: This program is free software; you can redistribute it and/or *: modify it under the terms of the GNU General Public License *: as published by the Free Software Foundation; either version 2 *: of the License, or (at your option) any later version. *: *: This program is distributed in the hope that it will be useful, *: but WITHOUT ANY WARRANTY; without even the implied warranty of *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *: GNU General Public License for more details. *: *: You should have received a copy of the GNU General Public License *: along with this program; if not, write to the Free Software *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *:*/ template bool compare_allocator::operator()(key_type_ t_key_1, key_type_ t_key_2) const { return t_key_1.compare(t_key_2) == 0; } template bool equals_allocator::operator()(key_type_ t_key_1, key_type_ t_key_2) const { return t_key_1 == t_key_2; } template int size_hash::operator()(key_type_ t_key) const { int i_hash = 0; int i_size = t_key.size(); for ( size_t i = 0; i < i_size; ++i ) i_hash = ( i_hash << 5 ) ^ t_key.at(i) ^ i_hash; return i_hash; } template int self_hash::operator()(key_type_ t_key) const { return t_key; } template obj_type hashmap::get_set_elem(obj_type t_obj, key_type_ t_key) { typename hashmap::iterator iter = this->find(t_key); if ( iter == this->end() ) { set_elem(t_obj, t_key); return obj_type(); } obj_type t_ret = iter->second; iter->second = t_obj; return t_ret; } template obj_type hashmap::get_or_callback_set (obj_type (*func)(void*), void* p_void, key_type_ t_key) { typename hashmap::iterator iter = this->find(t_key); if ( iter == this->end() ) { obj_type t_obj = (*func) (p_void); set_elem(t_obj, t_key); return t_obj; } return iter->second; } template void hashmap::set_elem(obj_type t_obj, key_type_ t_key) { (*this)[t_key] = t_obj; } template obj_type hashmap::get_elem(key_type_ t_key) { typename hashmap::iterator iter = this->find(t_key); if ( iter != this->end() ) return iter->second; return obj_type(); } template vector* hashmap::get_key_vector() { vector* p_vec = new vector; typename hashmap::iterator iter; for ( iter = this->begin(); iter != this->end(); ++iter ) p_vec->push_back(iter->first); return p_vec; } template bool hashmap::exists(key_type_ t_key) { return this->find(t_key) != this->end(); } template void hashmap::run_func( void (*func)(obj_type) ) { typename hashmap::iterator iter; for ( iter = this->begin(); iter != this->end(); ++iter ) ( *func ) ( iter->second ); } template void hashmap::run_func( void (*func)(obj_type, void*), void* v_arg ) { typename hashmap::iterator iter; for ( iter = this->begin(); iter != this->end(); ++iter ) ( *func ) ( iter->second, v_arg ); }