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 };