123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #ifndef MANDEL_ITERATIONFORMULA_H
- #define MANDEL_ITERATIONFORMULA_H
- #include <variant>
- #include <memory>
- #include <string>
- #include <stdexcept>
- #include <optional>
- #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::vector<std::string> variables;
- std::unique_ptr<Expression> expr;
- IterationFormula(std::unique_ptr<Expression> expr, const std::vector<std::string>& variables = { "c", "z", "i" });
- IterationFormula(Expression expr, const std::vector<std::string>& variables = { "c", "z", "i" });
- std::optional<std::string> findUnknownVariables(const Expression& expr);
- void optimize(void);
- bool containsVariable(const std::string& name) const;
- IterationFormula clone(void) const;
- };
- 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 Negation(const Negation& 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
|