#ifndef ___VAR_DATA_BINOP_H
#define ___VAR_DATA_BINOP_H
#define ___BIN_OP_IF0(type_a,type_b,type_A,type_B,a,b,op)\
if(a.data.type == type_a && b.data.type == type_b) {\
   ret = a.type_A op b.type_B;\
}
#define ___BIN_OP_IF(a,b,op)\
___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::INT_TYPE,data.value.ivalue,data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::FLOAT_TYPE,data.value.ivalue,data.value.gvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::LONG_TYPE,data.value.ivalue,data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::DOUBLE_TYPE,data.value.ivalue,data.value.dvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::STRING_TYPE,to_string(),data.svalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::INT_TYPE,data.value.gvalue,data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::FLOAT_TYPE,data.value.gvalue,data.value.gvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::LONG_TYPE,data.value.gvalue,data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::DOUBLE_TYPE,data.value.gvalue,data.value.dvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::STRING_TYPE,to_string(),data.svalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::INT_TYPE,data.value.lvalue,data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::FLOAT_TYPE,data.value.lvalue,data.value.gvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::LONG_TYPE,data.value.lvalue,data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::DOUBLE_TYPE,data.value.lvalue,data.value.dvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::STRING_TYPE,to_string(),data.svalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::INT_TYPE,data.value.dvalue,data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::FLOAT_TYPE,data.value.dvalue,data.value.gvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::LONG_TYPE,data.value.dvalue,data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::DOUBLE_TYPE,data.value.dvalue,data.value.dvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::STRING_TYPE,to_string(),data.svalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::INT_TYPE,data.svalue,to_string(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::FLOAT_TYPE,data.svalue,to_string(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::LONG_TYPE,data.svalue,to_string(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::DOUBLE_TYPE,data.svalue,to_string(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::STRING_TYPE,data.svalue,data.svalue,a,b,op)
#define ___ABIN_OP_IF(a,b,op)\
___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::INT_TYPE,data.value.ivalue,data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::FLOAT_TYPE,data.value.ivalue,data.value.gvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::LONG_TYPE,data.value.ivalue,data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::DOUBLE_TYPE,data.value.ivalue,data.value.dvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::STRING_TYPE,data.value.ivalue,to_double(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::INT_TYPE,data.value.gvalue,data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::FLOAT_TYPE,data.value.gvalue,data.value.gvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::LONG_TYPE,data.value.gvalue,data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::DOUBLE_TYPE,data.value.gvalue,data.value.dvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::STRING_TYPE,data.value.gvalue,to_double(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::INT_TYPE,data.value.lvalue,data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::FLOAT_TYPE,data.value.lvalue,data.value.gvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::LONG_TYPE,data.value.lvalue,data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::DOUBLE_TYPE,data.value.lvalue,data.value.dvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::STRING_TYPE,data.value.lvalue,to_double(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::INT_TYPE,data.value.dvalue,data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::FLOAT_TYPE,data.value.dvalue,data.value.gvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::LONG_TYPE,data.value.dvalue,data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::DOUBLE_TYPE,data.value.dvalue,data.value.dvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::STRING_TYPE,data.value.dvalue,to_double(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::INT_TYPE,to_double(),data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::FLOAT_TYPE,to_double(),data.value.gvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::LONG_TYPE,to_double(),data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::DOUBLE_TYPE,to_double(),data.value.dvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::STRING_TYPE,to_double(),to_double(),a,b,op)
#define ___INT_BIN_OP_IF(a,b,op)\
___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::INT_TYPE,data.value.ivalue,data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::FLOAT_TYPE,data.value.ivalue,to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::LONG_TYPE,data.value.ivalue,data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::DOUBLE_TYPE,data.value.ivalue,to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::INT_TYPE,VAR_DATA::STRING_TYPE,data.value.ivalue,to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::INT_TYPE,to_long(),data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::FLOAT_TYPE,to_long(),to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::LONG_TYPE,to_long(),data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::DOUBLE_TYPE,to_long(),to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::FLOAT_TYPE,VAR_DATA::STRING_TYPE,to_long(),to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::INT_TYPE,data.value.lvalue,data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::FLOAT_TYPE,data.value.lvalue,to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::LONG_TYPE,data.value.lvalue,data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::DOUBLE_TYPE,data.value.lvalue,to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::LONG_TYPE,VAR_DATA::STRING_TYPE,data.value.lvalue,to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::INT_TYPE,to_long(),data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::FLOAT_TYPE,to_long(),to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::LONG_TYPE,to_long(),data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::DOUBLE_TYPE,to_long(),to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::DOUBLE_TYPE,VAR_DATA::STRING_TYPE,to_long(),to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::INT_TYPE,to_long(),data.value.ivalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::FLOAT_TYPE,to_long(),to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::LONG_TYPE,to_long(),data.value.lvalue,a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::DOUBLE_TYPE,to_long(),to_long(),a,b,op)\
else ___BIN_OP_IF0(VAR_DATA::STRING_TYPE,VAR_DATA::STRING_TYPE,to_long(),to_long(),a,b,op)
#endif /*___VAR_DATA_BINOP_H*/
