From 8fd1505ca2fdcbdc0281b4d702d10c9fa6a3d0d4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Mon, 16 May 2022 14:52:47 +0200
Subject: [PATCH] =?UTF-8?q?C++17=20modernization:=20use=20std::optional=20?=
 =?UTF-8?q?for=20=E2=80=9Cperiods=E2=80=9D=20option=20of=20=E2=80=9Cplot?=
 =?UTF-8?q?=5Fconditional=5Fforecast=E2=80=9D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Incidentally, in the JSON output, no longer assign a value to the “periods”
field if not passed by the user (previously the value -1 was output in the JSON
file).
---
 src/ComputingTasks.cc | 15 ++++++++-------
 src/ComputingTasks.hh |  6 +++---
 src/DynareBison.yy    |  2 +-
 src/ParsingDriver.cc  |  8 +++++---
 src/ParsingDriver.hh  |  2 +-
 5 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc
index 09a05a7c..0d578450 100644
--- a/src/ComputingTasks.cc
+++ b/src/ComputingTasks.cc
@@ -3266,10 +3266,10 @@ ConditionalForecastStatement::writeJsonOutput(ostream &output) const
   output << "}";
 }
 
-PlotConditionalForecastStatement::PlotConditionalForecastStatement(int periods_arg,
+PlotConditionalForecastStatement::PlotConditionalForecastStatement(optional<int> periods_arg,
                                                                    SymbolList symbol_list_arg,
                                                                    const SymbolTable &symbol_table_arg) :
-  periods{periods_arg},
+  periods{move(periods_arg)},
   symbol_list{move(symbol_list_arg)},
   symbol_table{symbol_table_arg}
 {
@@ -3294,17 +3294,18 @@ void
 PlotConditionalForecastStatement::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const
 {
   symbol_list.writeOutput("var_list_", output);
-  if (periods == -1)
-    output << "plot_icforecast(var_list_,[],options_,oo_);" << endl;
+  if (periods)
+    output << "plot_icforecast(var_list_, " << *periods << ",options_,oo_);" << endl;
   else
-    output << "plot_icforecast(var_list_, " << periods << ",options_,oo_);" << endl;
+    output << "plot_icforecast(var_list_,[],options_,oo_);" << endl;
 }
 
 void
 PlotConditionalForecastStatement::writeJsonOutput(ostream &output) const
 {
-  output << R"({"statementName": "plot_conditional_forecast", )"
-         << R"("periods": )" << periods;
+  output << R"({"statementName": "plot_conditional_forecast")";
+  if (periods)
+    output << R"(, "periods": )" << *periods;
   if (!symbol_list.empty())
     {
       output << ", ";
diff --git a/src/ComputingTasks.hh b/src/ComputingTasks.hh
index e7502f65..d378ca07 100644
--- a/src/ComputingTasks.hh
+++ b/src/ComputingTasks.hh
@@ -21,6 +21,7 @@
 #define _COMPUTINGTASKS_HH
 
 #include <ostream>
+#include <optional>
 
 #include "SymbolList.hh"
 #include "SymbolTable.hh"
@@ -848,12 +849,11 @@ public:
 class PlotConditionalForecastStatement : public Statement
 {
 private:
-  //! A value of -1 indicates that the user didn't specify a value
-  const int periods;
+  const optional<int> periods; // The user is allowed not to declare periods
   const SymbolList symbol_list;
   const SymbolTable &symbol_table;
 public:
-  PlotConditionalForecastStatement(int periods_arg, SymbolList symbol_list_arg,
+  PlotConditionalForecastStatement(optional<int> periods_arg, SymbolList symbol_list_arg,
                                    const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
diff --git a/src/DynareBison.yy b/src/DynareBison.yy
index 42c53d92..3ebfb687 100644
--- a/src/DynareBison.yy
+++ b/src/DynareBison.yy
@@ -3213,7 +3213,7 @@ conditional_forecast_option : o_periods
                             ;
 
 plot_conditional_forecast : PLOT_CONDITIONAL_FORECAST symbol_list ';'
-                            { driver.plot_conditional_forecast("", $2); }
+                            { driver.plot_conditional_forecast(nullopt, $2); }
                           | PLOT_CONDITIONAL_FORECAST '(' PERIODS EQUAL INT_NUMBER ')' symbol_list ';'
                             { driver.plot_conditional_forecast($5, $7); }
                           ;
diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc
index f43dedc3..4a107614 100644
--- a/src/ParsingDriver.cc
+++ b/src/ParsingDriver.cc
@@ -2498,10 +2498,12 @@ ParsingDriver::conditional_forecast()
 }
 
 void
-ParsingDriver::plot_conditional_forecast(const string &periods, vector<string> symbol_list)
+ParsingDriver::plot_conditional_forecast(const optional<string> &periods, vector<string> symbol_list)
 {
-  int nperiods = periods.empty() ? -1 : stoi(periods);
-  mod_file->addStatement(make_unique<PlotConditionalForecastStatement>(nperiods, move(symbol_list),
+  optional<int> iperiods;
+  if (periods)
+    iperiods = stoi(*periods);
+  mod_file->addStatement(make_unique<PlotConditionalForecastStatement>(move(iperiods), move(symbol_list),
                                                                        mod_file->symbol_table));
 }
 
diff --git a/src/ParsingDriver.hh b/src/ParsingDriver.hh
index 82923136..b9a2949e 100644
--- a/src/ParsingDriver.hh
+++ b/src/ParsingDriver.hh
@@ -726,7 +726,7 @@ public:
   //! Conditional forecast paths block
   void conditional_forecast_paths();
   //! Plot conditional forecast statement
-  void plot_conditional_forecast(const string &periods, vector<string> symbol_list);
+  void plot_conditional_forecast(const optional<string> &periods, vector<string> symbol_list);
   //! Smoother on calibrated models
   void calib_smoother(vector<string> symbol_list);
   //! Extended path
-- 
GitLab