//+------------------------------------------------------------------+ //| 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() {} //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ template static bool Get_DS_ad_op(const int type_op, ValueNode& v1, IValorSimpleValue* v_left, const BitInterpreter& v2) { switch(type_op) { case BINARY_NODE_OP_RESTA: v1.d_val = new CAstBynaryNodeStatic_DS_ad_res(v_left, v2.double_value); return true; case BINARY_NODE_OP_SUMA: v1.d_val = new CAstBynaryNodeStatic_DS_ad_sum(v_left, v2.double_value); return true; case BINARY_NODE_OP_DIVICION: v1.d_val = new CAstBynaryNodeStatic_DS_ad_div(v_left, v2.double_value); return true; case BINARY_NODE_OP_MUL: v1.d_val = new CAstBynaryNodeStatic_DS_ad_mul(v_left, v2.double_value); return true; } return false; } //+------------------------------------------------------------------+ template static bool CFactoryMathNode::Get_DS_di_op(const int type_op, ValueNode& v1, IValorSimpleValue* v_left, const BitInterpreter& v2) { switch(type_op) { case BINARY_NODE_OP_RESTA: v1.d_val = new CAstBynaryNodeStatic_DS_di_res(v_left, v2.long_value); return true; case BINARY_NODE_OP_SUMA: v1.d_val = new CAstBynaryNodeStatic_DS_di_sum(v_left, v2.long_value); return true; case BINARY_NODE_OP_DIVICION: v1.d_val = new CAstBynaryNodeStatic_DS_di_div(v_left, v2.long_value); return true; case BINARY_NODE_OP_MUL: v1.d_val = new CAstBynaryNodeStatic_DS_di_mul(v_left, v2.long_value); return true; } return false; } //+------------------------------------------------------------------+ template static bool Get_DS_ii_op(const int type_op, ValueNode& v1, IValorSimpleValue* v_left, const BitInterpreter& v2) { switch(type_op) { case BINARY_NODE_OP_BIT_OR: v1.d_val = new CAstBynaryNodeStatic_DS_ii_bit_or(v_left, v2.long_value); return true; case BINARY_NODE_OP_BIT_XOR: v1.d_val = new CAstBynaryNodeStatic_DS_ii_bit_xor(v_left, v2.long_value); return true; case BINARY_NODE_OP_BIT_AND: v1.d_val = new CAstBynaryNodeStatic_DS_ii_bit_and(v_left, v2.long_value); return true; case BINARY_NODE_OP_BIT_DEZPLAZAMIENTO_DRC: v1.d_val = new CAstBynaryNodeStatic_DS_ii_bit_dez_der(v_left, v2.long_value); return true; case BINARY_NODE_OP_BIT_DEZPLAZAMIENTO_IZQ: v1.d_val = new CAstBynaryNodeStatic_DS_ii_bit_dez_izq(v_left, v2.long_value); return true; case BINARY_NODE_OP_RESTA: v1.d_val = new CAstBynaryNodeStatic_DS_ii_res(v_left, v2.long_value); return true; case BINARY_NODE_OP_SUMA: v1.d_val = new CAstBynaryNodeStatic_DS_ii_sum(v_left, v2.long_value); return true; case BINARY_NODE_OP_MODULO: v1.d_val = new CAstBynaryNodeStatic_DS_ii_modulo(v_left, v2.long_value); return true; case BINARY_NODE_OP_DIVICION: v1.d_val = new CAstBynaryNodeStatic_DS_ii_div(v_left, v2.long_value); return true; case BINARY_NODE_OP_MUL: v1.d_val = new CAstBynaryNodeStatic_DS_ii_mul(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*)v1.d_val, v2.s_val); case TYPE_CHAR: return Get_DS_ad_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_UCHAR: return Get_DS_ad_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_SHORT: return Get_DS_ad_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_USHORT: return Get_DS_ad_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_COLOR: return Get_DS_ad_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_INT: return Get_DS_ad_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_UINT: return Get_DS_ad_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_DATETIME: return Get_DS_ad_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_LONG: return Get_DS_ad_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_ULONG: return Get_DS_ad_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_FLOAT: return Get_DS_ad_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_DOUBLE: return Get_DS_ad_op(type_op, v1, (IValorSimpleValue*)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(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_CHAR: return Get_DS_ii_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_UCHAR: return Get_DS_ii_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_SHORT: return Get_DS_ii_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_USHORT: return Get_DS_ii_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_COLOR: return Get_DS_ii_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_INT: return Get_DS_ii_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_UINT: return Get_DS_ii_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_DATETIME: return Get_DS_ii_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_LONG: return Get_DS_ii_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_ULONG: return Get_DS_ii_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_FLOAT: return Get_DS_di_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); case TYPE_DOUBLE: return Get_DS_di_op(type_op, v1, (IValorSimpleValue*)v1.d_val, v2.s_val); default: return false; } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ //--- template static bool Get_SD_da_op(const int type_op, ValueNode& v1, IValorSimpleValue* v2) { switch(type_op) { case BINARY_NODE_OP_RESTA: v1.d_val = new CAstBynaryNodeStatic_SD_da_res(v1.s_val.double_value, v2); return true; case BINARY_NODE_OP_SUMA: v1.d_val = new CAstBynaryNodeStatic_SD_da_sum(v1.s_val.double_value, v2); return true; case BINARY_NODE_OP_DIVICION: v1.d_val = new CAstBynaryNodeStatic_SD_da_div(v1.s_val.double_value, v2); return true; case BINARY_NODE_OP_MUL: v1.d_val = new CAstBynaryNodeStatic_SD_da_mul(v1.s_val.double_value, v2); return true; } return false; } //--- template static bool Get_SD_id_op(const int type_op, ValueNode& v1, IValorSimpleValue* v2) { switch(type_op) { case BINARY_NODE_OP_RESTA: v1.d_val = new CAstBynaryNodeStatic_SD_id_res(v1.s_val.long_value, v2); return true; case BINARY_NODE_OP_SUMA: v1.d_val = new CAstBynaryNodeStatic_SD_id_sum(v1.s_val.long_value, v2); return true; case BINARY_NODE_OP_DIVICION: v1.d_val = new CAstBynaryNodeStatic_SD_id_div(v1.s_val.long_value, v2); return true; case BINARY_NODE_OP_MUL: v1.d_val = new CAstBynaryNodeStatic_SD_id_mul(v1.s_val.long_value, v2); return true; } return false; } //--- template static bool Get_SD_ii_op(const int type_op, ValueNode& v1, IValorSimpleValue* v2) { switch(type_op) { case BINARY_NODE_OP_BIT_OR: v1.d_val = new CAstBynaryNodeStatic_SD_ii_bit_or(v1.s_val.long_value, v2); return true; case BINARY_NODE_OP_BIT_XOR: v1.d_val = new CAstBynaryNodeStatic_SD_ii_bit_xor(v1.s_val.long_value, v2); return true; case BINARY_NODE_OP_BIT_AND: v1.d_val = new CAstBynaryNodeStatic_SD_ii_bit_and(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(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(v1.s_val.long_value, v2); return true; case BINARY_NODE_OP_RESTA: v1.d_val = new CAstBynaryNodeStatic_SD_ii_res(v1.s_val.long_value, v2); return true; case BINARY_NODE_OP_SUMA: v1.d_val = new CAstBynaryNodeStatic_SD_ii_sum(v1.s_val.long_value, v2); return true; case BINARY_NODE_OP_MODULO: v1.d_val = new CAstBynaryNodeStatic_SD_ii_modulo(v1.s_val.long_value, v2); return true; case BINARY_NODE_OP_DIVICION: v1.d_val = new CAstBynaryNodeStatic_SD_ii_div(v1.s_val.long_value, v2); return true; case BINARY_NODE_OP_MUL: v1.d_val = new CAstBynaryNodeStatic_SD_ii_mul(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*)v2.d_val); case TYPE_CHAR: return Get_SD_da_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_UCHAR: return Get_SD_da_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_SHORT: return Get_SD_da_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_USHORT: return Get_SD_da_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_COLOR: return Get_SD_da_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_INT: return Get_SD_da_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_UINT: return Get_SD_da_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_DATETIME: return Get_SD_da_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_LONG: return Get_SD_da_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_ULONG: return Get_SD_da_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_FLOAT: return Get_SD_da_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_DOUBLE: return Get_SD_da_op(type_op, v1, (IValorSimpleValue*)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(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_CHAR: return Get_SD_ii_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_UCHAR: return Get_SD_ii_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_SHORT: return Get_SD_ii_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_USHORT: return Get_SD_ii_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_COLOR: return Get_SD_ii_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_INT: return Get_SD_ii_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_UINT: return Get_SD_ii_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_DATETIME: return Get_SD_ii_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_LONG: return Get_SD_ii_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_ULONG: return Get_SD_ii_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_FLOAT: return Get_SD_id_op(type_op, v1, (IValorSimpleValue*)v2.d_val); case TYPE_DOUBLE: return Get_SD_id_op(type_op, v1, (IValorSimpleValue*)v2.d_val); default: return false; } } //--- template static IValorSimpleValue* CastNumeric(IValor* v) { switch(v.m_data_type) { //--- case TYPE_BOOL: return new CCastNode((IValorSimpleValue*)v); case TYPE_CHAR: return new CCastNode((IValorSimpleValue*)v); case TYPE_UCHAR: return new CCastNode((IValorSimpleValue*)v); case TYPE_SHORT: return new CCastNode((IValorSimpleValue*)v); case TYPE_USHORT: return new CCastNode((IValorSimpleValue*)v); case TYPE_COLOR: return new CCastNode((IValorSimpleValue*)v); case TYPE_INT: return new CCastNode((IValorSimpleValue*)v); case TYPE_UINT: return new CCastNode((IValorSimpleValue*)v); case TYPE_DATETIME: return new CCastNode((IValorSimpleValue*)v); case TYPE_LONG: return new CCastNode((IValorSimpleValue*)v); case TYPE_ULONG: return new CCastNode((IValorSimpleValue*)v); case TYPE_FLOAT: return new CCastNode((IValorSimpleValue*)v); case TYPE_DOUBLE: return new CCastNode((IValorSimpleValue*)v); default: return NULL; } } //--- template static bool Get_DD_ii_op(const int type_op, ValueNode& bit1, IValorSimpleValue* v1, IValorSimpleValue* v2) { switch(type_op) { case BINARY_NODE_OP_BIT_OR: bit1.d_val = new CAstBinaryOpNodeDync_NN_bit_or(v1, v2); return true; case BINARY_NODE_OP_BIT_XOR: bit1.d_val = new CAstBinaryOpNodeDync_NN_bit_xor(v1, v2); return true; case BINARY_NODE_OP_BIT_AND: bit1.d_val = new CAstBinaryOpNodeDync_NN_bit_and(v1, v2); return true; case BINARY_NODE_OP_BIT_DEZPLAZAMIENTO_DRC: bit1.d_val = new CAstBinaryOpNodeDync_NN_bit_dez_der(v1, v2); return true; case BINARY_NODE_OP_BIT_DEZPLAZAMIENTO_IZQ: bit1.d_val = new CAstBinaryOpNodeDync_NN_bit_dez_izq(v1, v2); return true; case BINARY_NODE_OP_RESTA: bit1.d_val = new CAstBinaryOpNodeDync_NN_res(v1, v2); return true; case BINARY_NODE_OP_SUMA: bit1.d_val = new CAstBinaryOpNodeDync_NN_sum(v1, v2); return true; case BINARY_NODE_OP_MODULO: bit1.d_val = new CAstBinaryOpNodeDync_NN_modulo(v1, v2); return true; case BINARY_NODE_OP_DIVICION: bit1.d_val = new CAstBinaryOpNodeDync_NN_div(v1, v2); return true; case BINARY_NODE_OP_MUL: bit1.d_val = new CAstBinaryOpNodeDync_NN_mul(v1, v2); return true; default: return false; } } //--- template static bool Get_DD_dd_op(const int type_op, ValueNode& bit1, IValorSimpleValue* v1, IValorSimpleValue* v2) { switch(type_op) { case BINARY_NODE_OP_RESTA: bit1.d_val = new CAstBinaryOpNodeDync_DD_res(v1, v2); return true; case BINARY_NODE_OP_SUMA: bit1.d_val = new CAstBinaryOpNodeDync_DD_sum(v1, v2); return true; case BINARY_NODE_OP_DIVICION: bit1.d_val = new CAstBinaryOpNodeDync_DD_div(v1, v2); return true; case BINARY_NODE_OP_MUL: bit1.d_val = new CAstBinaryOpNodeDync_DD_mul(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* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op(type_op, v1, p1, p2); } case TYPE_CHAR: { IValorSimpleValue* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op(type_op, v1, p1, p2); } case TYPE_UCHAR: { IValorSimpleValue* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op(type_op, v1, p1, p2); } case TYPE_SHORT: { IValorSimpleValue* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op(type_op, v1, p1, p2); } case TYPE_USHORT: { IValorSimpleValue* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op(type_op, v1, p1, p2); } case TYPE_COLOR: { IValorSimpleValue* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op(type_op, v1, p1, p2); } case TYPE_INT: { IValorSimpleValue* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op(type_op, v1, p1, p2); } case TYPE_UINT: { IValorSimpleValue* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op(type_op, v1, p1, p2); } case TYPE_DATETIME: { IValorSimpleValue* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op(type_op, v1, p1, p2); } case TYPE_LONG: { IValorSimpleValue* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op(type_op, v1, p1, p2); } case TYPE_ULONG: { IValorSimpleValue* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_ii_op(type_op, v1, p1, p2); } case TYPE_FLOAT: { IValorSimpleValue* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_dd_op(type_op, v1, p1, p2); } case TYPE_DOUBLE: { IValorSimpleValue* p1 = v1.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v1.d_val : CastNumeric(v1.d_val); IValorSimpleValue* p2 = v2.d_val.m_data_type == final_data_type ? (IValorSimpleValue*)v2.d_val : CastNumeric(v2.d_val); return (p1 == NULL || p2 == NULL) ? false : Get_DD_dd_op(type_op, v1, p1, p2); } default: return false; } } }; #endif // EXPRESSEVALBYLEO_SRC_MATHEVAL_NODEFACTORY