From: Richard Kreckel Date: Thu, 28 Mar 2002 00:02:51 +0000 (+0000) Subject: * expairseq::expairseq(const epvector&, const ex& oc) (expairseq.cpp): X-Git-Tag: release_1-0-8~7 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=e187ba694051c0fcdb4e7aa3152a54c87c3c8e21;ds=sidebyside * expairseq::expairseq(const epvector&, const ex& oc) (expairseq.cpp): check assertion: GINAC_ASSERT(is_a(oc)). * expairseq::expairseq(epvector*, const ex& oc) (expairseq.cpp): Likewise. * expair_rest_is_less (expair.h): New functor... * expairseq::canonicalize() (expairseq.cpp): ...used here. --- diff --git a/ginac/expair.h b/ginac/expair.h index 925db972..513dd5c9 100644 --- a/ginac/expair.h +++ b/ginac/expair.h @@ -102,11 +102,19 @@ public: ex coeff; ///< second member of pair, must be numeric }; -/** Function objects for insertion into third argument of STL's sort() etc. */ +/** Function object for insertion into third argument of STL's sort() etc. */ struct expair_is_less : public std::binary_function { bool operator()(const expair &lh, const expair &rh) const { return lh.is_less(rh); } }; +/** Function object not caring about the numerical coefficients for insertion + * into third argument of STL's sort(). Note that this does not define a + * strict weak ordering since for any symbol x we have neither 3*x<2*x or + * 2*x<3*x. Handle with care! */ +struct expair_rest_is_less : public std::binary_function { + bool operator()(const expair &lh, const expair &rh) const { return (lh.rest.compare(rh.rest)<0); } +}; + struct expair_swap : public std::binary_function { void operator()(expair &lh, expair &rh) const { lh.swap(rh); } }; diff --git a/ginac/expairseq.cpp b/ginac/expairseq.cpp index 36261a98..b233fe29 100644 --- a/ginac/expairseq.cpp +++ b/ginac/expairseq.cpp @@ -126,6 +126,7 @@ expairseq::expairseq(const exvector &v) : inherited(TINFO_expairseq) expairseq::expairseq(const epvector &v, const ex &oc) : inherited(TINFO_expairseq), overall_coeff(oc) { + GINAC_ASSERT(is_a(oc)); construct_from_epvector(v); GINAC_ASSERT(is_canonical()); } @@ -134,6 +135,7 @@ expairseq::expairseq(epvector *vp, const ex &oc) : inherited(TINFO_expairseq), overall_coeff(oc) { GINAC_ASSERT(vp!=0); + GINAC_ASSERT(is_a(oc)); construct_from_epvector(*vp); delete vp; GINAC_ASSERT(is_canonical()); @@ -1057,7 +1059,7 @@ void expairseq::make_flat(const epvector &v) /** Brings this expairseq into a sorted (canonical) form. */ void expairseq::canonicalize(void) { - std::sort(seq.begin(), seq.end(), expair_is_less()); + std::sort(seq.begin(), seq.end(), expair_rest_is_less()); }