+ex pseries::real_part() const
+{
+ if(!var.info(info_flags::real))
+ return real_part_function(*this).hold();
+ ex newpoint = point.real_part();
+ if(newpoint != point)
+ return real_part_function(*this).hold();
+
+ epvector v;
+ v.reserve(seq.size());
+ for(epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i)
+ v.push_back(expair((i->rest).real_part(), i->coeff));
+ return (new pseries(var==point, v))->setflag(status_flags::dynallocated);
+}
+
+ex pseries::imag_part() const
+{
+ if(!var.info(info_flags::real))
+ return imag_part_function(*this).hold();
+ ex newpoint = point.real_part();
+ if(newpoint != point)
+ return imag_part_function(*this).hold();
+
+ epvector v;
+ v.reserve(seq.size());
+ for(epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i)
+ v.push_back(expair((i->rest).imag_part(), i->coeff));
+ return (new pseries(var==point, v))->setflag(status_flags::dynallocated);
+}
+
+ex pseries::eval_integ() const
+{
+ epvector *newseq = NULL;
+ for (epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i) {
+ if (newseq) {
+ newseq->push_back(expair(i->rest.eval_integ(), i->coeff));
+ continue;
+ }
+ ex newterm = i->rest.eval_integ();
+ if (!are_ex_trivially_equal(newterm, i->rest)) {
+ newseq = new epvector;
+ newseq->reserve(seq.size());
+ for (epvector::const_iterator j=seq.begin(); j!=i; ++j)
+ newseq->push_back(*j);
+ newseq->push_back(expair(newterm, i->coeff));
+ }
+ }
+
+ ex newpoint = point.eval_integ();
+ if (newseq || !are_ex_trivially_equal(newpoint, point))
+ return (new pseries(var==newpoint, *newseq))
+ ->setflag(status_flags::dynallocated);
+ return *this;
+}
+
+ex pseries::evalm() const
+{
+ // evalm each coefficient
+ epvector newseq;
+ bool something_changed = false;
+ for (epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i) {
+ if (something_changed) {
+ ex newcoeff = i->rest.evalm();
+ if (!newcoeff.is_zero())
+ newseq.push_back(expair(newcoeff, i->coeff));
+ }
+ else {
+ ex newcoeff = i->rest.evalm();
+ if (!are_ex_trivially_equal(newcoeff, i->rest)) {
+ something_changed = true;
+ newseq.reserve(seq.size());
+ std::copy(seq.begin(), i, std::back_inserter<epvector>(newseq));
+ if (!newcoeff.is_zero())
+ newseq.push_back(expair(newcoeff, i->coeff));
+ }
+ }
+ }
+ if (something_changed)
+ return (new pseries(var==point, newseq))->setflag(status_flags::dynallocated);
+ else
+ return *this;
+}
+