From e19a14869eae4f2ed1571446c543ee39726421d8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Wed, 5 Sep 2018 18:27:13 +0200
Subject: [PATCH] Convert ExprNodeOutputType into a class enum

Incidentally, replace the IS_* macros by inline functions.
---
 src/DynamicModel.cc       |  38 +++----
 src/ExprNode.cc           | 224 +++++++++++++++++++-------------------
 src/ExprNode.hh           | 114 ++++++++++---------
 src/ModFile.cc            |   6 +-
 src/ModelEquationBlock.cc |   6 +-
 src/ModelTree.cc          |  24 ++--
 src/StaticModel.cc        |  30 ++---
 src/SymbolTable.cc        |   4 +-
 8 files changed, 231 insertions(+), 215 deletions(-)

diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index a3ac4b67..e7963f9e 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -225,7 +225,7 @@ DynamicModel::writeModelEquationsOrdered_M(const string &basename) const
   ExprNodeOutputType local_output_type;
   Ufoss.str("");
 
-  local_output_type = oMatlabDynamicModelSparse;
+  local_output_type = ExprNodeOutputType::matlabDynamicModelSparse;
   if (global_temporary_terms)
     local_temporary_terms = temporary_terms;
 
@@ -246,7 +246,7 @@ DynamicModel::writeModelEquationsOrdered_M(const string &basename) const
       unsigned int block_mfs = getBlockMfs(block);
       unsigned int block_recursive = block_size - block_mfs;
       deriv_node_temp_terms_t tef_terms;
-      local_output_type = oMatlabDynamicModelSparse;
+      local_output_type = ExprNodeOutputType::matlabDynamicModelSparse;
       if (global_temporary_terms)
         local_temporary_terms = temporary_terms;
 
@@ -415,7 +415,7 @@ DynamicModel::writeModelEquationsOrdered_M(const string &basename) const
                     {
                       output << "  ";
                       // In the following, "Static" is used to avoid getting the "(it_)" subscripting
-                      it->writeOutput(output, oMatlabStaticModelSparse, local_temporary_terms, {});
+                      it->writeOutput(output, ExprNodeOutputType::matlabStaticModelSparse, local_temporary_terms, {});
                       output << " = T_zeros;" << endl;
                     }
                 }
@@ -1803,7 +1803,7 @@ DynamicModel::writeSparseDynamicMFile(const string &basename) const
       else
         tmp_output << " ";
       // In the following, "Static" is used to avoid getting the "(it_)" subscripting
-      temporary_term->writeOutput(tmp_output, oMatlabStaticModelSparse, temporary_terms, {});
+      temporary_term->writeOutput(tmp_output, ExprNodeOutputType::matlabStaticModelSparse, temporary_terms, {});
     }
   if (tmp_output.str().length() > 0)
     mDynamicModelFile << "  global " << tmp_output.str() << ";\n";
@@ -1814,7 +1814,7 @@ DynamicModel::writeSparseDynamicMFile(const string &basename) const
     {
       tmp_output << "  ";
       // In the following, "Static" is used to avoid getting the "(it_)" subscripting
-      temporary_term->writeOutput(tmp_output, oMatlabStaticModelSparse, temporary_terms, {});
+      temporary_term->writeOutput(tmp_output, ExprNodeOutputType::matlabStaticModelSparse, temporary_terms, {});
       tmp_output << "=T_init;\n";
     }
   if (tmp_output.str().length() > 0)
@@ -2298,8 +2298,8 @@ DynamicModel::writeDynamicModel(const string &basename, ostream &DynamicOutput,
   ostringstream third_derivatives_tt_output; // Used for storing third order derivatives temp terms
   ostringstream third_derivatives_output;    // Used for storing third order derivatives equations
 
-  ExprNodeOutputType output_type = (use_dll ? oCDynamicModel :
-                                    julia ? oJuliaDynamicModel : oMatlabDynamicModel);
+  ExprNodeOutputType output_type = (use_dll ? ExprNodeOutputType::CDynamicModel :
+                                    julia ? ExprNodeOutputType::juliaDynamicModel : ExprNodeOutputType::matlabDynamicModel);
 
   deriv_node_temp_terms_t tef_terms;
   temporary_terms_t temp_term_union;
@@ -2366,7 +2366,7 @@ DynamicModel::writeDynamicModel(const string &basename, ostream &DynamicOutput,
           int col_nb_sym = id2 * dynJacobianColsNbr + id1;
 
           ostringstream for_sym;
-          if (output_type == oJuliaDynamicModel)
+          if (output_type == ExprNodeOutputType::juliaDynamicModel)
             {
               for_sym << "g2[" << eq + 1 << "," << col_nb + 1 << "]";
               hessian_output << "    @inbounds " << for_sym.str() << " = ";
@@ -2391,7 +2391,7 @@ DynamicModel::writeDynamicModel(const string &basename, ostream &DynamicOutput,
 
           // Treating symetric elements
           if (id1 != id2)
-            if (output_type == oJuliaDynamicModel)
+            if (output_type == ExprNodeOutputType::juliaDynamicModel)
               hessian_output << "    @inbounds g2[" << eq + 1 << "," << col_nb_sym + 1 << "] = "
                              << for_sym.str() << endl;
             else
@@ -2436,7 +2436,7 @@ DynamicModel::writeDynamicModel(const string &basename, ostream &DynamicOutput,
           int ref_col = id1 * hessianColsNbr + id2 * dynJacobianColsNbr + id3;
 
           ostringstream for_sym;
-          if (output_type == oJuliaDynamicModel)
+          if (output_type == ExprNodeOutputType::juliaDynamicModel)
             {
               for_sym << "g3[" << eq + 1 << "," << ref_col + 1 << "]";
               third_derivatives_output << "    @inbounds " << for_sym.str() << " = ";
@@ -2469,7 +2469,7 @@ DynamicModel::writeDynamicModel(const string &basename, ostream &DynamicOutput,
           int k2 = 1; // Keeps the offset of the permutation relative to k
           for (int col : cols)
             if (col != ref_col)
-              if (output_type == oJuliaDynamicModel)
+              if (output_type == ExprNodeOutputType::juliaDynamicModel)
                 third_derivatives_output << "    @inbounds g3[" << eq + 1 << "," << col + 1 << "] = "
                                          << for_sym.str() << endl;
               else
@@ -2491,7 +2491,7 @@ DynamicModel::writeDynamicModel(const string &basename, ostream &DynamicOutput,
         }
     }
 
-  if (output_type == oMatlabDynamicModel)
+  if (output_type == ExprNodeOutputType::matlabDynamicModel)
     {
       // Check that we don't have more than 32 nested parenthesis because Matlab does not suppor this. See Issue #1201
       map<string, string> tmp_paren_vars;
@@ -2565,7 +2565,7 @@ DynamicModel::writeDynamicModel(const string &basename, ostream &DynamicOutput,
 
       writeDynamicMatlabCompatLayer(basename);
     }
-  else if (output_type == oCDynamicModel)
+  else if (output_type == ExprNodeOutputType::CDynamicModel)
     {
       DynamicOutput << "void Dynamic(double *y, double *x, int nb_row_x, double *params, double *steady_state, int it_, double *residual, double *g1, double *v2, double *v3)" << endl
                     << "{" << endl
@@ -3428,7 +3428,7 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de
 
   // Write PacExpectationInfo
   for (auto it : pac_expectation_info)
-    it->ExprNode::writeOutput(output, oMatlabDynamicModel);
+    it->ExprNode::writeOutput(output, ExprNodeOutputType::matlabDynamicModel);
 }
 
 map<pair<int, pair<int, int >>, expr_t>
@@ -4652,7 +4652,7 @@ void
 DynamicModel::writeSetAuxiliaryVariables(const string &basename, const bool julia) const
 {
   ostringstream output_func_body;
-  writeAuxVarRecursiveDefinitions(output_func_body, oMatlabDseries);
+  writeAuxVarRecursiveDefinitions(output_func_body, ExprNodeOutputType::matlabDseries);
 
   if (output_func_body.str().empty())
     return;
@@ -5185,7 +5185,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con
       && !hessian_params_derivatives.size())
     return;
 
-  ExprNodeOutputType output_type = (julia ? oJuliaDynamicModel : oMatlabDynamicModel);
+  ExprNodeOutputType output_type = (julia ? ExprNodeOutputType::juliaDynamicModel : ExprNodeOutputType::matlabDynamicModel);
   ostringstream model_local_vars_output;   // Used for storing model local vars
   ostringstream model_output;              // Used for storing model temp vars and equations
   ostringstream jacobian_output;           // Used for storing jacobian equations
@@ -5422,13 +5422,13 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con
 void
 DynamicModel::writeLatexFile(const string &basename, const bool write_equation_tags) const
 {
-  writeLatexModelFile(basename + "_dynamic", oLatexDynamicModel, write_equation_tags);
+  writeLatexModelFile(basename + "_dynamic", ExprNodeOutputType::latexDynamicModel, write_equation_tags);
 }
 
 void
 DynamicModel::writeLatexOriginalFile(const string &basename, const bool write_equation_tags) const
 {
-  writeLatexModelFile(basename + "_original", oLatexDynamicModel, write_equation_tags);
+  writeLatexModelFile(basename + "_original", ExprNodeOutputType::latexDynamicModel, write_equation_tags);
 }
 
 void
@@ -5908,7 +5908,7 @@ DynamicModel::isChecksumMatching(const string &basename) const
            << equation_tag.second.first
            << equation_tag.second.second;
 
-  ExprNodeOutputType buffer_type = oCDynamicModel;
+  ExprNodeOutputType buffer_type = ExprNodeOutputType::CDynamicModel;
 
   for (int eq = 0; eq < (int) equations.size(); eq++)
     {
diff --git a/src/ExprNode.cc b/src/ExprNode.cc
index ea81f1d2..0f950d9d 100644
--- a/src/ExprNode.cc
+++ b/src/ExprNode.cc
@@ -104,10 +104,10 @@ ExprNode::checkIfTemporaryTermThenWrite(ostream &output, ExprNodeOutputType outp
   if (it == temporary_terms.end())
     return false;
 
-  if (output_type == oMatlabDynamicModelSparse)
+  if (output_type == ExprNodeOutputType::matlabDynamicModelSparse)
     output << "T" << idx << "(it_)";
   else
-    if (output_type == oMatlabStaticModelSparse || IS_C(output_type))
+    if (output_type == ExprNodeOutputType::matlabStaticModelSparse || isCOutput(output_type))
       output << "T" << idx;
     else
       {
@@ -177,7 +177,7 @@ ExprNode::normalizeEquation(int var_endo, vector<pair<int, pair<expr_t, expr_t>>
 void
 ExprNode::writeOutput(ostream &output) const
 {
-  writeOutput(output, oMatlabOutsideModel, {}, {});
+  writeOutput(output, ExprNodeOutputType::matlabOutsideModel, {}, {});
 }
 
 void
@@ -827,12 +827,12 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
   if (checkIfTemporaryTermThenWrite(output, output_type, temporary_terms, temporary_terms_idxs))
     return;
 
-  if (IS_LATEX(output_type))
+  if (isLatexOutput(output_type))
     {
-      if (output_type == oLatexDynamicSteadyStateOperator)
+      if (output_type == ExprNodeOutputType::latexDynamicSteadyStateOperator)
         output << "\\bar";
       output << "{" << datatree.symbol_table.getTeXName(symb_id);
-      if (output_type == oLatexDynamicModel
+      if (output_type == ExprNodeOutputType::latexDynamicModel
           && (type == SymbolType::endogenous || type == SymbolType::exogenous || type == SymbolType::exogenousDet || type == SymbolType::modelLocalVariable || type == SymbolType::trend || type == SymbolType::logTrend))
         {
           output << "_{t";
@@ -854,16 +854,16 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
     {
     case SymbolType::parameter:
     case SymbolType::parameterEpilogue:
-      if (output_type == oMatlabOutsideModel)
+      if (output_type == ExprNodeOutputType::matlabOutsideModel)
         output << "M_.params" << "(" << tsid + 1 << ")";
       else
         output << "params" << LEFT_ARRAY_SUBSCRIPT(output_type) << tsid + ARRAY_SUBSCRIPT_OFFSET(output_type) << RIGHT_ARRAY_SUBSCRIPT(output_type);
       break;
 
     case SymbolType::modelLocalVariable:
-      if (output_type == oMatlabDynamicModelSparse || output_type == oMatlabStaticModelSparse
-          || output_type == oMatlabDynamicSteadyStateOperator || output_type == oMatlabDynamicSparseSteadyStateOperator
-          || output_type == oCDynamicSteadyStateOperator)
+      if (output_type == ExprNodeOutputType::matlabDynamicModelSparse || output_type == ExprNodeOutputType::matlabStaticModelSparse
+          || output_type == ExprNodeOutputType::matlabDynamicSteadyStateOperator || output_type == ExprNodeOutputType::matlabDynamicSparseSteadyStateOperator
+          || output_type == ExprNodeOutputType::CDynamicSteadyStateOperator)
         {
           output << "(";
           datatree.getLocalVariable(symb_id)->writeOutput(output, output_type, temporary_terms, temporary_terms_idxs, tef_terms);
@@ -882,20 +882,20 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
     case SymbolType::endogenous:
       switch (output_type)
         {
-        case oJuliaDynamicModel:
-        case oMatlabDynamicModel:
-        case oCDynamicModel:
+        case ExprNodeOutputType::juliaDynamicModel:
+        case ExprNodeOutputType::matlabDynamicModel:
+        case ExprNodeOutputType::CDynamicModel:
           i = datatree.getDynJacobianCol(datatree.getDerivID(symb_id, lag)) + ARRAY_SUBSCRIPT_OFFSET(output_type);
           output <<  "y" << LEFT_ARRAY_SUBSCRIPT(output_type) << i << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oCStaticModel:
-        case oJuliaStaticModel:
-        case oMatlabStaticModel:
-        case oMatlabStaticModelSparse:
+        case ExprNodeOutputType::CStaticModel:
+        case ExprNodeOutputType::juliaStaticModel:
+        case ExprNodeOutputType::matlabStaticModel:
+        case ExprNodeOutputType::matlabStaticModelSparse:
           i = tsid + ARRAY_SUBSCRIPT_OFFSET(output_type);
           output <<  "y" << LEFT_ARRAY_SUBSCRIPT(output_type) << i << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oMatlabDynamicModelSparse:
+        case ExprNodeOutputType::matlabDynamicModelSparse:
           i = tsid + ARRAY_SUBSCRIPT_OFFSET(output_type);
           if (lag > 0)
             output << "y" << LEFT_ARRAY_SUBSCRIPT(output_type) << "it_+" << lag << ", " << i << RIGHT_ARRAY_SUBSCRIPT(output_type);
@@ -904,27 +904,27 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
           else
             output << "y" << LEFT_ARRAY_SUBSCRIPT(output_type) << "it_, " << i << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oMatlabOutsideModel:
+        case ExprNodeOutputType::matlabOutsideModel:
           output << "oo_.steady_state(" << tsid + 1 << ")";
           break;
-        case oJuliaDynamicSteadyStateOperator:
-        case oMatlabDynamicSteadyStateOperator:
-        case oMatlabDynamicSparseSteadyStateOperator:
+        case ExprNodeOutputType::juliaDynamicSteadyStateOperator:
+        case ExprNodeOutputType::matlabDynamicSteadyStateOperator:
+        case ExprNodeOutputType::matlabDynamicSparseSteadyStateOperator:
           output << "steady_state" << LEFT_ARRAY_SUBSCRIPT(output_type) << tsid + 1 << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oCDynamicSteadyStateOperator:
+        case ExprNodeOutputType::CDynamicSteadyStateOperator:
           output << "steady_state[" << tsid << "]";
           break;
-        case oJuliaSteadyStateFile:
-        case oSteadyStateFile:
+        case ExprNodeOutputType::juliaSteadyStateFile:
+        case ExprNodeOutputType::steadyStateFile:
           output << "ys_" << LEFT_ARRAY_SUBSCRIPT(output_type) << tsid + 1 << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oMatlabDseries:
+        case ExprNodeOutputType::matlabDseries:
           output << "ds." << datatree.symbol_table.getName(symb_id);
           if (lag != 0)
             output << LEFT_ARRAY_SUBSCRIPT(output_type) << lag << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oEpilogueFile:
+        case ExprNodeOutputType::epilogueFile:
           output << datatree.symbol_table.getName(symb_id)
                  << LEFT_ARRAY_SUBSCRIPT(output_type) << "epilogue_it__";
           if (lag != 0)
@@ -941,9 +941,9 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
       i = tsid + ARRAY_SUBSCRIPT_OFFSET(output_type);
       switch (output_type)
         {
-        case oJuliaDynamicModel:
-        case oMatlabDynamicModel:
-        case oMatlabDynamicModelSparse:
+        case ExprNodeOutputType::juliaDynamicModel:
+        case ExprNodeOutputType::matlabDynamicModel:
+        case ExprNodeOutputType::matlabDynamicModelSparse:
           if (lag > 0)
             output <<  "x" << LEFT_ARRAY_SUBSCRIPT(output_type) << "it_+" << lag << ", " << i
                    << RIGHT_ARRAY_SUBSCRIPT(output_type);
@@ -954,7 +954,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
             output <<  "x" << LEFT_ARRAY_SUBSCRIPT(output_type) << "it_, " << i
                    << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oCDynamicModel:
+        case ExprNodeOutputType::CDynamicModel:
           if (lag == 0)
             output <<  "x[it_+" << i << "*nb_row_x]";
           else if (lag > 0)
@@ -962,29 +962,29 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
           else
             output <<  "x[it_" << lag << "+" << i << "*nb_row_x]";
           break;
-        case oCStaticModel:
-        case oJuliaStaticModel:
-        case oMatlabStaticModel:
-        case oMatlabStaticModelSparse:
+        case ExprNodeOutputType::CStaticModel:
+        case ExprNodeOutputType::juliaStaticModel:
+        case ExprNodeOutputType::matlabStaticModel:
+        case ExprNodeOutputType::matlabStaticModelSparse:
           output << "x" << LEFT_ARRAY_SUBSCRIPT(output_type) << i << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oMatlabOutsideModel:
+        case ExprNodeOutputType::matlabOutsideModel:
           assert(lag == 0);
           output <<  "oo_.exo_steady_state(" << i << ")";
           break;
-        case oMatlabDynamicSteadyStateOperator:
+        case ExprNodeOutputType::matlabDynamicSteadyStateOperator:
           output <<  "oo_.exo_steady_state(" << i << ")";
           break;
-        case oJuliaSteadyStateFile:
-        case oSteadyStateFile:
+        case ExprNodeOutputType::juliaSteadyStateFile:
+        case ExprNodeOutputType::steadyStateFile:
           output << "exo_" << LEFT_ARRAY_SUBSCRIPT(output_type) << i << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oMatlabDseries:
+        case ExprNodeOutputType::matlabDseries:
           output << "ds." << datatree.symbol_table.getName(symb_id);
           if (lag != 0)
             output << LEFT_ARRAY_SUBSCRIPT(output_type) << lag << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oEpilogueFile:
+        case ExprNodeOutputType::epilogueFile:
           output << datatree.symbol_table.getName(symb_id)
                  << LEFT_ARRAY_SUBSCRIPT(output_type) << "epilogue_it__";
           if (lag != 0)
@@ -1001,9 +1001,9 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
       i = tsid + datatree.symbol_table.exo_nbr() + ARRAY_SUBSCRIPT_OFFSET(output_type);
       switch (output_type)
         {
-        case oJuliaDynamicModel:
-        case oMatlabDynamicModel:
-        case oMatlabDynamicModelSparse:
+        case ExprNodeOutputType::juliaDynamicModel:
+        case ExprNodeOutputType::matlabDynamicModel:
+        case ExprNodeOutputType::matlabDynamicModelSparse:
           if (lag > 0)
             output <<  "x" << LEFT_ARRAY_SUBSCRIPT(output_type) << "it_+" << lag << ", " << i
                    << RIGHT_ARRAY_SUBSCRIPT(output_type);
@@ -1014,7 +1014,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
             output <<  "x" << LEFT_ARRAY_SUBSCRIPT(output_type) << "it_, " << i
                    << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oCDynamicModel:
+        case ExprNodeOutputType::CDynamicModel:
           if (lag == 0)
             output <<  "x[it_+" << i << "*nb_row_x]";
           else if (lag > 0)
@@ -1022,29 +1022,29 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
           else
             output <<  "x[it_" << lag << "+" << i << "*nb_row_x]";
           break;
-        case oCStaticModel:
-        case oJuliaStaticModel:
-        case oMatlabStaticModel:
-        case oMatlabStaticModelSparse:
+        case ExprNodeOutputType::CStaticModel:
+        case ExprNodeOutputType::juliaStaticModel:
+        case ExprNodeOutputType::matlabStaticModel:
+        case ExprNodeOutputType::matlabStaticModelSparse:
           output << "x" << LEFT_ARRAY_SUBSCRIPT(output_type) << i << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oMatlabOutsideModel:
+        case ExprNodeOutputType::matlabOutsideModel:
           assert(lag == 0);
           output <<  "oo_.exo_det_steady_state(" << tsid + 1 << ")";
           break;
-        case oMatlabDynamicSteadyStateOperator:
+        case ExprNodeOutputType::matlabDynamicSteadyStateOperator:
           output <<  "oo_.exo_det_steady_state(" << tsid + 1 << ")";
           break;
-        case oJuliaSteadyStateFile:
-        case oSteadyStateFile:
+        case ExprNodeOutputType::juliaSteadyStateFile:
+        case ExprNodeOutputType::steadyStateFile:
           output << "exo_" << LEFT_ARRAY_SUBSCRIPT(output_type) << i << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oMatlabDseries:
+        case ExprNodeOutputType::matlabDseries:
           output << "ds." << datatree.symbol_table.getName(symb_id);
           if (lag != 0)
             output << LEFT_ARRAY_SUBSCRIPT(output_type) << lag << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
-        case oEpilogueFile:
+        case ExprNodeOutputType::epilogueFile:
           output << datatree.symbol_table.getName(symb_id)
                  << LEFT_ARRAY_SUBSCRIPT(output_type) << "epilogue_it__";
           if (lag != 0)
@@ -2467,13 +2467,13 @@ UnaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
       output << "exp";
       break;
     case UnaryOpcode::log:
-      if (IS_LATEX(output_type))
+      if (isLatexOutput(output_type))
         output << "\\log";
       else
         output << "log";
       break;
     case UnaryOpcode::log10:
-      if (IS_LATEX(output_type))
+      if (isLatexOutput(output_type))
         output << "\\log_{10}";
       else
         output << "log10";
@@ -2521,7 +2521,7 @@ UnaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
       output << "abs";
       break;
     case UnaryOpcode::sign:
-      if (output_type == oCDynamicModel || output_type == oCStaticModel)
+      if (output_type == ExprNodeOutputType::CDynamicModel || output_type == ExprNodeOutputType::CStaticModel)
         output << "copysign";
       else
         output << "sign";
@@ -2530,20 +2530,20 @@ UnaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
       ExprNodeOutputType new_output_type;
       switch (output_type)
         {
-        case oMatlabDynamicModel:
-          new_output_type = oMatlabDynamicSteadyStateOperator;
+        case ExprNodeOutputType::matlabDynamicModel:
+          new_output_type = ExprNodeOutputType::matlabDynamicSteadyStateOperator;
           break;
-        case oLatexDynamicModel:
-          new_output_type = oLatexDynamicSteadyStateOperator;
+        case ExprNodeOutputType::latexDynamicModel:
+          new_output_type = ExprNodeOutputType::latexDynamicSteadyStateOperator;
           break;
-        case oCDynamicModel:
-          new_output_type = oCDynamicSteadyStateOperator;
+        case ExprNodeOutputType::CDynamicModel:
+          new_output_type = ExprNodeOutputType::CDynamicSteadyStateOperator;
           break;
-        case oJuliaDynamicModel:
-          new_output_type = oJuliaDynamicSteadyStateOperator;
+        case ExprNodeOutputType::juliaDynamicModel:
+          new_output_type = ExprNodeOutputType::juliaDynamicSteadyStateOperator;
           break;
-        case oMatlabDynamicModelSparse:
-          new_output_type = oMatlabDynamicSparseSteadyStateOperator;
+        case ExprNodeOutputType::matlabDynamicModelSparse:
+          new_output_type = ExprNodeOutputType::matlabDynamicSparseSteadyStateOperator;
           break;
         default:
           new_output_type = output_type;
@@ -2561,7 +2561,7 @@ UnaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
         assert(datatree.symbol_table.getType(param1_symb_id) == SymbolType::parameter);
         int tsid_endo = datatree.symbol_table.getTypeSpecificID(varg->symb_id);
         int tsid_param = datatree.symbol_table.getTypeSpecificID(param1_symb_id);
-        assert(IS_MATLAB(output_type));
+        assert(isMatlabOutput(output_type));
         output << "ss_param_deriv(" << tsid_endo+1 << "," << tsid_param+1 << ")";
       }
       return;
@@ -2575,13 +2575,13 @@ UnaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
         int tsid_endo = datatree.symbol_table.getTypeSpecificID(varg->symb_id);
         int tsid_param1 = datatree.symbol_table.getTypeSpecificID(param1_symb_id);
         int tsid_param2 = datatree.symbol_table.getTypeSpecificID(param2_symb_id);
-        assert(IS_MATLAB(output_type));
+        assert(isMatlabOutput(output_type));
         output << "ss_param_2nd_deriv(" << tsid_endo+1 << "," << tsid_param1+1
                << "," << tsid_param2+1 << ")";
       }
       return;
     case UnaryOpcode::expectation:
-      if (!IS_LATEX(output_type))
+      if (!isLatexOutput(output_type))
         {
           cerr << "UnaryOpNode::writeOutput: not implemented on UnaryOpcode::expectation" << endl;
           exit(EXIT_FAILURE);
@@ -2617,7 +2617,7 @@ UnaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
           && arg->precedence(output_type, temporary_terms) < precedence(output_type, temporary_terms)))
     {
       output << LEFT_PAR(output_type);
-      if (op_code == UnaryOpcode::sign && (output_type == oCDynamicModel || output_type == oCStaticModel))
+      if (op_code == UnaryOpcode::sign && (output_type == ExprNodeOutputType::CDynamicModel || output_type == ExprNodeOutputType::CStaticModel))
         output << "1.0,";
       close_parenthesis = true;
     }
@@ -3761,7 +3761,7 @@ BinaryOpNode::precedence(ExprNodeOutputType output_type, const temporary_terms_t
       return 4;
     case BinaryOpcode::power:
     case BinaryOpcode::powerDeriv:
-      if (IS_C(output_type))
+      if (isCOutput(output_type))
         // In C, power operator is of the form pow(a, b)
         return 100;
       else
@@ -4216,11 +4216,11 @@ BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
   // Treat derivative of Power
   if (op_code == BinaryOpcode::powerDeriv)
     {
-      if (IS_LATEX(output_type))
+      if (isLatexOutput(output_type))
         unpackPowerDeriv()->writeOutput(output, output_type, temporary_terms, temporary_terms_idxs, tef_terms);
       else
         {
-          if (output_type == oJuliaStaticModel || output_type == oJuliaDynamicModel)
+          if (output_type == ExprNodeOutputType::juliaStaticModel || output_type == ExprNodeOutputType::juliaDynamicModel)
             output << "get_power_deriv(";
           else
             output << "getPowerDeriv(";
@@ -4233,7 +4233,7 @@ BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
     }
 
   // Treat special case of power operator in C, and case of max and min operators
-  if ((op_code == BinaryOpcode::power && IS_C(output_type)) || op_code == BinaryOpcode::max || op_code == BinaryOpcode::min)
+  if ((op_code == BinaryOpcode::power && isCOutput(output_type)) || op_code == BinaryOpcode::max || op_code == BinaryOpcode::min)
     {
       switch (op_code)
         {
@@ -4260,7 +4260,7 @@ BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
 
   bool close_parenthesis = false;
 
-  if (IS_LATEX(output_type) && op_code == BinaryOpcode::divide)
+  if (isLatexOutput(output_type) && op_code == BinaryOpcode::divide)
     output << "\\frac{";
   else
     {
@@ -4280,7 +4280,7 @@ BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
   if (close_parenthesis)
     output << RIGHT_PAR(output_type);
 
-  if (IS_LATEX(output_type) && op_code == BinaryOpcode::divide)
+  if (isLatexOutput(output_type) && op_code == BinaryOpcode::divide)
     output << "}";
 
   // Write current operator symbol
@@ -4293,13 +4293,13 @@ BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
       output << "-";
       break;
     case BinaryOpcode::times:
-      if (IS_LATEX(output_type))
+      if (isLatexOutput(output_type))
         output << "\\, ";
       else
         output << "*";
       break;
     case BinaryOpcode::divide:
-      if (!IS_LATEX(output_type))
+      if (!isLatexOutput(output_type))
         output << "/";
       break;
     case BinaryOpcode::power:
@@ -4312,13 +4312,13 @@ BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
       output << ">";
       break;
     case BinaryOpcode::lessEqual:
-      if (IS_LATEX(output_type))
+      if (isLatexOutput(output_type))
         output << "\\leq ";
       else
         output << "<=";
       break;
     case BinaryOpcode::greaterEqual:
-      if (IS_LATEX(output_type))
+      if (isLatexOutput(output_type))
         output << "\\geq ";
       else
         output << ">=";
@@ -4327,11 +4327,11 @@ BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
       output << "==";
       break;
     case BinaryOpcode::different:
-      if (IS_MATLAB(output_type))
+      if (isMatlabOutput(output_type))
         output << "~=";
       else
         {
-          if (IS_C(output_type) || IS_JULIA(output_type))
+          if (isCOutput(output_type) || isJuliaOutput(output_type))
             output << "!=";
           else
             output << "\\neq ";
@@ -4346,7 +4346,7 @@ BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
 
   close_parenthesis = false;
 
-  if (IS_LATEX(output_type) && (op_code == BinaryOpcode::power || op_code == BinaryOpcode::divide))
+  if (isLatexOutput(output_type) && (op_code == BinaryOpcode::power || op_code == BinaryOpcode::divide))
     output << "{";
   else
     {
@@ -4358,9 +4358,9 @@ BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
       auto *barg2 = dynamic_cast<BinaryOpNode *>(arg2);
       int arg2_prec = arg2->precedence(output_type, temporary_terms);
       if (arg2_prec < prec
-          || (op_code == BinaryOpcode::power && barg2 != nullptr && barg2->op_code == BinaryOpcode::power && !IS_LATEX(output_type))
+          || (op_code == BinaryOpcode::power && barg2 != nullptr && barg2->op_code == BinaryOpcode::power && !isLatexOutput(output_type))
           || (op_code == BinaryOpcode::minus && arg2_prec == prec)
-          || (op_code == BinaryOpcode::divide && arg2_prec == prec && !IS_LATEX(output_type)))
+          || (op_code == BinaryOpcode::divide && arg2_prec == prec && !isLatexOutput(output_type)))
         {
           output << LEFT_PAR(output_type);
           close_parenthesis = true;
@@ -4370,7 +4370,7 @@ BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
   // Write right argument
   arg2->writeOutput(output, output_type, temporary_terms, temporary_terms_idxs, tef_terms);
 
-  if (IS_LATEX(output_type) && (op_code == BinaryOpcode::power || op_code == BinaryOpcode::divide))
+  if (isLatexOutput(output_type) && (op_code == BinaryOpcode::power || op_code == BinaryOpcode::divide))
     output << "}";
 
   if (close_parenthesis)
@@ -5830,7 +5830,7 @@ TrinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
   switch (op_code)
     {
     case TrinaryOpcode::normcdf:
-      if (IS_C(output_type))
+      if (isCOutput(output_type))
         {
           // In C, there is no normcdf() primitive, so use erf()
           output << "(0.5*(1+erf(((";
@@ -5853,7 +5853,7 @@ TrinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
         }
       break;
     case TrinaryOpcode::normpdf:
-      if (IS_C(output_type))
+      if (isCOutput(output_type))
         {
           //(1/(v3*sqrt(2*M_PI)*exp(pow((v1-v2)/v3,2)/2)))
           output << "(1/(";
@@ -7121,11 +7121,11 @@ ExternalFunctionNode::writeOutput(ostream &output, ExprNodeOutputType output_typ
                                   const temporary_terms_idxs_t &temporary_terms_idxs,
                                   const deriv_node_temp_terms_t &tef_terms) const
 {
-  if (output_type == oMatlabOutsideModel || output_type == oSteadyStateFile
-      || output_type == oJuliaSteadyStateFile
-      || IS_LATEX(output_type))
+  if (output_type == ExprNodeOutputType::matlabOutsideModel || output_type == ExprNodeOutputType::steadyStateFile
+      || output_type == ExprNodeOutputType::juliaSteadyStateFile
+      || isLatexOutput(output_type))
     {
-      string name = IS_LATEX(output_type) ? datatree.symbol_table.getTeXName(symb_id)
+      string name = isLatexOutput(output_type) ? datatree.symbol_table.getTeXName(symb_id)
         : datatree.symbol_table.getName(symb_id);
       output << name << "(";
       writeExternalFunctionArguments(output, output_type, temporary_terms, temporary_terms_idxs, tef_terms);
@@ -7136,7 +7136,7 @@ ExternalFunctionNode::writeOutput(ostream &output, ExprNodeOutputType output_typ
   if (checkIfTemporaryTermThenWrite(output, output_type, temporary_terms, temporary_terms_idxs))
     return;
 
-  if (IS_C(output_type))
+  if (isCOutput(output_type))
     output << "*";
   output << "TEF_" << getIndxInTefTerms(symb_id, tef_terms);
 }
@@ -7160,7 +7160,7 @@ ExternalFunctionNode::writeExternalFunctionOutput(ostream &output, ExprNodeOutpu
       int second_deriv_symb_id = datatree.external_functions_table.getSecondDerivSymbID(symb_id);
       assert(second_deriv_symb_id != eExtFunSetButNoNameProvided);
 
-      if (IS_C(output_type))
+      if (isCOutput(output_type))
         {
           stringstream ending;
           ending << "_tef_" << getIndxInTefTerms(symb_id, tef_terms);
@@ -7367,9 +7367,9 @@ FirstDerivExternalFunctionNode::writeOutput(ostream &output, ExprNodeOutputType
                                             const temporary_terms_idxs_t &temporary_terms_idxs,
                                             const deriv_node_temp_terms_t &tef_terms) const
 {
-  assert(output_type != oMatlabOutsideModel);
+  assert(output_type != ExprNodeOutputType::matlabOutsideModel);
 
-  if (IS_LATEX(output_type))
+  if (isLatexOutput(output_type))
     {
       output << "\\frac{\\partial " << datatree.symbol_table.getTeXName(symb_id)
              << "}{\\partial " << inputIndex << "}(";
@@ -7391,7 +7391,7 @@ FirstDerivExternalFunctionNode::writeOutput(ostream &output, ExprNodeOutputType
            << LEFT_ARRAY_SUBSCRIPT(output_type) << tmpIndx << RIGHT_ARRAY_SUBSCRIPT(output_type);
   else if (first_deriv_symb_id == eExtFunNotSet)
     {
-      if (IS_C(output_type))
+      if (isCOutput(output_type))
         output << "*";
       output << "TEFD_fdd_" << getIndxInTefTerms(symb_id, tef_terms) << "_" << inputIndex;
     }
@@ -7444,7 +7444,7 @@ FirstDerivExternalFunctionNode::writeExternalFunctionOutput(ostream &output, Exp
                                                             const temporary_terms_idxs_t &temporary_terms_idxs,
                                                             deriv_node_temp_terms_t &tef_terms) const
 {
-  assert(output_type != oMatlabOutsideModel);
+  assert(output_type != ExprNodeOutputType::matlabOutsideModel);
   int first_deriv_symb_id = datatree.external_functions_table.getFirstDerivSymbID(symb_id);
   assert(first_deriv_symb_id != eExtFunSetButNoNameProvided);
 
@@ -7461,7 +7461,7 @@ FirstDerivExternalFunctionNode::writeExternalFunctionOutput(ostream &output, Exp
   if (alreadyWrittenAsTefTerm(first_deriv_symb_id, tef_terms))
     return;
 
-  if (IS_C(output_type))
+  if (isCOutput(output_type))
     if (first_deriv_symb_id == eExtFunNotSet)
       {
         stringstream ending;
@@ -7748,9 +7748,9 @@ SecondDerivExternalFunctionNode::writeOutput(ostream &output, ExprNodeOutputType
                                              const temporary_terms_idxs_t &temporary_terms_idxs,
                                              const deriv_node_temp_terms_t &tef_terms) const
 {
-  assert(output_type != oMatlabOutsideModel);
+  assert(output_type != ExprNodeOutputType::matlabOutsideModel);
 
-  if (IS_LATEX(output_type))
+  if (isLatexOutput(output_type))
     {
       output << "\\frac{\\partial^2 " << datatree.symbol_table.getTeXName(symb_id)
              << "}{\\partial " << inputIndex1 << "\\partial " << inputIndex2 << "}(";
@@ -7770,7 +7770,7 @@ SecondDerivExternalFunctionNode::writeOutput(ostream &output, ExprNodeOutputType
 
   int indx = getIndxInTefTerms(symb_id, tef_terms);
   if (second_deriv_symb_id == symb_id)
-    if (IS_C(output_type))
+    if (isCOutput(output_type))
       output << "TEFDD_" << indx
              << LEFT_ARRAY_SUBSCRIPT(output_type) << tmpIndex1 << " * TEFDD_" << indx << "_nrows + "
              << tmpIndex2 << RIGHT_ARRAY_SUBSCRIPT(output_type);
@@ -7779,12 +7779,12 @@ SecondDerivExternalFunctionNode::writeOutput(ostream &output, ExprNodeOutputType
              << LEFT_ARRAY_SUBSCRIPT(output_type) << tmpIndex1 << "," << tmpIndex2 << RIGHT_ARRAY_SUBSCRIPT(output_type);
   else if (second_deriv_symb_id == eExtFunNotSet)
     {
-      if (IS_C(output_type))
+      if (isCOutput(output_type))
         output << "*";
       output << "TEFDD_fdd_" << getIndxInTefTerms(symb_id, tef_terms) << "_" << inputIndex1 << "_" << inputIndex2;
     }
   else
-    if (IS_C(output_type))
+    if (isCOutput(output_type))
       output << "TEFDD_def_" << getIndxInTefTerms(second_deriv_symb_id, tef_terms)
              << LEFT_ARRAY_SUBSCRIPT(output_type) << tmpIndex1 << " * PROBLEM_" << indx << "_nrows"
              << tmpIndex2 << RIGHT_ARRAY_SUBSCRIPT(output_type);
@@ -7799,7 +7799,7 @@ SecondDerivExternalFunctionNode::writeExternalFunctionOutput(ostream &output, Ex
                                                              const temporary_terms_idxs_t &temporary_terms_idxs,
                                                              deriv_node_temp_terms_t &tef_terms) const
 {
-  assert(output_type != oMatlabOutsideModel);
+  assert(output_type != ExprNodeOutputType::matlabOutsideModel);
   int second_deriv_symb_id = datatree.external_functions_table.getSecondDerivSymbID(symb_id);
   assert(second_deriv_symb_id != eExtFunSetButNoNameProvided);
 
@@ -7816,7 +7816,7 @@ SecondDerivExternalFunctionNode::writeExternalFunctionOutput(ostream &output, Ex
   if (alreadyWrittenAsTefTerm(second_deriv_symb_id, tef_terms))
     return;
 
-  if (IS_C(output_type))
+  if (isCOutput(output_type))
     if (second_deriv_symb_id == eExtFunNotSet)
       {
         stringstream ending;
@@ -8060,9 +8060,9 @@ VarExpectationNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
                                 const temporary_terms_idxs_t &temporary_terms_idxs,
                                 const deriv_node_temp_terms_t &tef_terms) const
 {
-  assert(output_type != oMatlabOutsideModel);
+  assert(output_type != ExprNodeOutputType::matlabOutsideModel);
 
-  if (IS_LATEX(output_type))
+  if (isLatexOutput(output_type))
     {
       output << "VAR_EXPECTATION(" << model_name << ')';
       return;
@@ -8505,9 +8505,9 @@ PacExpectationNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
                                 const temporary_terms_idxs_t &temporary_terms_idxs,
                                 const deriv_node_temp_terms_t &tef_terms) const
 {
-  assert(output_type != oMatlabOutsideModel);
+  assert(output_type != ExprNodeOutputType::matlabOutsideModel);
 
-  if (IS_LATEX(output_type))
+  if (isLatexOutput(output_type))
     {
       output << "PAC_EXPECTATION" << LEFT_PAR(output_type) << model_name << RIGHT_PAR(output_type);
       return;
diff --git a/src/ExprNode.hh b/src/ExprNode.hh
index 62370cb4..e1eb58eb 100644
--- a/src/ExprNode.hh
+++ b/src/ExprNode.hh
@@ -67,65 +67,81 @@ using deriv_node_temp_terms_t = map<pair<int, vector<expr_t>>, int>;
 using diff_table_t = map<expr_t, map<int, expr_t>>;
 
 //! Possible types of output when writing ExprNode(s)
-enum ExprNodeOutputType
+enum class ExprNodeOutputType
   {
-    oMatlabStaticModel,                           //!< Matlab code, static model
-    oMatlabDynamicModel,                          //!< Matlab code, dynamic model
-    oMatlabStaticModelSparse,                     //!< Matlab code, static block decomposed model
-    oMatlabDynamicModelSparse,                    //!< Matlab code, dynamic block decomposed model
-    oCDynamicModel,                               //!< C code, dynamic model
-    oCStaticModel,                                //!< C code, static model
-    oJuliaStaticModel,                            //!< Julia code, static model
-    oJuliaDynamicModel,                           //!< Julia code, dynamic model
-    oMatlabOutsideModel,                          //!< Matlab code, outside model block (for example in initval)
-    oLatexStaticModel,                            //!< LaTeX code, static model
-    oLatexDynamicModel,                           //!< LaTeX code, dynamic model
-    oLatexDynamicSteadyStateOperator,             //!< LaTeX code, dynamic model, inside a steady state operator
-    oMatlabDynamicSteadyStateOperator,            //!< Matlab code, dynamic model, inside a steady state operator
-    oMatlabDynamicSparseSteadyStateOperator,      //!< Matlab code, dynamic block decomposed model, inside a steady state operator
-    oCDynamicSteadyStateOperator,                 //!< C code, dynamic model, inside a steady state operator
-    oJuliaDynamicSteadyStateOperator,             //!< Julia code, dynamic model, inside a steady state operator
-    oSteadyStateFile,                             //!< Matlab code, in the generated steady state file
-    oJuliaSteadyStateFile,                        //!< Julia code, in the generated steady state file
-    oMatlabDseries,                               //!< Matlab code for dseries
-    oEpilogueFile                                 //!< Matlab code, in the generated epilogue file
+    matlabStaticModel,                           //!< Matlab code, static model
+    matlabDynamicModel,                          //!< Matlab code, dynamic model
+    matlabStaticModelSparse,                     //!< Matlab code, static block decomposed model
+    matlabDynamicModelSparse,                    //!< Matlab code, dynamic block decomposed model
+    CDynamicModel,                               //!< C code, dynamic model
+    CStaticModel,                                //!< C code, static model
+    juliaStaticModel,                            //!< Julia code, static model
+    juliaDynamicModel,                           //!< Julia code, dynamic model
+    matlabOutsideModel,                          //!< Matlab code, outside model block (for example in initval)
+    latexStaticModel,                            //!< LaTeX code, static model
+    latexDynamicModel,                           //!< LaTeX code, dynamic model
+    latexDynamicSteadyStateOperator,             //!< LaTeX code, dynamic model, inside a steady state operator
+    matlabDynamicSteadyStateOperator,            //!< Matlab code, dynamic model, inside a steady state operator
+    matlabDynamicSparseSteadyStateOperator,      //!< Matlab code, dynamic block decomposed model, inside a steady state operator
+    CDynamicSteadyStateOperator,                 //!< C code, dynamic model, inside a steady state operator
+    juliaDynamicSteadyStateOperator,             //!< Julia code, dynamic model, inside a steady state operator
+    steadyStateFile,                             //!< Matlab code, in the generated steady state file
+    juliaSteadyStateFile,                        //!< Julia code, in the generated steady state file
+    matlabDseries,                               //!< Matlab code for dseries
+    epilogueFile                                 //!< Matlab code, in the generated epilogue file
   };
 
-#define IS_MATLAB(output_type) ((output_type) == oMatlabStaticModel     \
-                                || (output_type) == oMatlabDynamicModel \
-                                || (output_type) == oMatlabOutsideModel \
-                                || (output_type) == oMatlabStaticModelSparse \
-                                || (output_type) == oMatlabDynamicModelSparse \
-                                || (output_type) == oMatlabDynamicSteadyStateOperator \
-                                || (output_type) == oMatlabDynamicSparseSteadyStateOperator \
-                                || (output_type) == oSteadyStateFile \
-                                || (output_type) == oMatlabDseries \
-                                || (output_type) == oEpilogueFile)
-
-#define IS_JULIA(output_type) ((output_type) == oJuliaStaticModel       \
-                               || (output_type) == oJuliaDynamicModel   \
-                               || (output_type) == oJuliaDynamicSteadyStateOperator \
-                               || (output_type) == oJuliaSteadyStateFile)
-
-#define IS_C(output_type) ((output_type) == oCDynamicModel              \
-                           || (output_type) == oCStaticModel            \
-                           || (output_type) == oCDynamicSteadyStateOperator)
-
-#define IS_LATEX(output_type) ((output_type) == oLatexStaticModel       \
-                               || (output_type) == oLatexDynamicModel   \
-                               || (output_type) == oLatexDynamicSteadyStateOperator)
+inline bool
+isMatlabOutput(ExprNodeOutputType output_type)
+{
+  return output_type == ExprNodeOutputType::matlabStaticModel
+    || output_type == ExprNodeOutputType::matlabDynamicModel
+    || output_type == ExprNodeOutputType::matlabOutsideModel
+    || output_type == ExprNodeOutputType::matlabStaticModelSparse
+    || output_type == ExprNodeOutputType::matlabDynamicModelSparse
+    || output_type == ExprNodeOutputType::matlabDynamicSteadyStateOperator
+    || output_type == ExprNodeOutputType::matlabDynamicSparseSteadyStateOperator
+    || output_type == ExprNodeOutputType::steadyStateFile
+    || output_type == ExprNodeOutputType::matlabDseries
+    || output_type == ExprNodeOutputType::epilogueFile;
+}
+
+inline bool
+isJuliaOutput(ExprNodeOutputType output_type)
+{
+  return output_type == ExprNodeOutputType::juliaStaticModel
+    || output_type == ExprNodeOutputType::juliaDynamicModel
+    || output_type == ExprNodeOutputType::juliaDynamicSteadyStateOperator
+    || output_type == ExprNodeOutputType::juliaSteadyStateFile;
+}
+
+inline bool
+isCOutput(ExprNodeOutputType output_type)
+{
+  return output_type == ExprNodeOutputType::CDynamicModel
+    || output_type == ExprNodeOutputType::CStaticModel
+    || output_type == ExprNodeOutputType::CDynamicSteadyStateOperator;
+}
+
+inline bool
+isLatexOutput(ExprNodeOutputType output_type)
+{
+  return output_type == ExprNodeOutputType::latexStaticModel
+    || output_type == ExprNodeOutputType::latexDynamicModel
+    || output_type == ExprNodeOutputType::latexDynamicSteadyStateOperator;
+}
 
 /* Equal to 1 for Matlab langage or Julia, or to 0 for C language. Not defined for LaTeX.
    In Matlab and Julia, array indexes begin at 1, while they begin at 0 in C */
-#define ARRAY_SUBSCRIPT_OFFSET(output_type) ((int) (IS_MATLAB(output_type) || IS_JULIA(output_type)))
+#define ARRAY_SUBSCRIPT_OFFSET(output_type) ((int) (isMatlabOutput(output_type) || isJuliaOutput(output_type)))
 
 // Left and right array subscript delimiters: '(' and ')' for Matlab, '[' and ']' for C
-#define LEFT_ARRAY_SUBSCRIPT(output_type) (IS_MATLAB(output_type) ? '(' : '[')
-#define RIGHT_ARRAY_SUBSCRIPT(output_type) (IS_MATLAB(output_type) ? ')' : ']')
+#define LEFT_ARRAY_SUBSCRIPT(output_type) (isMatlabOutput(output_type) ? '(' : '[')
+#define RIGHT_ARRAY_SUBSCRIPT(output_type) (isMatlabOutput(output_type) ? ')' : ']')
 
 // Left and right parentheses
-#define LEFT_PAR(output_type) (IS_LATEX(output_type) ? "\\left(" : "(")
-#define RIGHT_PAR(output_type) (IS_LATEX(output_type) ? "\\right)" : ")")
+#define LEFT_PAR(output_type) (isLatexOutput(output_type) ? "\\left(" : "(")
+#define RIGHT_PAR(output_type) (isLatexOutput(output_type) ? "\\right)" : ")")
 
 //! Base class for expression nodes
 class ExprNode
diff --git a/src/ModFile.cc b/src/ModFile.cc
index 1b3ddc9c..4848ef43 100644
--- a/src/ModFile.cc
+++ b/src/ModFile.cc
@@ -1009,19 +1009,19 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool clear_glo
       auto ivs = dynamic_cast<InitValStatement *>(statement.get());
       if (ivs != nullptr)
         {
-          static_model.writeAuxVarInitval(mOutputFile, oMatlabOutsideModel);
+          static_model.writeAuxVarInitval(mOutputFile, ExprNodeOutputType::matlabOutsideModel);
           ivs->writeOutputPostInit(mOutputFile);
         }
 
       // Special treatment for endval block: insert initial values for the auxiliary variables
       auto evs = dynamic_cast<EndValStatement *>(statement.get());
       if (evs != nullptr)
-        static_model.writeAuxVarInitval(mOutputFile, oMatlabOutsideModel);
+        static_model.writeAuxVarInitval(mOutputFile, ExprNodeOutputType::matlabOutsideModel);
 
       // Special treatment for load params and steady state statement: insert initial values for the auxiliary variables
       auto lpass = dynamic_cast<LoadParamsAndSteadyStateStatement *>(statement.get());
       if (lpass && !no_static)
-        static_model.writeAuxVarInitval(mOutputFile, oMatlabOutsideModel);
+        static_model.writeAuxVarInitval(mOutputFile, ExprNodeOutputType::matlabOutsideModel);
     }
 
   mOutputFile << "save('" << basename << "_results.mat', 'oo_', 'M_', 'options_');" << endl
diff --git a/src/ModelEquationBlock.cc b/src/ModelEquationBlock.cc
index 5edeab5e..59f5170f 100644
--- a/src/ModelEquationBlock.cc
+++ b/src/ModelEquationBlock.cc
@@ -147,7 +147,7 @@ SteadyStateModel::writeLatexSteadyStateFile(const string &basename) const
         expr_t value = it.second;
         content_output << "\\begin{dmath}" << endl
                        << symbol_table.getTeXName(id) << " = ";
-        value->writeOutput(content_output, oLatexStaticModel);
+        value->writeOutput(content_output, ExprNodeOutputType::latexStaticModel);
         content_output << endl << "\\end{dmath}" << endl;
       }
 
@@ -175,7 +175,7 @@ SteadyStateModel::writeSteadyStateFile(const string &basename, bool ramsey_model
       exit(EXIT_FAILURE);
     }
 
-  ExprNodeOutputType output_type = (julia ? oJuliaSteadyStateFile : oSteadyStateFile);
+  ExprNodeOutputType output_type = (julia ? ExprNodeOutputType::juliaSteadyStateFile : ExprNodeOutputType::steadyStateFile);
 
   if (!julia)
     output << "function [ys_, params, info] = steadystate("
@@ -328,7 +328,7 @@ Epilogue::writeEpilogueFile(const string &basename) const
       exit(EXIT_FAILURE);
     }
 
-  ExprNodeOutputType output_type = oEpilogueFile;
+  ExprNodeOutputType output_type = ExprNodeOutputType::epilogueFile;
   output << "function ds = epilogue(params, ds)" << endl
          << "% function ds = epilogue(params, ds)" << endl
          << "% Epilogue file generated by Dynare preprocessor" << endl << endl
diff --git a/src/ModelTree.cc b/src/ModelTree.cc
index 8fa85271..e9916de6 100644
--- a/src/ModelTree.cc
+++ b/src/ModelTree.cc
@@ -279,7 +279,7 @@ ModelTree::evaluateAndReduceJacobian(const eval_context_t &eval_context, jacob_m
           catch (ExprNode::EvalException &e)
             {
               cerr << "ERROR: evaluation of Jacobian failed for equation " << eq+1 << " (line " << equations_lineno[eq] << ") and variable " << symbol_table.getName(symb) << "(" << lag << ") [" << symb << "] !" << endl;
-              Id->writeOutput(cerr, oMatlabDynamicModelSparse, temporary_terms, {});
+              Id->writeOutput(cerr, ExprNodeOutputType::matlabDynamicModelSparse, temporary_terms, {});
               cerr << endl;
               exit(EXIT_FAILURE);
             }
@@ -1193,16 +1193,16 @@ ModelTree::writeModelLocalVariableTemporaryTerms(const temporary_terms_t &tto, c
   temporary_terms_t tt2;
   for (auto it : tt)
     {
-      if (IS_C(output_type))
+      if (isCOutput(output_type))
         output << "double ";
-      else if (IS_JULIA(output_type))
+      else if (isJuliaOutput(output_type))
         output << "    @inbounds const ";
 
       it.first->writeOutput(output, output_type, tto, temporary_terms_idxs, tef_terms);
       output << " = ";
       it.second->writeOutput(output, output_type, tt2, temporary_terms_idxs, tef_terms);
 
-      if (IS_C(output_type) || IS_MATLAB(output_type))
+      if (isCOutput(output_type) || isMatlabOutput(output_type))
         output << ";";
       output << endl;
 
@@ -1225,16 +1225,16 @@ ModelTree::writeTemporaryTerms(const temporary_terms_t &tt,
       if (dynamic_cast<AbstractExternalFunctionNode *>(*it) != nullptr)
         (*it)->writeExternalFunctionOutput(output, output_type, tt2, tt_idxs, tef_terms);
 
-      if (IS_C(output_type))
+      if (isCOutput(output_type))
         output << "double ";
-      else if (IS_JULIA(output_type))
+      else if (isJuliaOutput(output_type))
         output << "    @inbounds ";
 
       (*it)->writeOutput(output, output_type, tt, tt_idxs, tef_terms);
       output << " = ";
       (*it)->writeOutput(output, output_type, tt2, tt_idxs, tef_terms);
 
-      if (IS_C(output_type) || IS_MATLAB(output_type))
+      if (isCOutput(output_type) || isMatlabOutput(output_type))
         output << ";";
       output << endl;
 
@@ -1527,7 +1527,7 @@ ModelTree::writeModelEquations(ostream &output, ExprNodeOutputType output_type,
         }
 
       if (vrhs != 0) // The right hand side of the equation is not empty ==> residual=lhs-rhs;
-        if (IS_JULIA(output_type))
+        if (isJuliaOutput(output_type))
           {
             output << "    @inbounds residual" << LEFT_ARRAY_SUBSCRIPT(output_type)
                    << eq + ARRAY_SUBSCRIPT_OFFSET(output_type)
@@ -1553,7 +1553,7 @@ ModelTree::writeModelEquations(ostream &output, ExprNodeOutputType output_type,
           }
       else // The right hand side of the equation is empty ==> residual=lhs;
         {
-          if (IS_JULIA(output_type))
+          if (isJuliaOutput(output_type))
             output << "    @inbounds ";
           output << "residual" << LEFT_ARRAY_SUBSCRIPT(output_type)
                  << eq + ARRAY_SUBSCRIPT_OFFSET(output_type)
@@ -1801,10 +1801,10 @@ ModelTree::set_cutoff_to_zero()
 void
 ModelTree::jacobianHelper(ostream &output, int eq_nb, int col_nb, ExprNodeOutputType output_type) const
 {
-  if (IS_JULIA(output_type))
+  if (isJuliaOutput(output_type))
     output << "    @inbounds ";
   output << "g1" << LEFT_ARRAY_SUBSCRIPT(output_type);
-  if (IS_MATLAB(output_type) || IS_JULIA(output_type))
+  if (isMatlabOutput(output_type) || isJuliaOutput(output_type))
     output << eq_nb + 1 << "," << col_nb + 1;
   else
     output << eq_nb + col_nb *equations.size();
@@ -1815,7 +1815,7 @@ void
 ModelTree::sparseHelper(int order, ostream &output, int row_nb, int col_nb, ExprNodeOutputType output_type) const
 {
   output << "v" << order << LEFT_ARRAY_SUBSCRIPT(output_type);
-  if (IS_MATLAB(output_type) || IS_JULIA(output_type))
+  if (isMatlabOutput(output_type) || isJuliaOutput(output_type))
     output << row_nb + 1 << "," << col_nb + 1;
   else
     output << row_nb + col_nb * NNZDerivatives[order-1];
diff --git a/src/StaticModel.cc b/src/StaticModel.cc
index 32ac5ccb..c46f193f 100644
--- a/src/StaticModel.cc
+++ b/src/StaticModel.cc
@@ -203,7 +203,7 @@ StaticModel::writeModelEquationsOrdered_M(const string &basename) const
   deriv_node_temp_terms_t tef_terms;
   ExprNodeOutputType local_output_type;
 
-  local_output_type = oMatlabStaticModelSparse;
+  local_output_type = ExprNodeOutputType::matlabStaticModelSparse;
   if (global_temporary_terms)
     local_temporary_terms = temporary_terms;
 
@@ -1343,8 +1343,8 @@ StaticModel::writeStaticModel(const string &basename,
   ostringstream third_derivatives_output;    // Used for storing third order derivatives equations
   ostringstream for_sym;
 
-  ExprNodeOutputType output_type = (use_dll ? oCStaticModel :
-                                    julia ? oJuliaStaticModel : oMatlabStaticModel);
+  ExprNodeOutputType output_type = (use_dll ? ExprNodeOutputType::CStaticModel :
+                                    julia ? ExprNodeOutputType::juliaStaticModel : ExprNodeOutputType::matlabStaticModel);
 
   deriv_node_temp_terms_t tef_terms;
   temporary_terms_t temp_term_union;
@@ -1415,7 +1415,7 @@ StaticModel::writeStaticModel(const string &basename,
           int col_nb = tsid1*symbol_table.endo_nbr()+tsid2;
           int col_nb_sym = tsid2*symbol_table.endo_nbr()+tsid1;
 
-          if (output_type == oJuliaStaticModel)
+          if (output_type == ExprNodeOutputType::juliaStaticModel)
             {
               for_sym << "g2[" << eq + 1 << "," << col_nb + 1 << "]";
               hessian_output << "  @inbounds " << for_sym.str() << " = ";
@@ -1440,7 +1440,7 @@ StaticModel::writeStaticModel(const string &basename,
 
           // Treating symetric elements
           if (symb_id1 != symb_id2)
-            if (output_type == oJuliaStaticModel)
+            if (output_type == ExprNodeOutputType::juliaStaticModel)
               hessian_output << "  @inbounds g2[" << eq + 1 << "," << col_nb_sym + 1 << "] = "
                              << for_sym.str() << endl;
             else
@@ -1484,7 +1484,7 @@ StaticModel::writeStaticModel(const string &basename,
           // Reference column number for the g3 matrix
           int ref_col = id1 * hessianColsNbr + id2 * JacobianColsNbr + id3;
 
-          if (output_type == oJuliaStaticModel)
+          if (output_type == ExprNodeOutputType::juliaStaticModel)
             {
               for_sym << "g3[" << eq + 1 << "," << ref_col + 1 << "]";
               third_derivatives_output << "  @inbounds " << for_sym.str() << " = ";
@@ -1517,7 +1517,7 @@ StaticModel::writeStaticModel(const string &basename,
           int k2 = 1; // Keeps the offset of the permutation relative to k
           for (int col : cols)
             if (col != ref_col)
-              if (output_type == oJuliaStaticModel)
+              if (output_type == ExprNodeOutputType::juliaStaticModel)
                 third_derivatives_output << "  @inbounds g3[" << eq + 1 << "," << col + 1 << "] = "
                                          << for_sym.str() << endl;
               else
@@ -1539,7 +1539,7 @@ StaticModel::writeStaticModel(const string &basename,
         }
     }
 
-  if (output_type == oMatlabStaticModel)
+  if (output_type == ExprNodeOutputType::matlabStaticModel)
     {
       // Check that we don't have more than 32 nested parenthesis because Matlab does not suppor this. See Issue #1201
       map<string, string> tmp_paren_vars;
@@ -1619,7 +1619,7 @@ StaticModel::writeStaticModel(const string &basename,
 
       writeStaticMatlabCompatLayer(basename);
     }
-  else if (output_type == oCStaticModel)
+  else if (output_type == ExprNodeOutputType::CStaticModel)
     {
       StaticOutput << "void Static(double *y, double *x, int nb_row_x, double *params, double *residual, double *g1, double *v2)" << endl
                    << "{" << endl
@@ -2351,7 +2351,7 @@ StaticModel::collect_block_first_order_derivatives()
 void
 StaticModel::writeLatexFile(const string &basename, bool write_equation_tags) const
 {
-  writeLatexModelFile(basename + "_static", oLatexStaticModel, write_equation_tags);
+  writeLatexModelFile(basename + "_static", ExprNodeOutputType::latexStaticModel, write_equation_tags);
 }
 
 void
@@ -2368,7 +2368,7 @@ void
 StaticModel::writeSetAuxiliaryVariables(const string &basename, const bool julia) const
 {
   ostringstream output_func_body;
-  writeAuxVarRecursiveDefinitions(output_func_body, oMatlabStaticModel);
+  writeAuxVarRecursiveDefinitions(output_func_body, ExprNodeOutputType::matlabStaticModel);
 
   if (output_func_body.str().empty())
     return;
@@ -2402,7 +2402,7 @@ StaticModel::writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputType
   deriv_node_temp_terms_t tef_terms;
   for (auto aux_equation : aux_equations)
     if (dynamic_cast<ExprNode *>(aux_equation)->containsExternalFunction())
-      dynamic_cast<ExprNode *>(aux_equation)->writeExternalFunctionOutput(output, oMatlabStaticModel, {}, {}, tef_terms);
+      dynamic_cast<ExprNode *>(aux_equation)->writeExternalFunctionOutput(output, ExprNodeOutputType::matlabStaticModel, {}, {}, tef_terms);
   for (auto aux_equation : aux_equations)
     {
       dynamic_cast<ExprNode *>(aux_equation->substituteStaticAuxiliaryDefinition())->writeOutput(output, output_type);
@@ -2418,12 +2418,12 @@ StaticModel::writeLatexAuxVarRecursiveDefinitions(ostream &output) const
     temporary_terms_idxs_t temporary_terms_idxs;
   for (auto aux_equation : aux_equations)
     if (dynamic_cast<ExprNode *>(aux_equation)->containsExternalFunction())
-      dynamic_cast<ExprNode *>(aux_equation)->writeExternalFunctionOutput(output, oLatexStaticModel,
+      dynamic_cast<ExprNode *>(aux_equation)->writeExternalFunctionOutput(output, ExprNodeOutputType::latexStaticModel,
                                                                               temporary_terms, temporary_terms_idxs, tef_terms);
   for (auto aux_equation : aux_equations)
     {
       output << "\\begin{dmath}" << endl;
-      dynamic_cast<ExprNode *>(aux_equation->substituteStaticAuxiliaryDefinition())->writeOutput(output, oLatexStaticModel);
+      dynamic_cast<ExprNode *>(aux_equation->substituteStaticAuxiliaryDefinition())->writeOutput(output, ExprNodeOutputType::latexStaticModel);
       output << endl << "\\end{dmath}" << endl;
     }
 }
@@ -2470,7 +2470,7 @@ StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) cons
       && !hessian_params_derivatives.size())
     return;
 
-  ExprNodeOutputType output_type = (julia ? oJuliaStaticModel : oMatlabStaticModel);
+  ExprNodeOutputType output_type = (julia ? ExprNodeOutputType::juliaStaticModel : ExprNodeOutputType::matlabStaticModel);
 
   ostringstream model_local_vars_output;   // Used for storing model local vars
   ostringstream model_output;              // Used for storing model
diff --git a/src/SymbolTable.cc b/src/SymbolTable.cc
index 722edfdb..b08c6117 100644
--- a/src/SymbolTable.cc
+++ b/src/SymbolTable.cc
@@ -371,7 +371,7 @@ SymbolTable::writeOutput(ostream &output) const noexcept(false)
             output << "M_.aux_vars(" << i+1 << ").orig_expr = '\\mathbb{E}_{t"
                    << (aux_vars[i].get_information_set() < 0 ? "" : "+")
                    << aux_vars[i].get_information_set() << "}(";
-            aux_vars[i].get_expr_node()->writeOutput(output, oLatexDynamicModel);
+            aux_vars[i].get_expr_node()->writeOutput(output, ExprNodeOutputType::latexDynamicModel);
             output << ")';" << endl;
             break;
           case AuxVarType::diff:
@@ -1139,7 +1139,7 @@ SymbolTable::writeJuliaOutput(ostream &output) const noexcept(false)
               output << "typemin(Int), typemin(Int), typemin(Int), \"\\mathbb{E}_{t"
                      << (aux_var.get_information_set() < 0 ? "" : "+")
                      << aux_var.get_information_set() << "}(";
-              aux_var.get_expr_node()->writeOutput(output, oLatexDynamicModel);
+              aux_var.get_expr_node()->writeOutput(output, ExprNodeOutputType::latexDynamicModel);
               output << ")\"";
               break;
             default:
-- 
GitLab