X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fpower.cpp;h=cbe63248afa6812b346f8c78c1c265cac73e8234;hp=e4a044cb329ddd2422df5c920fdd187abfd1c796;hb=e989719ca767691eb75b34785baaaed716ea2624;hpb=4f596b14ac1cdb03163c74e210cab493358ababf diff --git a/ginac/power.cpp b/ginac/power.cpp index e4a044cb..cbe63248 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -59,7 +59,7 @@ typedef std::vector intvector; // default constructor ////////// -power::power() : inherited(&power::tinfo_static) { } +power::power() { } ////////// // other constructors @@ -71,8 +71,9 @@ power::power() : inherited(&power::tinfo_static) { } // archiving ////////// -power::power(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst) +void power::read_archive(const archive_node &n, lst &sym_lst) { + inherited::read_archive(n, sym_lst); n.find_ex("basis", basis, sym_lst); n.find_ex("exponent", exponent, sym_lst); } @@ -84,8 +85,6 @@ void power::archive(archive_node &n) const n.add_ex("exponent", exponent); } -DEFAULT_UNARCHIVE(power) - ////////// // functions overriding virtual functions from base classes ////////// @@ -769,7 +768,7 @@ unsigned power::return_type() const return basis.return_type(); } -tinfo_t power::return_type_tinfo() const +return_type_t power::return_type_tinfo() const { return basis.return_type_tinfo(); } @@ -868,7 +867,6 @@ ex power::expand_add(const add & a, int n, unsigned options) const intvector k(m-1); intvector k_cum(m-1); // k_cum[l]:=sum(i=0,l,k[l]); intvector upper_limit(m-1); - int l; for (size_t l=0; l(b)); GINAC_ASSERT(!is_exactly_a(b) || @@ -894,7 +892,7 @@ ex power::expand_add(const add & a, int n, unsigned options) const term.push_back(power(b,k[l])); } - const ex & b = a.op(l); + const ex & b = a.op(m - 1); GINAC_ASSERT(!is_exactly_a(b)); GINAC_ASSERT(!is_exactly_a(b) || !is_exactly_a(ex_to(b).exponent) || @@ -908,7 +906,7 @@ ex power::expand_add(const add & a, int n, unsigned options) const term.push_back(power(b,n-k_cum[m-2])); numeric f = binomial(numeric(n),numeric(k[0])); - for (l=1; lsetflag(status_flags::dynallocated)).expand(options)); // increment k[] - l = m-2; - while ((l>=0) && ((++k[l])>upper_limit[l])) { + bool done = false; + std::size_t l = m - 2; + while ((++k[l]) > upper_limit[l]) { k[l] = 0; - --l; + if (l != 0) + --l; + else { + done = true; + break; + } } - if (l<0) break; + if (done) + break; // recalc k_cum[] and upper_limit[] k_cum[l] = (l==0 ? k[0] : k_cum[l-1]+k[l]); @@ -1055,4 +1060,6 @@ ex power::expand_mul(const mul & m, const numeric & n, unsigned options, bool fr return result; } +GINAC_BIND_UNARCHIVER(power); + } // namespace GiNaC