00001 #ifndef ALREADY_dleorder
00002 #define ALREADY_dleorder
00003 template <class M> struct my_Dlex
00004 {
00005 static bool less (const M &, const M &);
00006 bool operator() (const M &, const M &) const;
00007 };
00008 template <class M>
00009 bool my_Dlex<M>::operator()(const M & m1, const M & m2) const {
00010 return less(m1,m2);
00011 }
00012
00013 template <class M>
00014 inline bool my_Dlex<M>::less(const M & m1, const M & m2){
00015 int dm1=0,dm2=0,firstdiff=0,tmpdeg1,tmpdeg2;
00016
00017 int n1 = lvar(m1.rep), n2 =lvar(m2.rep);
00018 int n = max(n1,n2);
00019 if(n1 <0 && n2>0) return false;
00020 if(n2 <0 && n1>0) return true;
00021 for(int i=0;i<=n;i++)
00022 {
00023 tmpdeg1=m1.GetDegree(i);
00024 tmpdeg2=m2.GetDegree(i);
00025 if(tmpdeg1>tmpdeg2 && firstdiff==0) firstdiff=1;
00026 if(tmpdeg2>tmpdeg1 && firstdiff==0) firstdiff=-1;
00027 dm1+=tmpdeg1;
00028 dm2+=tmpdeg2;
00029 }
00030 if (dm1 < dm2) return false;
00031 else if (dm1 > dm2) return true;
00032 return (firstdiff==1);
00033 }
00034 #endif //ALREADY_dleorder