From 2c6fa34a1fe56697372c276fa55bd089d79f5196 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Wed, 11 Sep 2019 15:59:23 +0200
Subject: [PATCH] C++17: use structured bindings instead of std::tie whenever
 possible

---
 src/ComputingTasks.cc          |  5 +--
 src/DynamicModel.cc            | 56 +++++++++++-----------------------
 src/ExprNode.cc                | 11 ++-----
 src/ModFile.cc                 |  4 +--
 src/ModelTree.cc               |  3 +-
 src/NumericalInitialization.cc | 10 ++----
 src/StaticModel.cc             | 44 ++++++++------------------
 src/SubModel.cc                | 12 +++-----
 8 files changed, 42 insertions(+), 103 deletions(-)

diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc
index 6238649c..5653b493 100644
--- a/src/ComputingTasks.cc
+++ b/src/ComputingTasks.cc
@@ -333,12 +333,9 @@ PacModelStatement::writeOutput(ostream &output, const string &basename, bool min
              << "M_.pac." << name << ".growth_type = repmat({''}, " <<  nlc << ", 1);" << endl
              << "M_.pac." << name << ".growth_part_str = repmat({''}, " <<  nlc << ", 1);" << endl;
       int i = 0;
-      for (auto & it : growth_info)
+      for (auto [growth_symb_id, growth_lag, param_id, constant] : growth_info)
         {
           i++;
-          int growth_symb_id, growth_lag, param_id = -1;
-          double constant = 0;
-          tie(growth_symb_id, growth_lag, param_id, constant) = it;
           string growth_type;
           switch (symbol_table.getType(growth_symb_id))
             {
diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index 902bf482..c84750bf 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -2502,8 +2502,7 @@ DynamicModel::writeDynamicModel(const string &basename, ostream &DynamicOutput,
 
       for (const auto & first_derivative : derivatives[1])
         {
-          int eq, var;
-          tie(eq, var) = vectorToTuple<2>(first_derivative.first);
+          auto [eq, var] = vectorToTuple<2>(first_derivative.first);
           expr_t d1 = first_derivative.second;
 
           jacobianHelper(d_output[1], eq, getDynJacobianCol(var), output_type);
@@ -3614,12 +3613,7 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de
 
   for (auto & pit : pac_equation_info)
     {
-      pair<int, int> lhs_pac_var;
-      int optim_share_index;
-      set<pair<int, pair<int, int>>> ar_params_and_vars;
-      pair<int, vector<tuple<int, bool, int>>> ec_params_and_vars;
-      vector<tuple<int, int, int, double>> non_optim_vars_params_and_constants, additive_vars_params_and_constants, optim_additive_vars_params_and_constants;
-      tie(lhs_pac_var, optim_share_index, ar_params_and_vars, ec_params_and_vars, non_optim_vars_params_and_constants, additive_vars_params_and_constants, optim_additive_vars_params_and_constants) = pit.second;
+      auto [lhs_pac_var, optim_share_index, ar_params_and_vars, ec_params_and_vars, non_optim_vars_params_and_constants, additive_vars_params_and_constants, optim_additive_vars_params_and_constants] = pit.second;
       string substruct = pit.first.first + ".equations." + pit.first.second + ".";
 
       output << modstruct << "pac." << substruct << "lhs_var = "
@@ -4296,8 +4290,7 @@ DynamicModel::fillTrendComponentmodelTableAREC(const ExprNode::subst_table_t &di
 {
   auto ARr = fillAutoregressiveMatrix(false);
   trend_component_model_table.setAR(ARr);
-  map<string, map<tuple<int, int, int>, expr_t>> A0r, A0starr;
-  tie(A0r, A0starr) = fillErrorComponentMatrix(diff_subst_table);
+  auto [A0r, A0starr] = fillErrorComponentMatrix(diff_subst_table);
   trend_component_model_table.setA0(A0r, A0starr);
 }
 
@@ -4443,8 +4436,6 @@ DynamicModel::walkPacParameters(const string &name)
 
       if (equation->containsPacExpectation())
         {
-          int optim_share_index;
-          expr_t optim_part, non_optim_part, additive_part;
           set<pair<int, int>> lhss;
           equation->arg1->collectDynamicVariables(SymbolType::endogenous, lhss);
           lhs = *(lhss.begin());
@@ -4465,7 +4456,7 @@ DynamicModel::walkPacParameters(const string &name)
               cerr << "Pac equation in incorrect format" << endl;
               exit(EXIT_FAILURE);
             }
-          tie(optim_share_index, optim_part, non_optim_part, additive_part) =
+          auto [optim_share_index, optim_part, non_optim_part, additive_part] =
             arg2->getPacOptimizingShareAndExprNodes(lhs_symb_id, lhs_orig_symb_id);
 
           if (optim_part == nullptr)
@@ -5149,8 +5140,7 @@ DynamicModel::computeChainRuleJacobian(blocks_derivatives_t &blocks_endo_derivat
       for (const auto &it : Derivatives)
         {
           int Deriv_type = it.second;
-          int lag, eq, var, eqr, varr;
-          tie(lag, eq, var, eqr, varr) = it.first;
+          auto [lag, eq, var, eqr, varr] = it.first;
           if (Deriv_type == 0)
             first_chain_rule_derivatives[{ eqr, varr, lag }] = derivatives[1][{ eqr, getDerivID(symbol_table.getID(SymbolType::endogenous, varr), lag) }];
           else if (Deriv_type == 1)
@@ -5833,8 +5823,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con
 
   for (const auto & residuals_params_derivative : params_derivatives.find({ 0, 1 })->second)
     {
-      int eq, param;
-      tie(eq, param) = vectorToTuple<2>(residuals_params_derivative.first);
+      auto [eq, param] = vectorToTuple<2>(residuals_params_derivative.first);
       expr_t d1 = residuals_params_derivative.second;
 
       int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1;
@@ -5847,8 +5836,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con
 
   for (const auto & jacobian_params_derivative : params_derivatives.find({ 1, 1 })->second)
     {
-      int eq, var, param;
-      tie(eq, var, param) = vectorToTuple<3>(jacobian_params_derivative.first);
+      auto [eq, var, param] = vectorToTuple<3>(jacobian_params_derivative.first);
       expr_t d2 = jacobian_params_derivative.second;
 
       int var_col = getDynJacobianCol(var) + 1;
@@ -5863,8 +5851,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con
   int i = 1;
   for (const auto &it : params_derivatives.find({ 0, 2 })->second)
     {
-      int eq, param1, param2;
-      tie(eq, param1, param2) = vectorToTuple<3>(it.first);
+      auto [eq, param1, param2] = vectorToTuple<3>(it.first);
       expr_t d2 = it.second;
 
       int param1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param1)) + 1;
@@ -5903,8 +5890,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con
   i = 1;
   for (const auto &it : params_derivatives.find({ 1, 2 })->second)
     {
-      int eq, var, param1, param2;
-      tie(eq, var, param1, param2) = vectorToTuple<4>(it.first);
+      auto [eq, var, param1, param2] = vectorToTuple<4>(it.first);
       expr_t d2 = it.second;
 
       int var_col = getDynJacobianCol(var) + 1;
@@ -5948,8 +5934,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con
   i = 1;
   for (const auto &it : params_derivatives.find({ 2, 1 })->second)
     {
-      int eq, var1, var2, param;
-      tie(eq, var1, var2, param) = vectorToTuple<4>(it.first);
+      auto [eq, var1, var2, param] = vectorToTuple<4>(it.first);
       expr_t d2 = it.second;
 
       int var1_col = getDynJacobianCol(var1) + 1;
@@ -5993,8 +5978,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con
   i = 1;
   for (const auto &it : params_derivatives.find({ 3, 1 })->second)
     {
-      int eq, var1, var2, var3, param;
-      tie(eq, var1, var2, var3, param) = vectorToTuple<5>(it.first);
+      auto [eq, var1, var2, var3, param] = vectorToTuple<5>(it.first);
       expr_t d2 = it.second;
 
       int var1_col = getDynJacobianCol(var1) + 1;
@@ -7015,8 +6999,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       if (it != rp.begin())
         rp_output << ", ";
 
-      int eq, param;
-      tie(eq, param) = vectorToTuple<2>(it->first);
+      auto [eq, param] = vectorToTuple<2>(it->first);
       expr_t d1 = it->second;
 
       int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1;
@@ -7048,8 +7031,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       if (it != gp.begin())
         gp_output << ", ";
 
-      int eq, var, param;
-      tie(eq, var, param) = vectorToTuple<3>(it->first);
+      auto [eq, var, param] = vectorToTuple<3>(it->first);
       expr_t d2 = it->second;
 
       int var_col = getDynJacobianCol(var) + 1;
@@ -7085,8 +7067,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       if (it != rpp.begin())
         rpp_output << ", ";
 
-      int eq, param1, param2;
-      tie(eq, param1, param2) = vectorToTuple<3>(it->first);
+      auto [eq, param1, param2] = vectorToTuple<3>(it->first);
       expr_t d2 = it->second;
 
       int param1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param1)) + 1;
@@ -7121,8 +7102,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       if (it != gpp.begin())
         gpp_output << ", ";
 
-      int eq, var, param1, param2;
-      tie(eq, var, param1, param2) = vectorToTuple<4>(it->first);
+      auto [eq, var, param1, param2] = vectorToTuple<4>(it->first);
       expr_t d2 = it->second;
 
       int var_col = getDynJacobianCol(var) + 1;
@@ -7162,8 +7142,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       if (it != hp.begin())
         hp_output << ", ";
 
-      int eq, var1, var2, param;
-      tie(eq, var1, var2, param) = vectorToTuple<4>(it->first);
+      auto [eq, var1, var2, param] = vectorToTuple<4>(it->first);
       expr_t d2 = it->second;
 
       int var1_col = getDynJacobianCol(var1) + 1;
@@ -7205,8 +7184,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       if (it != g3p.begin())
         g3p_output << ", ";
 
-      int eq, var1, var2, var3, param;
-      tie(eq, var1, var2, var3, param) = vectorToTuple<5>(it->first);
+      auto [eq, var1, var2, var3, param] = vectorToTuple<5>(it->first);
       expr_t d2 = it->second;
 
       int var1_col = getDynJacobianCol(var1) + 1;
diff --git a/src/ExprNode.cc b/src/ExprNode.cc
index 7ce12364..b35a109e 100644
--- a/src/ExprNode.cc
+++ b/src/ExprNode.cc
@@ -356,11 +356,8 @@ ExprNode::fillErrorCorrectionRow(int eqn,
         continue;
 
       // Now fill the matrices
-      for (const auto &t : m.second)
+      for (auto [var_id, lag, param_id, constant] : m.second)
         {
-          int var_id, lag, param_id;
-          double constant;
-          tie(var_id, lag, param_id, constant) = t;
           /*
           if (lag != -1)
             {
@@ -5746,11 +5743,9 @@ BinaryOpNode::getPacAREC(int lhs_symb_id, int lhs_orig_symb_id,
       for (auto &t : m.second)
         get<3>(t) *= it.second; // Update sign of constants
 
-      int vid, lag, pidtmp, pid = get<0>(m);
-      double constant;
-      for (auto &t : m.second)
+      int pid = get<0>(m);
+      for (auto [vid, lag, pidtmp, constant] : m.second)
         {
-          tie(vid, lag, pidtmp, constant) = t;
           if (pid == -1)
             pid = pidtmp;
           else
diff --git a/src/ModFile.cc b/src/ModFile.cc
index f73291ce..e11d5e15 100644
--- a/src/ModFile.cc
+++ b/src/ModFile.cc
@@ -446,9 +446,7 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const
     tie(unary_ops_nodes, unary_ops_subst_table) = dynamic_model.substituteUnaryOps(diff_static_model, eqtags);
 
   // Create auxiliary variable and equations for Diff operators
-  diff_table_t diff_table;
-  ExprNode::subst_table_t diff_subst_table;
-  tie(diff_table, diff_subst_table) = dynamic_model.substituteDiff(diff_static_model, pac_growth);
+  auto [diff_table, diff_subst_table] = dynamic_model.substituteDiff(diff_static_model, pac_growth);
 
   // Fill Trend Component Model Table
   dynamic_model.fillTrendComponentModelTable();
diff --git a/src/ModelTree.cc b/src/ModelTree.cc
index 33e5133b..28e8df72 100644
--- a/src/ModelTree.cc
+++ b/src/ModelTree.cc
@@ -735,8 +735,7 @@ ModelTree::getVariableLeadLagByBlock(const dynamic_jacob_map_t &dynamic_jacobian
     }
   for (const auto & it : dynamic_jacobian)
     {
-      int lag, j_1, i_1;
-      tie(lag, j_1, i_1) = it.first;
+      auto [lag, j_1, i_1] = it.first;
       if (variable_blck[i_1] == equation_blck[j_1])
         {
           if (lag > variable_lead_lag[i_1].second)
diff --git a/src/NumericalInitialization.cc b/src/NumericalInitialization.cc
index f9b496a6..02cd90ac 100644
--- a/src/NumericalInitialization.cc
+++ b/src/NumericalInitialization.cc
@@ -466,12 +466,8 @@ HomotopyStatement::writeOutput(ostream &output, const string &basename, bool min
          << "%" << endl
          << "options_.homotopy_values = [];" << endl;
 
-  for (const auto & homotopy_value : homotopy_values)
+  for (auto [symb_id, expression1, expression2] : homotopy_values)
     {
-      int symb_id;
-      expr_t expression1, expression2;
-      tie(symb_id, expression1, expression2) = homotopy_value;
-
       const SymbolType type = symbol_table.getType(symb_id);
       const int tsid = symbol_table.getTypeSpecificID(symb_id) + 1;
 
@@ -497,9 +493,7 @@ HomotopyStatement::writeJsonOutput(ostream &output) const
       if (it != homotopy_values.begin())
         output << ", ";
 
-      int symb_id;
-      expr_t expression1, expression2;
-      tie(symb_id, expression1, expression2) = *it;
+      auto [symb_id, expression1, expression2] = *it;
 
       output << R"({"name": ")" << symbol_table.getName(symb_id) << R"(")"
              << R"(, "initial_value": ")";
diff --git a/src/StaticModel.cc b/src/StaticModel.cc
index db72b53e..2c82876f 100644
--- a/src/StaticModel.cc
+++ b/src/StaticModel.cc
@@ -177,13 +177,7 @@ StaticModel::StaticModel(const DynamicModel &m) :
           // If yes, replace it by an equation marked [static]
           if (is_dynamic_only)
             {
-              auto tuple = m.getStaticOnlyEquationsInfo();
-              auto static_only_equations = get<0>(tuple);
-              auto static_only_equations_lineno = get<1>(tuple);
-              auto static_only_equations_equation_tags = get<2>(tuple);
-
-              // With C++17, rather use structured bindings, as:
-              //auto [ static_only_equations, static_only_equations_lineno, static_only_equations_equation_tags ] = m.getStaticOnlyEquationsInfo();
+              auto [static_only_equations, static_only_equations_lineno, static_only_equations_equation_tags] = m.getStaticOnlyEquationsInfo();
 
               addEquation(static_only_equations[static_only_index]->toStatic(*this), static_only_equations_lineno[static_only_index], static_only_equations_equation_tags[static_only_index]);
               static_only_index++;
@@ -1492,8 +1486,7 @@ StaticModel::writeStaticModel(const string &basename,
 
       for (const auto & first_derivative : derivatives[1])
         {
-          int eq, var;
-          tie(eq, var) = vectorToTuple<2>(first_derivative.first);
+          auto [eq, var] = vectorToTuple<2>(first_derivative.first);
           expr_t d1 = first_derivative.second;
 
           jacobianHelper(d_output[1], eq, getJacobCol(var), output_type);
@@ -2293,8 +2286,7 @@ StaticModel::computeChainRuleJacobian(blocks_derivatives_t &blocks_derivatives)
           for (const auto &it : Derivatives)
             {
               int Deriv_type = it.second;
-              int lag, eq, var, eqr, varr;
-              tie(lag, eq, var, eqr, varr) = it.first;
+              auto [lag, eq, var, eqr, varr] = it.first;
               if (Deriv_type == 0)
                 first_chain_rule_derivatives[{ eqr, varr, lag }] = derivatives[1][{ eqr, getDerivID(symbol_table.getID(SymbolType::endogenous, varr), lag) }];
               else if (Deriv_type == 1)
@@ -2513,8 +2505,7 @@ StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) cons
 
   for (const auto & residuals_params_derivative : params_derivatives.find({ 0, 1 })->second)
     {
-      int eq, param;
-      tie(eq, param) = vectorToTuple<2>(residuals_params_derivative.first);
+      auto [eq, param] = vectorToTuple<2>(residuals_params_derivative.first);
       expr_t d1 = residuals_params_derivative.second;
 
       int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1;
@@ -2528,8 +2519,7 @@ StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) cons
 
   for (const auto & jacobian_params_derivative : params_derivatives.find({ 1, 1 })->second)
     {
-      int eq, var, param;
-      tie(eq, var, param) = vectorToTuple<3>(jacobian_params_derivative.first);
+      auto [eq, var, param] = vectorToTuple<3>(jacobian_params_derivative.first);
       expr_t d2 = jacobian_params_derivative.second;
 
       int var_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(var)) + 1;
@@ -2545,8 +2535,7 @@ StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) cons
   int i = 1;
   for (const auto &it : params_derivatives.find({ 0, 2 })->second)
     {
-      int eq, param1, param2;
-      tie(eq, param1, param2) = vectorToTuple<3>(it.first);
+      auto [eq, param1, param2] = vectorToTuple<3>(it.first);
       expr_t d2 = it.second;
 
       int param1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param1)) + 1;
@@ -2585,8 +2574,7 @@ StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) cons
   i = 1;
   for (const auto &it : params_derivatives.find({ 1, 2 })->second)
     {
-      int eq, var, param1, param2;
-      tie(eq, var, param1, param2) = vectorToTuple<4>(it.first);
+      auto [eq, var, param1, param2] = vectorToTuple<4>(it.first);
       expr_t d2 = it.second;
 
       int var_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(var)) + 1;
@@ -2630,8 +2618,7 @@ StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) cons
   i = 1;
   for (const auto &it : params_derivatives.find({ 2, 1 })->second)
     {
-      int eq, var1, var2, param;
-      tie(eq, var1, var2, param) = vectorToTuple<4>(it.first);
+      auto [eq, var1, var2, param] = vectorToTuple<4>(it.first);
       expr_t d2 = it.second;
 
       int var1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(var1)) + 1;
@@ -2891,8 +2878,7 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       if (it != rp.begin())
         jacobian_output << ", ";
 
-      int eq, param;
-      tie(eq, param) = vectorToTuple<2>(it->first);
+      auto [eq, param] = vectorToTuple<2>(it->first);
       expr_t d1 = it->second;
 
       int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1;
@@ -2924,8 +2910,7 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       if (it != gp.begin())
         hessian_output << ", ";
 
-      int eq, var, param;
-      tie(eq, var, param) = vectorToTuple<3>(it->first);
+      auto [eq, var, param] = vectorToTuple<3>(it->first);
       expr_t d2 = it->second;
 
       int var_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(var)) + 1;
@@ -2959,8 +2944,7 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       if (it != rpp.begin())
         hessian1_output << ", ";
 
-      int eq, param1, param2;
-      tie(eq, param1, param2) = vectorToTuple<3>(it->first);
+      auto [eq, param1, param2] = vectorToTuple<3>(it->first);
       expr_t d2 = it->second;
 
       int param1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param1)) + 1;
@@ -2996,8 +2980,7 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       if (it != gpp.begin())
         third_derivs_output << ", ";
 
-      int eq, var, param1, param2;
-      tie(eq, var, param1, param2) = vectorToTuple<4>(it->first);
+      auto [eq, var, param1, param2] = vectorToTuple<4>(it->first);
       expr_t d2 = it->second;
 
       int var_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(var)) + 1;
@@ -3035,8 +3018,7 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       if (it != hp.begin())
         third_derivs1_output << ", ";
 
-      int eq, var1, var2, param;
-      tie(eq, var1, var2, param) = vectorToTuple<4>(it->first);
+      auto [eq, var1, var2, param] = vectorToTuple<4>(it->first);
       expr_t d2 = it->second;
 
       int var1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(var1)) + 1;
diff --git a/src/SubModel.cc b/src/SubModel.cc
index a8e64d1b..b3c79ecb 100644
--- a/src/SubModel.cc
+++ b/src/SubModel.cc
@@ -352,8 +352,7 @@ TrendComponentModelTable::writeOutput(const string &basename, ostream &output) c
                 << "    AR = zeros(" << nontarget_lhs_vec.size() << ", " << nontarget_lhs_vec.size() << ", " << getMaxLag(name) << ");" << endl;
       for (const auto & it : AR.at(name))
         {
-          int eqn, lag, lhs_symb_id;
-          tie (eqn, lag, lhs_symb_id) = it.first;
+          auto [eqn, lag, lhs_symb_id] = it.first;
           int colidx = static_cast<int>(distance(nontarget_lhs_vec.begin(), find(nontarget_lhs_vec.begin(), nontarget_lhs_vec.end(), lhs_symb_id)));
           ar_ec_output << "    AR(" << eqn + 1 << ", " << colidx + 1 << ", " << lag << ") = ";
           it.second->writeOutput(ar_ec_output, ExprNodeOutputType::matlabDynamicModel);
@@ -369,8 +368,7 @@ TrendComponentModelTable::writeOutput(const string &basename, ostream &output) c
                    << "    A0 = zeros(" << nontarget_lhs_vec.size() << ", " << nontarget_lhs_vec.size() << ", " << a0_lag << ");" << endl;
       for (const auto & it : A0.at(name))
         {
-          int eqn, lag, colidx;
-          tie (eqn, lag, colidx) = it.first;
+          auto [eqn, lag, colidx] = it.first;
           ar_ec_output << "    A0(" << eqn + 1 << ", " << colidx + 1 << ", " << lag << ") = ";
           it.second->writeOutput(ar_ec_output, ExprNodeOutputType::matlabDynamicModel);
           ar_ec_output << ";" << endl;
@@ -385,8 +383,7 @@ TrendComponentModelTable::writeOutput(const string &basename, ostream &output) c
                    << "    A0star = zeros(" << nontarget_lhs_vec.size() << ", " << target_lhs_vec.size() << ", " << a0star_lag << ");" << endl;
       for (const auto & it : A0star.at(name))
         {
-          int eqn, lag, colidx;
-          tie (eqn, lag, colidx) = it.first;
+          auto [eqn, lag, colidx] = it.first;
           ar_ec_output << "    A0star(" << eqn + 1 << ", " << colidx + 1 << ", " << lag << ") = ";
           it.second->writeOutput(ar_ec_output, ExprNodeOutputType::matlabDynamicModel);
           ar_ec_output << ";" << endl;
@@ -525,8 +522,7 @@ VarModelTable::writeOutput(const string &basename, ostream &output) const
                 << "    ar = zeros(" << lhs.size() << ", " << lhs.size() << ", " << getMaxLag(name) << ");" << endl;
       for (const auto & it : AR.at(name))
         {
-          int eqn, lag, lhs_symb_id;
-          tie (eqn, lag, lhs_symb_id) = it.first;
+          auto [eqn, lag, lhs_symb_id] = it.first;
           int colidx = static_cast<int>(distance(lhs.begin(), find(lhs.begin(), lhs.end(), lhs_symb_id)));
           ar_output << "    ar(" << eqn + 1 << ", " << colidx + 1 << ", " << lag << ") = ";
           it.second->writeOutput(ar_output, ExprNodeOutputType::matlabDynamicModel);
-- 
GitLab