File indexing completed on 2024-04-28 05:49:45

0001 /*
0002     SPDX-FileCopyrightText: 2023 Gabriel Barrantes <gabriel.barrantes.dev@outlook.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #pragma once
0007 
0008 #include "kcalc_core_p.h"
0009 #include "kcalc_priority_levels_p.h"
0010 #include "knumber.h"
0011 #include <QDebug>
0012 
0013 class KCalcToken
0014 {
0015 public:
0016     KCalcToken();
0017     ~KCalcToken();
0018 
0019     enum TokenCode {
0020         KNUMBER,
0021         DECIMAL_POINT,
0022         PLUS,
0023         MINUS,
0024         INVERT_SIGN,
0025         DIVISION,
0026         SLASH,
0027         MULTIPLICATION,
0028         DOT,
0029         ASTERISK,
0030         PERCENTAGE,
0031         PERMILLE,
0032         OPENING_PARENTHESIS,
0033         CLOSING_PARENTHESIS,
0034         SQUARE,
0035         CUBE,
0036         SQUARE_ROOT,
0037         CUBIC_ROOT,
0038         DEGREE,
0039         GRADIAN,
0040         RADIAN,
0041         SIN,
0042         SIN_RAD,
0043         SIN_DEG,
0044         SIN_GRAD,
0045         COS,
0046         COS_RAD,
0047         COS_DEG,
0048         COS_GRAD,
0049         TAN,
0050         TAN_RAD,
0051         TAN_DEG,
0052         TAN_GRAD,
0053         ASIN,
0054         ASIN_RAD,
0055         ASIN_DEG,
0056         ASIN_GRAD,
0057         ACOS,
0058         ACOS_RAD,
0059         ACOS_DEG,
0060         ACOS_GRAD,
0061         ATAN,
0062         ATAN_RAD,
0063         ATAN_DEG,
0064         ATAN_GRAD,
0065         SINH,
0066         COSH,
0067         TANH,
0068         ASINH,
0069         ACOSH,
0070         ATANH,
0071         E,
0072         PI,
0073         PHI,
0074         I,
0075         POS_INFINITY,
0076         NEG_INFINITY,
0077         VACUUM_PERMITIVITY,
0078         VACUUM_PERMEABILITY,
0079         VACUUM_IMPEDANCE,
0080         PLANCK_S_CONSTANT,
0081         PLANCK_OVER_2PI,
0082         EXP,
0083         EXP_10,
0084         POWER,
0085         POWER_ROOT,
0086         FACTORIAL,
0087         DOUBLE_FACTORIAL,
0088         GAMMA,
0089         LN,
0090         LOG_10,
0091         RECIPROCAL,
0092         BINOMIAL,
0093         MODULO,
0094         INTEGER_DIVISION,
0095         AND,
0096         OR,
0097         XOR,
0098         ONE_S_COMPLEMENT,
0099         TWO_S_COMPLEMENT,
0100         RSH,
0101         LSH,
0102         EQUAL,
0103         ANS,
0104         INVALID_TOKEN,
0105         STUB
0106     };
0107 
0108     enum TokenType {
0109         KNUMBER_TYPE,
0110         RIGHT_UNARY_FUNCTION_TYPE,
0111         LEFT_UNARY_FUNCTION_TYPE,
0112         BINARY_FUNCTION_TYPE,
0113         OPENING_PARENTHESES_TYPE,
0114         CLOSING_PARENTHESES_TYPE,
0115         NOT_INITIALIZED
0116     };
0117 
0118     KCalcToken(TokenCode tokenCode);
0119     KCalcToken(TokenCode tokenCode, int stringIndex);
0120 
0121     KCalcToken(const KNumber &kNumber);
0122     KCalcToken(const KNumber &kNumber, int stringIndex);
0123 
0124     bool isKNumber() const;
0125     bool isRightUnaryFunction() const;
0126     bool isLeftUnaryFunction() const;
0127     bool isBinaryFunction() const;
0128     bool isOpeningParentheses() const;
0129     bool isClosingParentheses() const;
0130 
0131     TokenCode getTokenCode() const;
0132     TokenType getTokenType() const;
0133     int getPriorityLevel() const;
0134     int getStringIndex() const;
0135 
0136     const KNumber getKNumber() const;
0137     KNumber evaluate(const KNumber &kNumber) const;
0138     KNumber evaluate(const KNumber &kNumberLeft, const KNumber &kNumberRight) const;
0139 
0140     void invertSignFirstArg();
0141     void invertSignSecondArg();
0142 
0143     void updateToken(const KNumber &kNumber);
0144     void updateToken(TokenCode tokenCode);
0145 
0146 private:
0147     typedef KNumber (*Unary_Function_Ptr)(const KNumber &);
0148     typedef KNumber (*Binary_Function_Ptr)(const KNumber &, const KNumber &);
0149 
0150     const KNumber *key_;
0151     KNumber kNumber_;
0152     TokenCode token_Code_;
0153     TokenType token_Type_;
0154     Unary_Function_Ptr unary_Function_Ptr_;
0155     Binary_Function_Ptr binary_Function_Ptr_;
0156 
0157     bool is_KNumber_;
0158     bool is_Right_Unary_Function_;
0159     bool is_Left_Unary_Function_;
0160     bool is_Binary_Function_;
0161     bool is_Opening_Parentheses_;
0162     bool is_Closing_Parentheses_;
0163 
0164     bool invert_Sign_First_Arg_;
0165     bool invert_Sign_Second_Arg_;
0166 
0167     int priority_level_;
0168     int string_index_;
0169 
0170     void setToken_(TokenCode tokenCode);
0171     void inline set_Left_Unary_Token_(Unary_Function_Ptr function, int priorityLevel);
0172     void inline set_Right_UnaryToken_(Unary_Function_Ptr function, int priorityLevel);
0173     void inline set_Binary_Token_(Binary_Function_Ptr function, int priorityLevel);
0174     void resetToken_();
0175 };