From f3b80658d37c46cee6a726e3ed97fcb269256adf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien.villemot@ens.fr>
Date: Tue, 23 Feb 2010 16:45:56 +0100
Subject: [PATCH] Preprocessor: * in DataTree, new functions for testing if
 some opcode (unary, binary or trinary) is used somewhere in the tree *
 removed DataTree::containsSteadyState(), rather use a call to the new utility
 function (cherry picked from commit eba049899e23453d353027b80a2e3b22f2f8be16)

---
 preprocessor/DataTree.cc     | 26 ++++++++++++++++++++++++--
 preprocessor/DataTree.hh     |  9 ++++++---
 preprocessor/DynamicModel.cc |  2 +-
 3 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/preprocessor/DataTree.cc b/preprocessor/DataTree.cc
index 712d4e90b6..9612fd9035 100644
--- a/preprocessor/DataTree.cc
+++ b/preprocessor/DataTree.cc
@@ -484,11 +484,33 @@ DataTree::getDynJacobianCol(int deriv_id) const throw (UnknownDerivIDException)
 }
 
 bool
-DataTree::containsSteadyStateOperator() const
+DataTree::isUnaryOpUsed(UnaryOpcode opcode) const
 {
   for (unary_op_node_map_type::const_iterator it = unary_op_node_map.begin();
        it != unary_op_node_map.end(); it++)
-    if (it->first.second == oSteadyState)
+    if (it->first.second == opcode)
+      return true;
+
+  return false;
+}
+
+bool
+DataTree::isBinaryOpUsed(BinaryOpcode opcode) const
+{
+  for (binary_op_node_map_type::const_iterator it = binary_op_node_map.begin();
+       it != binary_op_node_map.end(); it++)
+    if (it->first.second == opcode)
+      return true;
+
+  return false;
+}
+
+bool
+DataTree::isTrinaryOpUsed(TrinaryOpcode opcode) const
+{
+  for (trinary_op_node_map_type::const_iterator it = trinary_op_node_map.begin();
+       it != trinary_op_node_map.end(); it++)
+    if (it->first.second == opcode)
       return true;
 
   return false;
diff --git a/preprocessor/DataTree.hh b/preprocessor/DataTree.hh
index 039aae26da..fade2b8bbf 100644
--- a/preprocessor/DataTree.hh
+++ b/preprocessor/DataTree.hh
@@ -67,9 +67,6 @@ protected:
   //! Internal implementation of AddVariable(), without the check on the lag
   VariableNode *AddVariableInternal(int symb_id, int lag);
 
-  //! Is there a steady state operator in the tree?
-  bool containsSteadyStateOperator() const;
-
 private:
   typedef list<NodeID> node_list_type;
   //! The list of nodes
@@ -181,6 +178,12 @@ public:
   NodeID AddUnknownFunction(const string &function_name, const vector<NodeID> &arguments);
   //! Checks if a given symbol is used somewhere in the data tree
   bool isSymbolUsed(int symb_id) const;
+  //! Checks if a given unary op is used somewhere in the data tree
+  bool isUnaryOpUsed(UnaryOpcode opcode) const;
+  //! Checks if a given binary op is used somewhere in the data tree
+  bool isBinaryOpUsed(BinaryOpcode opcode) const;
+  //! Checks if a given trinary op is used somewhere in the data tree
+  bool isTrinaryOpUsed(TrinaryOpcode opcode) const;
   //! Thrown when trying to access an unknown variable by deriv_id
   class UnknownDerivIDException
   {
diff --git a/preprocessor/DynamicModel.cc b/preprocessor/DynamicModel.cc
index 1bfb09d63a..f510d0fe9f 100644
--- a/preprocessor/DynamicModel.cc
+++ b/preprocessor/DynamicModel.cc
@@ -990,7 +990,7 @@ DynamicModel::writeDynamicMFile(const string &dynamic_basename) const
                     << "% Warning : this file is generated automatically by Dynare" << endl
                     << "%           from model file (.mod)" << endl << endl;
 
-  if (containsSteadyStateOperator())
+  if (isUnaryOpUsed(oSteadyState))
     mDynamicModelFile << "global oo_;" << endl << endl;
 
   writeDynamicModel(mDynamicModelFile, false);
-- 
GitLab