X-Git-Url: https://ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Fadd.cpp;h=8a7e9041fff631cfdb78d29bb833cad64e97d950;hb=7cc6f4d2cff92294f76ffb990035883e9705c82e;hp=aa8ff64f2785d40ff64e739f2562b98367d44837;hpb=857ca8ca24fbfe26d4c0c624aa6c3f2296c419f8;p=ginac.git diff --git a/ginac/add.cpp b/ginac/add.cpp index aa8ff64f..8a7e9041 100644 --- a/ginac/add.cpp +++ b/ginac/add.cpp @@ -290,21 +290,28 @@ void add::printcsrc(ostream & os, unsigned type, unsigned upper_precedence) cons bool add::info(unsigned inf) const { - // TODO: optimize - if (inf==info_flags::polynomial || - inf==info_flags::integer_polynomial || - inf==info_flags::cinteger_polynomial || - inf==info_flags::rational_polynomial || - inf==info_flags::crational_polynomial || - inf==info_flags::rational_function) { - for (epvector::const_iterator it=seq.begin(); it!=seq.end(); ++it) { - if (!(recombine_pair_to_ex(*it).info(inf))) - return false; + switch (inf) { + case info_flags::polynomial: + case info_flags::integer_polynomial: + case info_flags::cinteger_polynomial: + case info_flags::rational_polynomial: + case info_flags::crational_polynomial: + case info_flags::rational_function: { + for (epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i) { + if (!(recombine_pair_to_ex(*i).info(inf))) + return false; + } + return overall_coeff.info(inf); + } + case info_flags::algebraic: { + for (epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i) { + if ((recombine_pair_to_ex(*i).info(inf))) + return true; + } + return false; } - return overall_coeff.info(inf); - } else { - return inherited::info(inf); } + return inherited::info(inf); } int add::degree(const symbol & s) const @@ -528,12 +535,16 @@ ex add::recombine_pair_to_ex(const expair & p) const ex add::expand(unsigned options) const { + if (flags & status_flags::expanded) + return *this; + epvector * vp = expandchildren(options); if (vp==0) { return *this; } - return (new add(vp,overall_coeff))->setflag(status_flags::expanded | - status_flags::dynallocated ); + return (new add(vp,overall_coeff))-> + setflag(status_flags::expanded | + status_flags::dynallocated); } //////////