ExpressEvalByLeo/Src/Common/Node.mqh
Nique_372 68d060365e
2026-05-14 16:54:23 -05:00

158 lines
5.5 KiB
MQL5

//+------------------------------------------------------------------+
//| Node.mqh |
//| Copyright 2026, Niquel Mendoza. |
//| https://www.mql5.com/es/users/nique_372 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, Niquel Mendoza."
#property link "https://www.mql5.com/es/users/nique_372"
#property strict
#ifndef EXPRESSEVALBYLEO_SRC_COMMON_NODE_MQH
#define EXPRESSEVALBYLEO_SRC_COMMON_NODE_MQH
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "Def.mqh"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
/*
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_BOOL = 1
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_CHAR = 2
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_UCHAR = 3
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_SHORT = 4
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_USHORT = 5
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_COLOR = 6
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_INT = 7
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_UINT = 8
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_DATETIME = 9
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_LONG = 10
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_ULONG = 11
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_FLOAT = 12
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_DOUBLE = 13
2026.04.13 12:36:25.128 tas (EURUSD,H1) TYPE_STRING = 14
// $valor / 2 / 1 + 4 * 3
*/
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class IValor
{
public:
IValor(const string& type) : m_data_type(CEnumReg::GetValue<ENUM_DATATYPE>(type, WRONG_VALUE))
{
if(m_data_type == WRONG_VALUE)
{
FastLog(FUNCION_ACTUAL, FATAL_ERROR_TEXT, StringFormat("Tipo invalido = %s", type));
Remover();
}
}
~IValor() {}
const ENUM_DATATYPE m_data_type; //
virtual __forceinline ENUM_AST_NODE_TYPE TypeValue() const = 0;
// virtual string GetDoc() const = 0;
};
// sumar(sumar(10, 20), 20)
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
template <typename T> // Numeros
class IValorSimpleValue : public IValor
{
public:
IValorSimpleValue() : IValor(typename(T)) {}
~IValorSimpleValue() {}
virtual T Get() const = 0;
};
//---
template <typename T> // Numeros
class IValorSimpleValVal : public IValorSimpleValue<T>
{
private:
const T m_v;
public:
IValorSimpleValVal(const T v) : m_v(v) {}
~IValorSimpleValVal(void) {}
//---
__forceinline ENUM_AST_NODE_TYPE TypeValue() const override final { return AST_EXPVAL_NODE_TYPE_VARIABLE; }
__forceinline T Get() const override final { return m_v; }
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
template <typename T>
class IValorFuncion : public IValorSimpleValue<T>
{
protected:
CHashMap<string, IValor*>* m_tabla_variables;
CHashMap<string, IValorFuncion*>* m_tabla_functions;
public:
IValorFuncion(void) {}
~IValorFuncion(void) {}
//---
// Funcion para setear tablas
//---
virtual bool ParseParams(const string& params) = 0;
//---
__forceinline ENUM_AST_NODE_TYPE TypeValue() const override final { return AST_EXPVAL_NODE_TYPE_FUNCTION; }
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class IValString : public IValor
{
public:
IValString(void) : IValor("string") {}
~IValString(void) {}
//---
__forceinline ENUM_AST_NODE_TYPE TypeValue() const override final { return AST_EXPVAL_NODE_TYPE_VARIABLE; }
virtual bool Get(string& value) const = 0;
virtual string Get() const = 0;
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//--- Nodo cast
template<typename FROM, typename TO>
class CCastNode : public IValorSimpleValue<TO>
{
IValorSimpleValue<FROM>* const m_v;
public:
CCastNode(IValorSimpleValue<FROM>* v) : m_v(v) {}
~CCastNode() { if(CheckPointer(m_v) == POINTER_DYNAMIC) delete m_v; }
//---
__forceinline TO Get() const override final { return (TO)m_v.Get(); }
__forceinline ENUM_AST_NODE_TYPE TypeValue() const override final { return AST_EXPVAL_NODE_TYPE_CAST_PRODUCT; }
};
//+------------------------------------------------------------------+
#endif // EXPRESSEVALBYLEO_SRC_COMMON_NODE_MQH