From 8f48a7fed1e5f096c0533566a525946cca4d2c37 Mon Sep 17 00:00:00 2001 From: sebastien Date: Thu, 9 Nov 2006 23:32:12 +0000 Subject: [PATCH] v4 parser: use lexicographic order of MToken(s) in DataTree::mIndexOfTokens git-svn-id: https://www.dynare.org/svn/dynare/dynare_v4@1056 ac1d8469-bf42-47a9-8791-bf33cf982152 --- parser.src/DataTree.cc | 11 ++++------- parser.src/include/DataTree.hh | 9 +++------ parser.src/include/ModelTypes.hh | 23 +++++++++++++++++------ 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/parser.src/DataTree.cc b/parser.src/DataTree.cc index 0e825b2a7..88f4f2257 100644 --- a/parser.src/DataTree.cc +++ b/parser.src/DataTree.cc @@ -8,10 +8,7 @@ #include #include #include -//#include using namespace std; -//using __gnu_cxx::hash; -//using __gnu_cxx::hash_map; #include //------------------------------------------------------------------------------ @@ -40,26 +37,26 @@ DataTree::DataTree() Zero->reference_count.resize(current_order+1,2); Zero->idx = 0; mModelTree.push_back(Zero); - mIndexOfTokens[Zero->Key()]=Zero; + mIndexOfTokens[*Zero]=Zero; One->op_name = ""; One->reference_count.resize(current_order+1,1); One->idx = 1; mModelTree.push_back(One); - mIndexOfTokens[One->Key()]=One; + mIndexOfTokens[*One]=One; MinusOne->op_name = operator_table.str(UMINUS); MinusOne->reference_count.resize(current_order+1,1); MinusOne->idx = 2; mModelTree.push_back(MinusOne); - mIndexOfTokens[MinusOne->Key()]=MinusOne; + mIndexOfTokens[*MinusOne]=MinusOne; // Pushing "0=0" into mModelTree ZeroEqZero->op_name = operator_table.str(EQUAL); ZeroEqZero->reference_count.resize(current_order+1,1); ZeroEqZero->idx = 3; mModelTree.push_back(ZeroEqZero); - mIndexOfTokens[ZeroEqZero->Key()]=ZeroEqZero; + mIndexOfTokens[*ZeroEqZero]=ZeroEqZero; BeginModel = mModelTree.end(); BeginModel--; diff --git a/parser.src/include/DataTree.hh b/parser.src/include/DataTree.hh index dd6f2b0f6..40ade65a9 100644 --- a/parser.src/include/DataTree.hh +++ b/parser.src/include/DataTree.hh @@ -13,7 +13,6 @@ #include #include #include -//#include #include #include //------------------------------------------------------------------------------ @@ -24,7 +23,7 @@ #include "VariableTable.hh" //------------------------------------------------------------------------------ -typedef std::map > TreeMap; +typedef std::map TreeMap; typedef std::list TreeList; typedef TreeList::iterator TreeIterator; /*! @@ -149,7 +148,7 @@ inline NodeID DataTree::PushToken(NodeID iArg1,int iOpCode, NodeID iArg2, Type i lToken->cost += iArg2->cost; IncrementReferenceCount(iArg2); } - mIndexOfTokens[lToken->Key()]=lToken; + mIndexOfTokens[*lToken] = lToken; /* std::cout << "ID = " << ID << " / " << mIndexOfTokens.size()-1<< " - " << getIDOfToken(lToken2) << " " << @@ -180,9 +179,7 @@ inline void DataTree::IncrementReferenceCount(NodeID token) //------------------------------------------------------------------------------ inline NodeID DataTree::getIDOfToken(const MToken &iToken) { - TreeMap::iterator iter; - - iter = mIndexOfTokens.find(iToken.Key()); + TreeMap::iterator iter = mIndexOfTokens.find(iToken); if (iter != mIndexOfTokens.end()) return iter->second; else diff --git a/parser.src/include/ModelTypes.hh b/parser.src/include/ModelTypes.hh index babc559e0..4afc0510b 100644 --- a/parser.src/include/ModelTypes.hh +++ b/parser.src/include/ModelTypes.hh @@ -68,16 +68,27 @@ public : } /*! Destructor */ ~MToken() { } +}; - /*! Computes the hash key */ - inline std::string Key() const +/*! + \struct MTokenLess + \brief Class which defines a lexicographic order over MToken, used in std::map +*/ +struct MTokenLess +{ + bool operator()(const MToken &n1, const MToken &n2) const { - char key[100]; - snprintf(key, 100, "%p %p %d %d", id1, id2, type1, op_code); - // std::cout << key << std::endl; - return std::string(key); + if (n1.id1 != n2.id1) + return(n1.id1 < n2.id1); + else if (n1.id2 != n2.id2) + return(n1.id2 < n2.id2); + else if (n1.type1 != n2.type1) + return(n1.type1 < n2.type1); + else + return(n1.op_code < n2.op_code); } }; + //------------------------------------------------------------------------------ /*! \struct MetaToken