mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-08 22:08:29 -05:00
77 lines
3.2 KiB
C++
77 lines
3.2 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
#include <memory>
|
|
#include <functional>
|
|
|
|
#include "ICommonExpression.h"
|
|
#include "CommonExpressionValue.h"
|
|
|
|
namespace menu
|
|
{
|
|
// https://en.cppreference.com/w/cpp/language/operator_precedence
|
|
enum class OperationPrecedence
|
|
{
|
|
MULTIPLICATION_DIVISION_REMAINDER = 1,
|
|
ADDITION_SUBTRACTION = 2,
|
|
BITWISE_SHIFT = 3,
|
|
RELATIONAL_GREATER_LESS_THAN = 4,
|
|
RELATIONAL_EQUALS = 5,
|
|
BITWISE_AND = 6,
|
|
BITWISE_OR = 8,
|
|
LOGICAL_AND = 9,
|
|
LOGICAL_OR = 10
|
|
};
|
|
|
|
class CommonExpressionBinaryOperationType
|
|
{
|
|
public:
|
|
using evaluation_function_t = std::function<CommonExpressionValue(const CommonExpressionValue& operand1, const CommonExpressionValue& operand2)>;
|
|
|
|
std::string m_syntax;
|
|
OperationPrecedence m_precedence;
|
|
evaluation_function_t m_evaluation_function;
|
|
|
|
private:
|
|
CommonExpressionBinaryOperationType(std::string syntax, OperationPrecedence precedence, evaluation_function_t evaluationFunction);
|
|
|
|
static const CommonExpressionBinaryOperationType OPERATION_ADD;
|
|
static const CommonExpressionBinaryOperationType OPERATION_SUBTRACT;
|
|
static const CommonExpressionBinaryOperationType OPERATION_MULTIPLY;
|
|
static const CommonExpressionBinaryOperationType OPERATION_DIVIDE;
|
|
static const CommonExpressionBinaryOperationType OPERATION_REMAINDER;
|
|
static const CommonExpressionBinaryOperationType OPERATION_BITWISE_AND;
|
|
static const CommonExpressionBinaryOperationType OPERATION_BITWISE_OR;
|
|
static const CommonExpressionBinaryOperationType OPERATION_SHIFT_LEFT;
|
|
static const CommonExpressionBinaryOperationType OPERATION_SHIFT_RIGHT;
|
|
static const CommonExpressionBinaryOperationType OPERATION_GREATER_THAN;
|
|
static const CommonExpressionBinaryOperationType OPERATION_GREATER_EQUAL_THAN;
|
|
static const CommonExpressionBinaryOperationType OPERATION_LESS_THAN;
|
|
static const CommonExpressionBinaryOperationType OPERATION_LESS_EQUAL_THAN;
|
|
static const CommonExpressionBinaryOperationType OPERATION_EQUALS;
|
|
static const CommonExpressionBinaryOperationType OPERATION_NOT_EQUAL;
|
|
static const CommonExpressionBinaryOperationType OPERATION_AND;
|
|
static const CommonExpressionBinaryOperationType OPERATION_OR;
|
|
|
|
static const CommonExpressionBinaryOperationType* const ALL_OPERATION_TYPES[];
|
|
};
|
|
|
|
class CommonExpressionBinaryOperation final : public ICommonExpression
|
|
{
|
|
public:
|
|
std::unique_ptr<ICommonExpression> m_operand1;
|
|
std::unique_ptr<ICommonExpression> m_operand2;
|
|
const CommonExpressionBinaryOperationType* m_operation_type;
|
|
|
|
CommonExpressionBinaryOperation(std::unique_ptr<ICommonExpression> operand1,
|
|
std::unique_ptr<ICommonExpression> operand2,
|
|
const CommonExpressionBinaryOperationType* operationType);
|
|
|
|
_NODISCARD bool Operand1NeedsParenthesis() const;
|
|
_NODISCARD bool Operand2NeedsParenthesis() const;
|
|
|
|
bool IsStatic() override;
|
|
CommonExpressionValue Evaluate() override;
|
|
};
|
|
}
|