80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
#ifndef QMREDUCER_H
|
|
#define QMREDUCER_H
|
|
#pragma once
|
|
|
|
#include "../../Equations.h"
|
|
#include "../../defines.h"
|
|
#include "../../terms/Brackets.h"
|
|
#include "../../terms/Constant.h"
|
|
#include "../../terms/Equal.h"
|
|
#include "../../terms/Operator.h"
|
|
#include "../../terms/Term.h"
|
|
#include "../../terms/Variable.h"
|
|
#include "../../terms/Paranthesis.h"
|
|
#include "../../terms/Fraction.h"
|
|
#include "../../tokenizer.h"
|
|
|
|
#include "../../../vendor/lexertk.hpp"
|
|
|
|
#include "QMRule.h"
|
|
#include "QMRuleSet.h"
|
|
|
|
// WARINING: Only one variable is allowed or errors will happen!
|
|
|
|
class QMReducer {
|
|
public:
|
|
void setRuleSet(QMRuleSet set) { mRuleSet = set; };
|
|
void setPool(vector<Term*> terms) { mPool = terms; };
|
|
|
|
vector<Term*> Reduce();
|
|
|
|
private: // General Utilites
|
|
bool IsSolvable(Term* t1, Operator* op, Term* t2);
|
|
vector<Term*> BreakBracket(Bracket* brack, bool order = false, Identifier_t order_type = Identifier_t::_high_order_left);
|
|
vector<Term*> OrderTerms(vector<Term*> terms, Identifier_t order);
|
|
vector<Term*> getRangeOfTerms(vector<Term*> terms, int begin, int end);
|
|
|
|
Bracket* convertToBracket(Term* t1);
|
|
Variable* convertToVariable(Term* t1);
|
|
Constant* convertToConstant(Term* t1);
|
|
|
|
bool IsHigherSig(Term* t1, Term* t2);
|
|
|
|
bool IsEquTerms(Term* t1, Term* t2);
|
|
bool IsEquTypes(Term* t1, Term* t2);
|
|
bool IsEquPower(Term* t1, Term* t2);
|
|
bool IsEquValue(Term* t1, Term* t2);
|
|
bool IsEquVariable(Term* t1, Term* t2);
|
|
bool IsBracket(Term* t1);
|
|
|
|
private: // Power Evaluation
|
|
vector<Term*> ReducePower(Term* t1);
|
|
|
|
public: // Addition Evaluation // TODO: PRIVATE AFTER TESTING
|
|
vector<Term*> Add(Term* t1, Term* t2, Identifier_t order = Identifier_t::_high_order_left);
|
|
|
|
public: // Subtraction Evaluation // TODO: PRIVATE AFTER TESTING
|
|
vector<Term*> Sub(Term* t1, Term* t2, Identifier_t order = Identifier_t::_high_order_left);
|
|
|
|
public: // Multiplication Evaluation // TODO: PRIVATE AFTER TESTING
|
|
vector<Term*> Mul(Term* t1, Term* t2, Identifier_t order = Identifier_t::_high_order_left);
|
|
|
|
public: // Division Evaluation // TODO: PRIVATE AFTER TESTING
|
|
bool IsDivSolvable(Term* t1, Term* t2);
|
|
bool IsDivSpecialCase(Term* t1, Term* t2);
|
|
|
|
vector<Term*> gcdofTerms(Term* t1, Term* t2);
|
|
vector<Term*> FactorizeTermsToBrack(vector<Term*> terms, vector<Term*> terms2);
|
|
vector<Term*> FactorizeTermsToBrack(vector<Term*> terms);
|
|
|
|
bool TermsMatch(vector<Term*> terms1, vector<Term*> terms2);
|
|
|
|
vector<Term*> Div(Term* t1, Term* t2, Identifier_t order = Identifier_t::_high_order_left);
|
|
private:
|
|
QMRuleSet mRuleSet;
|
|
|
|
vector<Term*> mPool;
|
|
};
|
|
|
|
#endif // !QMREDUCER_H
|