/* 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>;