#include <algorithm>
#include <string>
#include <stdexcept>
+#include <iterator>
#include "expairseq.h"
#include "lst.h"
bool expairseq::info(unsigned inf) const
{
- if (inf == info_flags::expanded)
- return (flags & status_flags::expanded);
+ switch(inf) {
+ case info_flags::expanded:
+ return (flags & status_flags::expanded);
+ case info_flags::has_indices: {
+ if (flags & status_flags::has_indices)
+ return true;
+ else if (flags & status_flags::has_no_indices)
+ return false;
+ for (epvector::const_iterator i = seq.begin(); i != seq.end(); ++i) {
+ if (i->rest.info(info_flags::has_indices)) {
+ this->setflag(status_flags::has_indices);
+ this->clearflag(status_flags::has_no_indices);
+ return true;
+ }
+ }
+ this->clearflag(status_flags::has_indices);
+ this->setflag(status_flags::has_no_indices);
+ return false;
+ }
+ }
return inherited::info(inf);
}
evaluated = 0x0002, ///< .eval() has already done its job
expanded = 0x0004, ///< .expand(0) has already done its job (other expand() options ignore this flag)
hash_calculated = 0x0008, ///< .calchash() has already done its job
- not_shareable = 0x0010 ///< don't share instances of this object between different expressions unless explicitly asked to (used by ex::compare())
+ not_shareable = 0x0010, ///< don't share instances of this object between different expressions unless explicitly asked to (used by ex::compare())
+ has_indices = 0x0020,
+ has_no_indices = 0x0040 // ! (has_indices || has_no_indices) means "don't know"
};
};
bool idx::info(unsigned inf) const
{
- if (inf == info_flags::idx)
- return true;
+ switch(inf) {
+ case info_flags::idx:
+ case info_flags::has_indices:
+ return true;
+ }
return inherited::info(inf);
}
basis.info(inf);
case info_flags::expanded:
return (flags & status_flags::expanded);
+ case info_flags::has_indices: {
+ if (flags & status_flags::has_indices)
+ return true;
+ else if (flags & status_flags::has_no_indices)
+ return false;
+ else if (basis.info(info_flags::has_indices)) {
+ setflag(status_flags::has_indices);
+ clearflag(status_flags::has_no_indices);
+ return true;
+ } else {
+ clearflag(status_flags::has_indices);
+ setflag(status_flags::has_no_indices);
+ return false;
+ }
+ }
}
return inherited::info(inf);
}
bool symbol::info(unsigned inf) const
{
- if (inf == info_flags::symbol)
- return true;
- 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 ||
- inf == info_flags::expanded)
- return true;
- if (inf == info_flags::real)
- return domain == domain::real;
- else
- return inherited::info(inf);
+ switch (inf) {
+ case info_flags::symbol:
+ 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:
+ case info_flags::expanded:
+ return true;
+ case info_flags::has_indices:
+ return false;
+ case info_flags::real:
+ return domain == domain::real;
+ }
+ return inherited::info(inf);
}
ex symbol::eval(int level) const