//------------------------------------------------------------------- bool xlopers_equal(const xloper &op1, const xloper &op2) { if(op1.xltype != op2.xltype) return false; int i; switch(op1.xltype) { case xltypeNum: return op1.val.num == op2.val.num; case xltypeStr: return *op1.val.str == *op2.val.str && memcmp(op1.val.str + 1, op2.val.str + 1, *op1.val.str) == 0; case xltypeBool: return op1.val.xbool == op2.val.xbool; case xltypeRef: if(op1.val.mref.idSheet != op2.val.mref.idSheet || op1.val.mref.lpmref->count != op2.val.mref.lpmref->count) return false; return memcmp(op1.val.mref.lpmref->reftbl, op2.val.mref.lpmref->reftbl, sizeof(xlmref) * op1.val.mref.lpmref->count) == 0; case xltypeSRef: return memcmp(&(op1.val.sref.ref), &(op2.val.sref.ref), sizeof(xlref)) == 0; case xltypeMulti: if(op1.val.array.columns != op2.val.array.columns || op1.val.array.rows != op2.val.array.rows) return false; for(i = op1.val.array.columns * op1.val.array.rows; i--; ) if(!xlopers_equal(op1.val.array.lparray[i], op2.val.array.lparray[i])) return false; break; case xltypeMissing: case xltypeNil: return true; case xltypeInt: return op1.val.w == op2.val.w; case xltypeErr: return op1.val.err == op2.val.err; default: return false; // not suported by this function } return true; }
//------------------------------------------------------------------- bool cpp_xloper::operator!=(xloper *p_op) { return !xlopers_equal(m_Op, *p_op); }
//------------------------------------------------------------------- bool cpp_xloper::operator!=(cpp_xloper &cpp_op2) { return !xlopers_equal(m_Op, cpp_op2.m_Op); }