/* FILE: hashmap.cpp * DATE MODIFIED: 31-Aug-07 * DESCRIPTION: Helper template for compiling FST data structure * from a GRXML file. * A doubly indexed map class using two maps. * Indices are a user-defined type and an int index. * Both are unique indices. * The int index has automatic non-reusable numbering. * * DESCRIPTION: Part of the SREC graph compiler project source files. * * Copyright 2007, 2008 Nuance Communciations, Inc. * * * * Licensed under the Apache License, Version 2.0 (the 'License'); * * you may not use this file except in compliance with the License. * * * * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an 'AS IS' BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * * * *---------------------------------------------------------------------------*/ #include <map> #include <string> #include <iostream> #include <fstream> #include "hashmap.h" #include "sub_grph.h" using namespace std; template <typename T1, typename T2> HashMap<T1,T2>::HashMap(): m_NextAutoIndex(0) { } template <typename T1, typename T2> void HashMap<T1,T2>::setName(std::string s) { m_Name = s; } template <typename T1, typename T2> bool HashMap<T1,T2>::insert( T1 const & index, T2 const & value) { pair<typename std::map<T1,T2>::iterator,bool> result = m_Map.insert( make_pair(index, value) ); if (!result.second) { return false; } return true; } template <typename T1, typename T2> bool HashMap<T1,T2>::remove( T1 const & index ) { m_Map.erase( index ); return true; } template <typename T1, typename T2> bool HashMap<T1,T2>::isEmpty() { return m_Map.empty(); } template <typename T1, typename T2> bool HashMap<T1,T2>::clear() { m_Map.clear(); return true; } template <typename T1, typename T2> bool HashMap<T1,T2>::getIndex( T2 const & value, T1 *index ) { //do something with all elements having a certain value typename std::map<T1,T2>::iterator pos; for (pos = m_Map.begin(); pos != m_Map.end(); ++pos) { if (pos->second == value) { *index = (pos->first); return true; } } return false; } template <typename T1, typename T2> bool HashMap<T1,T2>::getFirst( T1 *index, T2 *value ) { if (m_Map.empty() ) { return false; } //do something with all elements having a certain value typename std::map<T1,T2>::iterator pos; m_pPos= m_Map.begin(); *index = m_pPos->first; *value= m_pPos->second; return true; } template <typename T1, typename T2> bool HashMap<T1,T2>::getNext( T1 *index, T2 *value ) { if ( m_Map.empty() ) { return false; } if ( ++m_pPos == m_Map.end() ) { return false; } *index = m_pPos->first; *value= m_pPos->second; return true; } template <typename T1, typename T2> bool HashMap<T1,T2>::getValue(T1 const & index, T2 *value) { typename std::map<T1,T2>::iterator pos; pos = m_Map.find(index); if (m_Map.end() != pos) { *value = pos->second; return true; } return false; } template <typename T1, typename T2> int HashMap<T1,T2>::size() { return m_Map.size(); } template <typename T1, typename T2> void HashMap<T1,T2>::print() { typename std::map<T1,T2>::iterator pos; cout << "======= '" << m_Name <<"' =======" << std::endl; for (pos = m_Map.begin(); pos != m_Map.end(); ++pos) { cout << pos->first <<" : " << pos->second << std::endl; } } template <typename T1, typename T2> void HashMap<T1,T2>::writeFile( std::string fileName ) { ofstream outfile; outfile.open ( fileName.c_str() ); typename std::map<T1,T2>::iterator pos; for (pos = m_Map.begin(); pos != m_Map.end(); ++pos) { outfile << pos->first << " " << pos->second << std::endl; } outfile.close(); } template <typename T1, typename T2> typename std::map<T1,T2>::iterator HashMap<T1,T2>::begin() { m_pPos = m_Map.begin(); return m_pPos; } template <typename T1, typename T2> typename std::map<T1,T2>::iterator HashMap<T1,T2>::end() { m_pPos = m_Map.end(); return m_pPos; } // Declare known data types so that we don't need to put this in hashmap.h. // If user needs others the put the declaration in a separate user file. template class HashMap<int,string>; template class HashMap<int, int>; template class HashMap<string, SubGraph* >; template class HashMap<std::string,int>; template class HashMap<std::string, HashMap<std::string, int>*>; template class HashMap<std::string, std::string>;