virtual void VisitExpr( const SymbolicExpr& e2) { SymOpType t1 = e1.GetOpType(), t2 = e2.GetOpType(); unsigned c1 = e1.NumOfOpds(), c2 = e2.NumOfOpds(); if (t2 == SYMOP_MULTIPLY || t2 == SYMOP_PLUS ) Default0(); else if (t1 == t2) { Matrix<CompareRel> rel(c1,c2,0); ExprTermCompare(e1,e2,rel,GetFunc()); MatchCompare(rel,c2); } else if (t1 == SYMOP_MIN && t2 == SYMOP_MAX) { size_t le = 0, lt = 0, ge = 0, gt = 0; SymbolicExpr::OpdIterator p2 = e2.GetOpdIterator(); for ( ; !p2.ReachEnd(); ++p2) { CompareRel r = CompareValHelp(v1, e2.Term2Val(p2.Current()),GetFunc()); if (CountLE(r)) ++le; if (CountGE(r)) ++ge; if (CountLT(r)) ++lt; if (CountGT(r)) ++gt; } if (gt == e2.NumOfOpds()) result = REL_GT; else if (lt > 0) result = REL_LT; else if (ge == e2.NumOfOpds()) result = REL_GE; else if (le > 0) result = REL_LE; } else if (t1 == SYMOP_MAX && t2 == SYMOP_MIN) result = Reverse( SelectCompare(v2, e2, GetFunc())(v1) ); else assert(false); }