#ifndef MANDEL_ITERATIONFORMULA_H #define MANDEL_ITERATIONFORMULA_H #include #include #include #include #include "Types.h" namespace mnd { struct IterationFormula; struct Constant; struct Variable; struct Negation; struct BinaryOperation; struct Addition; struct Multiplication; struct Division; struct Pow; using Expression = std::variant< Constant, Variable, Negation, Addition, Multiplication, Division, Pow >; struct ParseError : std::runtime_error { ParseError(const std::string& err) : std::runtime_error(err.c_str()) {} }; Expression parse(const std::string& formula); std::string toString(const mnd::Expression&); } struct mnd::IterationFormula { std::unique_ptr expr; IterationFormula(Expression expr); void optimize(void); }; struct mnd::Constant { mnd::Real re; mnd::Real im; inline Constant(const mnd::Real& value) : re{ value }, im{ 0.0 } {} inline Constant(const mnd::Real& re, const mnd::Real& im) : re{ re }, im{ im } {} }; struct mnd::Variable { std::string name; }; struct mnd::Negation { std::unique_ptr operand; /*inline UnaryOperation(const UnaryOperation& other) : operand{ std::make_unique(*other.operand) } {}*/ }; struct mnd::BinaryOperation { std::unique_ptr left; std::unique_ptr right; /*inline BinaryOperation(const BinaryOperation& other) : left{ std::make_unique(*other.left) }, right{ std::make_unique(*other.right) } {}*/ }; struct mnd::Addition : mnd::BinaryOperation { bool subtraction = false; }; struct mnd::Multiplication : mnd::BinaryOperation { }; struct mnd::Division : mnd::BinaryOperation { }; struct mnd::Pow : mnd::BinaryOperation { bool realExponent; bool integerExponent; }; namespace mnd { } #endif // MANDEL_ITERATIONFORMULA_H