/* * Copyright © 2006-2022 Dynare Team * * This file is part of Dynare. * * Dynare is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Dynare is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Dynare. If not, see . */ #include "Statement.hh" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wold-style-cast" #include #pragma GCC diagnostic pop #include void Statement::checkPass([[maybe_unused]] ModFileStructure &mod_file_struct, [[maybe_unused]] WarningConsolidation &warnings) { } void Statement::computingPass([[maybe_unused]] const ModFileStructure &mod_file_struct) { } NativeStatement::NativeStatement(string native_statement_arg) : native_statement{move(native_statement_arg)} { } void NativeStatement::writeOutput(ostream &output, [[maybe_unused]] const string &basename, [[maybe_unused]] bool minimal_workspace) const { using namespace boost::xpressive; string date_regex = R"((-?\d+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[SsHh][1-2])))"; sregex regex_lookbehind = sregex::compile(R"((? 1) { output << "["; for (int viit : vals) output << viit << ";"; output << "];" << endl; } else output << vals.front() << ";" << endl; } for (const auto & [name, vals] : vector_str_options) { output << option_group << "." << name << " = "; if (vals.size() > 1) { output << "{"; for (const auto &viit : vals) output << "'" << viit << "';"; output << "};" << endl; } else output << vals.front() << ";" << endl; } /* vector_cellstr_options should ideally be merged into vector_str_options only difference is treatment of vals.size==1, where vector_str_options does not add quotes and curly brackets, i.e. allows for type conversion of '2' into the number 2 */ for (const auto & [name, vals] : vector_cellstr_options) { output << option_group << "." << name << " = {"; for (const auto &viit : vals) output << "'" << viit << "';"; output << "};" << endl; } /* For historical reason, those vectors are output as row vectors (contrary to vectors of integers which are output as column vectors) */ for (const auto &[name, vals] : vector_value_options) { output << option_group << "." << name << " = ["; for (const auto &viit : vals) output << viit << ","; output << "];" << endl; } // Same remark as for vectors of (floating point) values for (const auto &[name, vec_vals] : vector_of_vector_value_options) { output << option_group << "." << name << " = {"; for (const auto &vals : vec_vals) { output << "["; for (const auto &viit : vals) output << viit << ","; output << "], "; } output << "};" << endl; } } void OptionsList::writeJsonOutput(ostream &output) const { if (getNumberOfOptions() == 0) return; bool opt_written{false}; output << R"("options": {)"; for (const auto &[name, val] : num_options) { if (opt_written) output << ", "; output << R"(")" << name << R"(": )" << val; opt_written = true; } for (const auto &[name, vals] : paired_num_options) { if (opt_written) output << ", "; output << R"(")" << name << R"(": [)" << vals.first << ", " << vals.second << "]"; opt_written = true; } for (const auto &[name, val] : string_options) { if (opt_written) output << ", "; output << R"(")" << name << R"(": ")" << val << R"(")"; opt_written = true; } for (const auto &[name, val] : date_options) { if (opt_written) output << ", "; output << R"(")" << name << R"(": ")" << val << R"(")"; opt_written = true; } for (const auto &[name, vals] : symbol_list_options) { if (opt_written) output << ", "; output << R"(")" << name << R"(": {)"; vals.writeJsonOutput(output); output << "}"; opt_written = true; } for (const auto &[name, vals] : vector_int_options) { if (opt_written) output << ", "; output << R"(")" << name << R"(": [)"; for (bool printed_something{false}; int val : vals) { if (exchange(printed_something, true)) output << ", "; output << val; } output << "]"; opt_written = true; } for (const auto &[name, vals] : vector_str_options) { if (opt_written) output << ", "; output << R"(")" << name << R"(": [)"; for (bool printed_something{false}; const auto &val : vals) { if (exchange(printed_something, true)) output << ", "; output << R"(")" << val << R"(")"; } output << "]"; opt_written = true; } for (const auto &[name, vals] : vector_cellstr_options) { if (opt_written) output << ", "; output << R"(")" << name << R"(": [)"; for (bool printed_something{false}; const auto &val : vals) { if (exchange(printed_something, true)) output << ", "; output << R"(")" << val << R"(")"; } output << "]"; opt_written = true; } for (const auto &[name, vals] : vector_value_options) { if (opt_written) output << ", "; output << R"(")" << name << R"(": [)"; for (bool printed_something{false}; const auto &val : vals) { if (exchange(printed_something, true)) output << ", "; output << val; } output << "]"; opt_written = true; } for (const auto &[name, vec_vals] : vector_of_vector_value_options) { if (opt_written) output << ", "; output << R"(")" << name << R"(": [)"; for (bool printed_something{false}; const auto &vals : vec_vals) { if (exchange(printed_something, true)) output << ", "; output << "["; for (bool printed_something2{false}; const auto &val : vals) { if (exchange(printed_something2, true)) output << ", "; output << val; } output << "]"; } output << "]"; opt_written = true; } output << "}"; } void OptionsList::clear() { num_options.clear(); paired_num_options.clear(); string_options.clear(); date_options.clear(); symbol_list_options.clear(); vector_int_options.clear(); vector_str_options.clear(); vector_cellstr_options.clear(); vector_value_options.clear(); vector_of_vector_value_options.clear(); } int OptionsList::getNumberOfOptions() const { return num_options.size() + paired_num_options.size() + string_options.size() + date_options.size() + symbol_list_options.size() + vector_int_options.size() + vector_str_options.size() + vector_cellstr_options.size() + vector_value_options.size() + vector_of_vector_value_options.size(); }