| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 | #ifndef MANDEL_ITERATIONFORMULA_H#define MANDEL_ITERATIONFORMULA_H#include <variant>#include <memory>#include <string>#include <stdexcept>#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<Expression> 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<Expression> operand;    /*inline UnaryOperation(const UnaryOperation& other) :        operand{ std::make_unique<Expression>(*other.operand) }    {}*/};struct mnd::BinaryOperation{    std::unique_ptr<Expression> left;    std::unique_ptr<Expression> right;    /*inline BinaryOperation(const BinaryOperation& other) :        left{ std::make_unique<Expression>(*other.left) },        right{ std::make_unique<Expression>(*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
 |