#pragma once #include #include #include "yaml-cpp/yaml.h" enum class ConfigType : char { Label = 'L', Formula = 'F', Module = 'M', Constant = 'C' }; struct Configuration { static const std::string overwrite_identifier_; static const std::string configuration_identifier_; std::string module_ {}; std::string expression_{}; std::string identifier_{}; int index_{}; ConfigType type_ {ConfigType::Label}; bool overwrite_ {false}; Configuration() = default; Configuration(std::string expression , std::string identifier , ConfigType type , bool overwrite = false , std::string module = "" , int index = 0) : expression_(expression), identifier_(identifier), type_(type), overwrite_(overwrite), module_{module}, index_(index) {} ~Configuration() = default; Configuration(const Configuration&) = default; friend std::ostream& operator << (std::ostream& os, const Configuration& config) { os << "Configuration with Type: " << static_cast(config.type_) << std::endl; return os << "\tExpression=" << config.expression_ << std::endl; } }; struct Constant { private: public: std::string constant_; std::string type_; std::string value_; bool overwrite_{false}; std::string createExpression() const; friend std::ostream& operator <<(std::ostream &os, const Constant& constant); }; struct Label { private: public: std::string text_; std::string label_; bool overwrite_{false}; std::string createExpression() const; friend std::ostream& operator <<(std::ostream &os, const Label& label); }; struct Formula { private: public: std::string formula_; std::string content_; bool overwrite_ {false}; std::string createExpression() const; friend std::ostream& operator << (std::ostream &os, const Formula& formula); }; struct Action { public: std::string action_; std::string guard_; std::string update_; int index_{0}; bool overwrite_ {false}; std::string createExpression() const; friend std::ostream& operator << (std::ostream& os, const Action& action); }; struct Module { public: std::vector actions_; std::string module_; friend std::ostream& operator << (std::ostream& os, const Module& module); }; template<> struct YAML::convert { static YAML::Node encode(const Module& rhs); static bool decode(const YAML::Node& node, Module& rhs); }; template<> struct YAML::convert { static YAML::Node encode(const Action& rhs); static bool decode(const YAML::Node& node, Action& rhs); }; template<> struct YAML::convert