diff --git a/daisi/src/cpps/common/cpps_manager.cpp b/daisi/src/cpps/common/cpps_manager.cpp index 6744bd06..fe5cb7b5 100644 --- a/daisi/src/cpps/common/cpps_manager.cpp +++ b/daisi/src/cpps/common/cpps_manager.cpp @@ -76,8 +76,6 @@ CppsManager::CppsManager(const std::string &scenario_config_file) : Manager(scenario_config_file), scenario_(scenario_config_file) { Manager::initLogger(); - scenario_.parse(); - amr_descriptions_ = scenario_.getAmrDescriptions(); material_flow_descriptions_ = scenario_.getMaterialFlowDescriptions(); diff --git a/daisi/src/cpps/common/scenariofile/cpps_scenariofile.h b/daisi/src/cpps/common/scenariofile/cpps_scenariofile.h index 9bef1242..eb906820 100644 --- a/daisi/src/cpps/common/scenariofile/cpps_scenariofile.h +++ b/daisi/src/cpps/common/scenariofile/cpps_scenariofile.h @@ -80,24 +80,7 @@ struct AlgorithmScenario { }; struct CppsScenariofile : public GeneralScenariofile { - explicit CppsScenariofile(const std::string &path_to_file) : GeneralScenariofile(path_to_file) {} - - uint16_t initial_number_of_amrs = 0; - uint16_t number_of_material_flows = 0; - uint16_t number_of_material_flow_agents = 0; - - bool do_material_flow_agents_leave_after_finish = false; - - AlgorithmScenario algorithm; - TopologyScenario topology; - - std::vector autonomous_mobile_robots; - std::vector material_flows; - std::vector scenario_sequence; - - void parse() override { - GeneralScenariofile::parse(); - + explicit CppsScenariofile(const std::string &path_to_file) : GeneralScenariofile(path_to_file) { SERIALIZE_VAR(initial_number_of_amrs); SERIALIZE_VAR(number_of_material_flows); SERIALIZE_VAR(number_of_material_flow_agents); @@ -115,6 +98,19 @@ struct CppsScenariofile : public GeneralScenariofile { calcNumbersOfRelativeAmrDistribution(); } + uint16_t initial_number_of_amrs = 0; + uint16_t number_of_material_flows = 0; + uint16_t number_of_material_flow_agents = 0; + + bool do_material_flow_agents_leave_after_finish = false; + + AlgorithmScenario algorithm; + TopologyScenario topology; + + std::vector autonomous_mobile_robots; + std::vector material_flows; + std::vector scenario_sequence; + std::unordered_map getAmrDescriptions() const; std::unordered_map getMaterialFlowDescriptions() const; diff --git a/daisi/src/manager/general_scenariofile.h b/daisi/src/manager/general_scenariofile.h index cbed26de..e035664f 100644 --- a/daisi/src/manager/general_scenariofile.h +++ b/daisi/src/manager/general_scenariofile.h @@ -29,9 +29,7 @@ struct GeneralScenariofile { : file_path_(std::move(path_to_file)) { loadFileContent(); node = YAML::Load(file_content_); - } - virtual void parse() { SERIALIZE_VAR(title); SERIALIZE_VAR(version); diff --git a/daisi/src/manager/scenariofile_component.h b/daisi/src/manager/scenariofile_component.h index 438f64d8..d6660e06 100644 --- a/daisi/src/manager/scenariofile_component.h +++ b/daisi/src/manager/scenariofile_component.h @@ -65,6 +65,26 @@ void serializeType(std::optional &t, const std::string &key, YAML::Node node) } } +/// @brief Deserialize data from node into variant with type T, if \p type matches +/// T.typeName() +/// @tparam T The type to parse if \p type matches \p req_type +/// @param node the YAML node to read data from +/// @param var variant to which the deserialized object is put +/// @param type the actual type +/// @return true if data was deserialzied +template +bool deserializeIf(YAML::Node node, std::variant &var, const std::string &type) { + if (type == T::typeName()) { + var.template emplace(); + + // Do parsing of the actual object + std::get(var).parse(node); + + return true; + } + return false; +} + } // namespace daisi #endif