-#include "ex.h"
-
-#define RESERVE(s,size) (s).reserve(size)
-
-//////////
-// default constructor, destructor, copy constructor assignment operator and helpers
-//////////
-
-// public
-
-exprseq::exprseq() : basic(TINFO_exprseq)
-{
- debugmsg("exprseq default constructor",LOGLEVEL_CONSTRUCT);
-}
-
-exprseq::~exprseq()
-{
- debugmsg("exprseq destructor",LOGLEVEL_DESTRUCT);
- destroy(0);
-}
-
-exprseq::exprseq(exprseq const & other)
-{
- debugmsg("exprseq copy constructor",LOGLEVEL_CONSTRUCT);
- copy(other);
-}
-
-exprseq const & exprseq::operator=(exprseq const & other)
-{
- debugmsg("exprseq operator=",LOGLEVEL_ASSIGNMENT);
- if (this != &other) {
- destroy(1);
- copy(other);
- }
- return *this;
-}
-
-// protected
-
-void exprseq::copy(exprseq const & other)
-{
- basic::copy(other);
- seq=other.seq;
-}
-
-void exprseq::destroy(bool call_parent)
-{
- seq.clear();
- if (call_parent) basic::destroy(call_parent);
-}
-
-//////////
-// other constructors
-//////////
-
-// public
-
-exprseq::exprseq(exvector const & s, bool discardable) : basic(TINFO_exprseq)
-{
- debugmsg("exprseq constructor from exvector",
- LOGLEVEL_CONSTRUCT);
- if (discardable) {
- seq.swap(const_cast<exvector &>(s));
- } else {
- seq=s;
- }
-}
-
-exprseq::exprseq(exvector * vp) : basic(TINFO_exprseq)
-{
- debugmsg("exprseq constructor from exvector *",LOGLEVEL_CONSTRUCT);
- ASSERT(vp!=0);
- seq.swap(*vp);
- delete vp;
-}
-
-exprseq::exprseq(ex const & e1) : basic(TINFO_exprseq)
-{
- debugmsg("exprseq constructor from 1 ex",
- LOGLEVEL_CONSTRUCT);
- RESERVE(seq,1);
- seq.push_back(e1);
-}
-
-exprseq::exprseq(ex const & e1, ex const & e2) : basic(TINFO_exprseq)
-{
- debugmsg("exprseq constructor from 2 ex",
- LOGLEVEL_CONSTRUCT);
- RESERVE(seq,2);
- seq.push_back(e1);
- seq.push_back(e2);
-}
-
-exprseq::exprseq(ex const & e1, ex const & e2, ex const & e3)
- : basic(TINFO_exprseq)
-{
- debugmsg("exprseq constructor from 3 ex",
- LOGLEVEL_CONSTRUCT);
- RESERVE(seq,3);
- seq.push_back(e1);
- seq.push_back(e2);
- seq.push_back(e3);
-}
-
-exprseq::exprseq(ex const & e1, ex const & e2, ex const & e3,
- ex const & e4) : basic(TINFO_exprseq)
-{
- debugmsg("exprseq constructor from 4 ex",
- LOGLEVEL_CONSTRUCT);
- RESERVE(seq,4);
- seq.push_back(e1);
- seq.push_back(e2);
- seq.push_back(e3);
- seq.push_back(e4);
-}
-
-exprseq::exprseq(ex const & e1, ex const & e2, ex const & e3,
- ex const & e4, ex const & e5) : basic(TINFO_exprseq)
-{
- debugmsg("exprseq constructor from 5 ex",
- LOGLEVEL_CONSTRUCT);
- RESERVE(seq,5);
- seq.push_back(e1);
- seq.push_back(e2);
- seq.push_back(e3);
- seq.push_back(e4);
- seq.push_back(e5);
-}
-
-exprseq::exprseq(ex const & e1, ex const & e2, ex const & e3,
- ex const & e4, ex const & e5, ex const & e6)
- : basic(TINFO_exprseq)
-{
- debugmsg("exprseq constructor from 6 ex",
- LOGLEVEL_CONSTRUCT);
- RESERVE(seq,6);
- seq.push_back(e1);
- seq.push_back(e2);
- seq.push_back(e3);
- seq.push_back(e4);
- seq.push_back(e5);
- seq.push_back(e6);
-}
-
-exprseq::exprseq(ex const & e1, ex const & e2, ex const & e3,
- ex const & e4, ex const & e5, ex const & e6,
- ex const & e7) : basic(TINFO_exprseq)
-{
- debugmsg("exprseq constructor from 7 ex",
- LOGLEVEL_CONSTRUCT);
- RESERVE(seq,7);
- seq.push_back(e1);
- seq.push_back(e2);
- seq.push_back(e3);
- seq.push_back(e4);
- seq.push_back(e5);
- seq.push_back(e6);
- seq.push_back(e7);
-}
-
-exprseq::exprseq(ex const & e1, ex const & e2, ex const & e3,
- ex const & e4, ex const & e5, ex const & e6,
- ex const & e7, ex const & e8) : basic(TINFO_exprseq)
-{
- debugmsg("exprseq constructor from 8 ex",
- LOGLEVEL_CONSTRUCT);
- RESERVE(seq,8);
- seq.push_back(e1);
- seq.push_back(e2);
- seq.push_back(e3);
- seq.push_back(e4);
- seq.push_back(e5);
- seq.push_back(e6);
- seq.push_back(e7);
- seq.push_back(e8);
-}
-
-exprseq::exprseq(ex const & e1, ex const & e2, ex const & e3,
- ex const & e4, ex const & e5, ex const & e6,
- ex const & e7, ex const & e8, ex const & e9)
- : basic(TINFO_exprseq)
-{
- debugmsg("exprseq constructor from 9 ex",
- LOGLEVEL_CONSTRUCT);
- RESERVE(seq,9);
- seq.push_back(e1);
- seq.push_back(e2);
- seq.push_back(e3);
- seq.push_back(e4);
- seq.push_back(e5);
- seq.push_back(e6);
- seq.push_back(e7);
- seq.push_back(e8);
- seq.push_back(e9);
-}
-
-exprseq::exprseq(ex const & e1, ex const & e2, ex const & e3,
- ex const & e4, ex const & e5, ex const & e6,
- ex const & e7, ex const & e8, ex const & e9,
- ex const &e10)
- : basic(TINFO_exprseq)
-{
- debugmsg("exprseq constructor from 10 ex",
- LOGLEVEL_CONSTRUCT);
- RESERVE(seq,10);
- seq.push_back(e1);
- seq.push_back(e2);
- seq.push_back(e3);
- seq.push_back(e4);
- seq.push_back(e5);
- seq.push_back(e6);
- seq.push_back(e7);
- seq.push_back(e8);
- seq.push_back(e9);
- seq.push_back(e10);
-}
-
-//////////
-// functions overriding virtual functions from bases classes
-//////////
-
-// public
-
-basic * exprseq::duplicate() const
-{
- debugmsg("exprseq duplicate",LOGLEVEL_DUPLICATE);
- return new exprseq(*this);
-}
-
-void exprseq::printraw(ostream & os) const
-{
- debugmsg("exprseq printraw",LOGLEVEL_PRINT);
-
- os << "exprseq(";
- for (exvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) {
- (*cit).bp->printraw(os);
- os << ",";
- }
- os << ")";
-}
-
-void exprseq::print(ostream & os, unsigned upper_precedence) const
-{
- debugmsg("exprseq print",LOGLEVEL_PRINT);
- // always print brackets around seq, ignore upper_precedence
- printseq(os,'(',',',')',precedence,precedence+1);
-}
-
-void exprseq::printtree(ostream & os, unsigned indent) const
-{
- debugmsg("exprseq printtree",LOGLEVEL_PRINT);
-
- os << string(indent,' ') << "type=" << typeid(*this).name()
- << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
- << ", flags=" << flags
- << ", nops=" << nops() << endl;
- for (exvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) {
- (*cit).printtree(os,indent+delta_indent);
- }
- os << string(indent+delta_indent,' ') << "=====" << endl;
-}
-
-// exprseq::info() will be implemented by user elsewhere";
-
-int exprseq::nops() const
-{
- return seq.size();
-}
-
-// exprseq::let_op() will be implemented by user elsewhere
-
-ex exprseq::expand(unsigned options) const
-{
- exvector s;
- RESERVE(s,seq.size());
- for (exvector::const_iterator it=seq.begin(); it!=seq.end(); ++it) {
- s.push_back((*it).expand(options));
- }
-
- return thisexprseq(s);
-}
-
-// a exprseq 'has' an expression if it is this expression itself or a child 'has' it
-
-bool exprseq::has(ex const & other) const
-{
- ASSERT(other.bp!=0);
- if (is_equal(*other.bp)) return true;
- for (exvector::const_iterator it=seq.begin(); it!=seq.end(); ++it) {
- if ((*it).has(other)) return true;
- }
- return false;
-}
-
-ex exprseq::eval(int level) const
-{
- if (level==1) {
- return this->hold();
- }
- return thisexprseq(evalchildren(level));
-}
-
-ex exprseq::evalf(int level) const
-{
- return thisexprseq(evalfchildren(level));
-}