2026-05-14 11:13:22 -05:00
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| NodeFactory.mqh |
|
|
|
|
|
//| Copyright 2026, Niquel Mendoza. |
|
|
|
|
|
//| https://www.mql5.com/es/users/nique_372/news |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
#property copyright "Copyright 2026, Niquel Mendoza."
|
|
|
|
|
#property link "https://www.mql5.com/es/users/nique_372/news"
|
|
|
|
|
#property strict
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef EXPRESSEVALBYLEO_SRC_MATHEVAL_NODEFACTORY
|
|
|
|
|
#define EXPRESSEVALBYLEO_SRC_MATHEVAL_NODEFACTORY
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
#include "NodeMath.mqh"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
class CFactoryMathNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
CFactoryMathNode() {}
|
|
|
|
|
~CFactoryMathNode() {}
|
|
|
|
|
|
2026-05-14 11:59:38 -05:00
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
template<typename T>
|
|
|
|
|
static bool Get_DS_ad_op(const int type_op, ValueNode& v1, IValorSimpleValue<T>* v_left, const BitInterpreter& v2)
|
|
|
|
|
{
|
|
|
|
|
switch(type_op)
|
|
|
|
|
{
|
|
|
|
|
case BINARY_NODE_OP_RESTA:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ad_res<T>(v_left, v2.double_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_SUMA:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ad_sum<T>(v_left, v2.double_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_DIVICION:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ad_div<T>(v_left, v2.double_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_MUL:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ad_mul<T>(v_left, v2.double_value);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
template<typename T>
|
|
|
|
|
static bool CFactoryMathNode::Get_DS_di_op(const int type_op, ValueNode& v1, IValorSimpleValue<T>* v_left, const BitInterpreter& v2)
|
|
|
|
|
{
|
|
|
|
|
switch(type_op)
|
|
|
|
|
{
|
|
|
|
|
case BINARY_NODE_OP_RESTA:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_di_res<T>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_SUMA:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_di_sum<T>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_DIVICION:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_di_div<T>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_MUL:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_di_mul<T>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
template<typename RES, typename T>
|
|
|
|
|
static bool Get_DS_ii_op(const int type_op, ValueNode& v1, IValorSimpleValue<T>* v_left, const BitInterpreter& v2)
|
|
|
|
|
{
|
|
|
|
|
switch(type_op)
|
|
|
|
|
{
|
|
|
|
|
case BINARY_NODE_OP_BIT_OR:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ii_bit_or<T, RES>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_BIT_XOR:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ii_bit_xor<T, RES>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_BIT_AND:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ii_bit_and<T, RES>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_BIT_DEZPLAZAMIENTO_DRC:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ii_bit_dez_der<T, RES>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_BIT_DEZPLAZAMIENTO_IZQ:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ii_bit_dez_izq<T, RES>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_RESTA:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ii_res<T, RES>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_SUMA:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ii_sum<T, RES>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_MODULO:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ii_modulo<T, RES>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_DIVICION:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ii_div<T, RES>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_MUL:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_DS_ii_mul<T, RES>(v_left, v2.long_value);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
static bool CFactoryMathNode::Get_DS_ad(const int type_op, ValueNode& v1, const ValueNode& v2)
|
|
|
|
|
{
|
|
|
|
|
switch(v1.d_val.m_data_type)
|
|
|
|
|
{
|
|
|
|
|
case TYPE_BOOL:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<bool>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_CHAR:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<char>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_UCHAR:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<uchar>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_SHORT:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<short>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_USHORT:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<ushort>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_COLOR:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<color>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_INT:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<int>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_UINT:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<uint>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_DATETIME:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<datetime>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_LONG:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<long>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_ULONG:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<ulong>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_FLOAT:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<float>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_DOUBLE:
|
|
|
|
|
return Get_DS_ad_op(type_op, v1, (IValorSimpleValue<double>*)v1.d_val, v2.s_val);
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
static bool CFactoryMathNode::Get_DS_ai(const int type_op, ValueNode& v1, const ValueNode& v2)
|
|
|
|
|
{
|
|
|
|
|
switch(v1.d_val.m_data_type)
|
|
|
|
|
{
|
|
|
|
|
case TYPE_BOOL:
|
|
|
|
|
return Get_DS_ii_op<long, bool>(type_op, v1, (IValorSimpleValue<bool>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_CHAR:
|
|
|
|
|
return Get_DS_ii_op<long, char>(type_op, v1, (IValorSimpleValue<char>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_UCHAR:
|
|
|
|
|
return Get_DS_ii_op<long, uchar>(type_op, v1, (IValorSimpleValue<uchar>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_SHORT:
|
|
|
|
|
return Get_DS_ii_op<long, short>(type_op, v1, (IValorSimpleValue<short>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_USHORT:
|
|
|
|
|
return Get_DS_ii_op<long, ushort>(type_op, v1, (IValorSimpleValue<ushort>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_COLOR:
|
|
|
|
|
return Get_DS_ii_op<long, color>(type_op, v1, (IValorSimpleValue<color>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_INT:
|
|
|
|
|
return Get_DS_ii_op<long, int>(type_op, v1, (IValorSimpleValue<int>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_UINT:
|
|
|
|
|
return Get_DS_ii_op<long, uint>(type_op, v1, (IValorSimpleValue<uint>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_DATETIME:
|
|
|
|
|
return Get_DS_ii_op<long, datetime>(type_op, v1, (IValorSimpleValue<datetime>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_LONG:
|
|
|
|
|
return Get_DS_ii_op<long, long>(type_op, v1, (IValorSimpleValue<long>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_ULONG:
|
|
|
|
|
return Get_DS_ii_op<ulong, ulong>(type_op, v1, (IValorSimpleValue<ulong>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_FLOAT:
|
|
|
|
|
return Get_DS_di_op(type_op, v1, (IValorSimpleValue<float>*)v1.d_val, v2.s_val);
|
|
|
|
|
case TYPE_DOUBLE:
|
|
|
|
|
return Get_DS_di_op(type_op, v1, (IValorSimpleValue<double>*)v1.d_val, v2.s_val);
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
2026-05-14 11:13:22 -05:00
|
|
|
//---
|
|
|
|
|
template<typename T>
|
|
|
|
|
static bool Get_SD_da_op(const int type_op, ValueNode& v1, IValorSimpleValue<T>* v2)
|
|
|
|
|
{
|
|
|
|
|
switch(type_op)
|
|
|
|
|
{
|
|
|
|
|
case BINARY_NODE_OP_RESTA:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_da_res<T>(v1.s_val.double_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_SUMA:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_da_sum<T>(v1.s_val.double_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_DIVICION:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_da_div<T>(v1.s_val.double_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_MUL:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_da_mul<T>(v1.s_val.double_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
template<typename T>
|
|
|
|
|
static bool Get_SD_id_op(const int type_op, ValueNode& v1, IValorSimpleValue<T>* v2)
|
|
|
|
|
{
|
|
|
|
|
switch(type_op)
|
|
|
|
|
{
|
|
|
|
|
case BINARY_NODE_OP_RESTA:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_id_res<T>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_SUMA:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_id_sum<T>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_DIVICION:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_id_div<T>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_MUL:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_id_mul<T>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
template<typename RES, typename T>
|
|
|
|
|
static bool Get_SD_ii_op(const int type_op, ValueNode& v1, IValorSimpleValue<T>* v2)
|
|
|
|
|
{
|
|
|
|
|
switch(type_op)
|
|
|
|
|
{
|
|
|
|
|
case BINARY_NODE_OP_BIT_OR:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_ii_bit_or<T, RES>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_BIT_XOR:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_ii_bit_xor<T, RES>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_BIT_AND:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_ii_bit_and<T, RES>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_BIT_DEZPLAZAMIENTO_DRC:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_ii_bit_dez_der<T, RES>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_BIT_DEZPLAZAMIENTO_IZQ:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_ii_bit_dez_izq<T, RES>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_RESTA:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_ii_res<T, RES>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_SUMA:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_ii_sum<T, RES>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_MODULO:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_ii_modulo<T, RES>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_DIVICION:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_ii_div<T, RES>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_MUL:
|
|
|
|
|
v1.d_val = new CAstBynaryNodeStatic_SD_ii_mul<T, RES>(v1.s_val.long_value, v2);
|
|
|
|
|
return true;
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
static bool Get_SD_da(const int type_op, ValueNode& v1, const ValueNode& v2)
|
|
|
|
|
{
|
|
|
|
|
switch(v2.d_val.m_data_type)
|
|
|
|
|
{
|
|
|
|
|
//---
|
|
|
|
|
case TYPE_BOOL:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<bool>*)v2.d_val);
|
|
|
|
|
case TYPE_CHAR:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<char>*)v2.d_val);
|
|
|
|
|
case TYPE_UCHAR:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<uchar>*)v2.d_val);
|
|
|
|
|
case TYPE_SHORT:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<short>*)v2.d_val);
|
|
|
|
|
case TYPE_USHORT:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<ushort>*)v2.d_val);
|
|
|
|
|
case TYPE_COLOR:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<color>*)v2.d_val);
|
|
|
|
|
case TYPE_INT:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<int>*)v2.d_val);
|
|
|
|
|
case TYPE_UINT:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<uint>*)v2.d_val);
|
|
|
|
|
case TYPE_DATETIME:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<datetime>*)v2.d_val);
|
|
|
|
|
case TYPE_LONG:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<long>*)v2.d_val);
|
|
|
|
|
case TYPE_ULONG:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<ulong>*)v2.d_val);
|
|
|
|
|
case TYPE_FLOAT:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<float>*)v2.d_val);
|
|
|
|
|
case TYPE_DOUBLE:
|
|
|
|
|
return Get_SD_da_op(type_op, v1, (IValorSimpleValue<double>*)v2.d_val);
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
static bool Get_SD_ia(const int type_op, ValueNode& v1, const ValueNode& v2)
|
|
|
|
|
{
|
|
|
|
|
switch(v2.d_val.m_data_type)
|
|
|
|
|
{
|
|
|
|
|
//---
|
|
|
|
|
case TYPE_BOOL:
|
|
|
|
|
return Get_SD_ii_op<long, bool>(type_op, v1, (IValorSimpleValue<bool>*)v2.d_val);
|
|
|
|
|
case TYPE_CHAR:
|
|
|
|
|
return Get_SD_ii_op<long, char>(type_op, v1, (IValorSimpleValue<char>*)v2.d_val);
|
|
|
|
|
case TYPE_UCHAR:
|
|
|
|
|
return Get_SD_ii_op<long, uchar>(type_op, v1, (IValorSimpleValue<uchar>*)v2.d_val);
|
|
|
|
|
case TYPE_SHORT:
|
|
|
|
|
return Get_SD_ii_op<long, short>(type_op, v1, (IValorSimpleValue<short>*)v2.d_val);
|
|
|
|
|
case TYPE_USHORT:
|
|
|
|
|
return Get_SD_ii_op<long, ushort>(type_op, v1, (IValorSimpleValue<ushort>*)v2.d_val);
|
|
|
|
|
case TYPE_COLOR:
|
|
|
|
|
return Get_SD_ii_op<long, color>(type_op, v1, (IValorSimpleValue<color>*)v2.d_val);
|
|
|
|
|
case TYPE_INT:
|
|
|
|
|
return Get_SD_ii_op<long, int>(type_op, v1, (IValorSimpleValue<int>*)v2.d_val);
|
|
|
|
|
case TYPE_UINT:
|
|
|
|
|
return Get_SD_ii_op<long, uint>(type_op, v1, (IValorSimpleValue<uint>*)v2.d_val);
|
|
|
|
|
case TYPE_DATETIME:
|
|
|
|
|
return Get_SD_ii_op<long, datetime>(type_op, v1, (IValorSimpleValue<datetime>*)v2.d_val);
|
|
|
|
|
case TYPE_LONG:
|
|
|
|
|
return Get_SD_ii_op<long, long>(type_op, v1, (IValorSimpleValue<long>*)v2.d_val);
|
|
|
|
|
case TYPE_ULONG:
|
|
|
|
|
return Get_SD_ii_op<ulong, ulong>(type_op, v1, (IValorSimpleValue<ulong>*)v2.d_val);
|
|
|
|
|
case TYPE_FLOAT:
|
|
|
|
|
return Get_SD_id_op(type_op, v1, (IValorSimpleValue<float>*)v2.d_val);
|
|
|
|
|
case TYPE_DOUBLE:
|
|
|
|
|
return Get_SD_id_op(type_op, v1, (IValorSimpleValue<double>*)v2.d_val);
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
template<typename RES>
|
|
|
|
|
static IValorSimpleValue<RES>* CastNumeric(IValor* v)
|
|
|
|
|
{
|
|
|
|
|
switch(v.m_data_type)
|
|
|
|
|
{
|
|
|
|
|
//---
|
|
|
|
|
case TYPE_BOOL:
|
|
|
|
|
return new CCastNode<bool, RES>((IValorSimpleValue<bool>*)v);
|
|
|
|
|
case TYPE_CHAR:
|
|
|
|
|
return new CCastNode<char, RES>((IValorSimpleValue<char>*)v);
|
|
|
|
|
case TYPE_UCHAR:
|
|
|
|
|
return new CCastNode<uchar, RES>((IValorSimpleValue<uchar>*)v);
|
|
|
|
|
case TYPE_SHORT:
|
|
|
|
|
return new CCastNode<short, RES>((IValorSimpleValue<short>*)v);
|
|
|
|
|
case TYPE_USHORT:
|
|
|
|
|
return new CCastNode<ushort, RES>((IValorSimpleValue<ushort>*)v);
|
|
|
|
|
case TYPE_COLOR:
|
|
|
|
|
return new CCastNode<color, RES>((IValorSimpleValue<color>*)v);
|
|
|
|
|
case TYPE_INT:
|
|
|
|
|
return new CCastNode<int, RES>((IValorSimpleValue<int>*)v);
|
|
|
|
|
case TYPE_UINT:
|
|
|
|
|
return new CCastNode<uint, RES>((IValorSimpleValue<uint>*)v);
|
|
|
|
|
case TYPE_DATETIME:
|
|
|
|
|
return new CCastNode<datetime, RES>((IValorSimpleValue<datetime>*)v);
|
|
|
|
|
case TYPE_LONG:
|
|
|
|
|
return new CCastNode<long, RES>((IValorSimpleValue<long>*)v);
|
|
|
|
|
case TYPE_ULONG:
|
|
|
|
|
return new CCastNode<ulong, RES>((IValorSimpleValue<ulong>*)v);
|
|
|
|
|
case TYPE_FLOAT:
|
|
|
|
|
return new CCastNode<float, RES>((IValorSimpleValue<float>*)v);
|
|
|
|
|
case TYPE_DOUBLE:
|
|
|
|
|
return new CCastNode<double, RES>((IValorSimpleValue<double>*)v);
|
|
|
|
|
default:
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
template<typename T, typename RES>
|
|
|
|
|
static bool Get_DD_ii_op(const int type_op, ValueNode& bit1, IValorSimpleValue<T>* v1, IValorSimpleValue<T>* v2)
|
|
|
|
|
{
|
|
|
|
|
switch(type_op)
|
|
|
|
|
{
|
|
|
|
|
case BINARY_NODE_OP_BIT_OR:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_NN_bit_or<T, T, RES>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_BIT_XOR:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_NN_bit_xor<T, T, RES>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_BIT_AND:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_NN_bit_and<T, T, RES>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_BIT_DEZPLAZAMIENTO_DRC:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_NN_bit_dez_der<T, T, RES>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_BIT_DEZPLAZAMIENTO_IZQ:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_NN_bit_dez_izq<T, T, RES>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_RESTA:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_NN_res<T, T, RES>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_SUMA:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_NN_sum<T, T, RES>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_MODULO:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_NN_modulo<T, T, RES>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_DIVICION:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_NN_div<T, T, RES>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_MUL:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_NN_mul<T, T, RES>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
template<typename T>
|
|
|
|
|
static bool Get_DD_dd_op(const int type_op, ValueNode& bit1, IValorSimpleValue<T>* v1, IValorSimpleValue<T>* v2)
|
|
|
|
|
{
|
|
|
|
|
switch(type_op)
|
|
|
|
|
{
|
|
|
|
|
case BINARY_NODE_OP_RESTA:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_DD_res<T>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_SUMA:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_DD_sum<T>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_DIVICION:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_DD_div<T>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
case BINARY_NODE_OP_MUL:
|
|
|
|
|
bit1.d_val = new CAstBinaryOpNodeDync_DD_mul<T>(v1, v2);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
static bool Get_DD(const int type_op, ValueNode& v1, const ValueNode& v2)
|
|
|
|
|
{
|
|
|
|
|
const ENUM_DATATYPE final_data_type = fmax(v1.d_val.m_data_type, v2.d_val.m_data_type);
|
|
|
|
|
switch(final_data_type) // Tipo1
|
|
|
|
|
{
|
|
|
|
|
//---
|
|
|
|
|
case TYPE_BOOL:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<bool>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<bool>*)v1.d_val : CastNumeric<bool>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<bool>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<bool>*)v2.d_val : CastNumeric<bool>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op<bool, int>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
case TYPE_CHAR:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<char>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<char>*)v1.d_val : CastNumeric<char>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<char>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<char>*)v2.d_val : CastNumeric<char>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op<char, char>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
case TYPE_UCHAR:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<uchar>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<uchar>*)v1.d_val : CastNumeric<uchar>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<uchar>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<uchar>*)v2.d_val : CastNumeric<uchar>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op<uchar, uchar>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
case TYPE_SHORT:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<short>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<short>*)v1.d_val : CastNumeric<short>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<short>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<short>*)v2.d_val : CastNumeric<short>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op<short, short>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
case TYPE_USHORT:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<ushort>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<ushort>*)v1.d_val : CastNumeric<ushort>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<ushort>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<ushort>*)v2.d_val : CastNumeric<ushort>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op<ushort, ushort>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
case TYPE_COLOR:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<color>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<color>*)v1.d_val : CastNumeric<color>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<color>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<color>*)v2.d_val : CastNumeric<color>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op<color, color>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
case TYPE_INT:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<int>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<int>*)v1.d_val : CastNumeric<int>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<int>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<int>*)v2.d_val : CastNumeric<int>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op<int, int>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
case TYPE_UINT:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<uint>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<uint>*)v1.d_val : CastNumeric<uint>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<uint>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<uint>*)v2.d_val : CastNumeric<uint>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op<uint, uint>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
case TYPE_DATETIME:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<datetime>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<datetime>*)v1.d_val : CastNumeric<datetime>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<datetime>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<datetime>*)v2.d_val : CastNumeric<datetime>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op<datetime, datetime>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
case TYPE_LONG:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<long>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<long>*)v1.d_val : CastNumeric<long>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<long>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<long>*)v2.d_val : CastNumeric<long>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op<long, long>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
case TYPE_ULONG:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<ulong>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<ulong>*)v1.d_val : CastNumeric<ulong>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<ulong>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<ulong>*)v2.d_val : CastNumeric<ulong>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op<ulong, ulong>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
case TYPE_FLOAT:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<float>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<float>*)v1.d_val : CastNumeric<float>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<float>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<float>*)v2.d_val : CastNumeric<float>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_dd_op<float>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
case TYPE_DOUBLE:
|
|
|
|
|
{
|
|
|
|
|
IValorSimpleValue<double>* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue<double>*)v1.d_val : CastNumeric<double>(v1.d_val);
|
|
|
|
|
IValorSimpleValue<double>* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue<double>*)v2.d_val : CastNumeric<double>(v2.d_val);
|
|
|
|
|
return (p1 == NULL || p2 == NULL) ? false : Get_DD_dd_op<double>(type_op, v1, p1, p2);
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endif // EXPRESSEVALBYLEO_SRC_MATHEVAL_NODEFACTORY
|