Exemplo n.º 1
0
ptr_base
symbolic::internal::lag(const ptr_base &p, int l)
{
    if (!l) return p;
    if (!(p->flag() & HAST)) return p;
    unsigned t = p->type();
    if (t == VART) return p.get<ex_vart>()->lag(l);
    else if (t == VARTIDX) return p.get<ex_vartidx>()->lag(l);
    else if (t == EX) return p.get<ex_e>()->lag(l);
    else if (t == ADD) {
        const num_ex_pair_vec &in = p.get<ex_add>()->get_ops();
        num_ex_pair_vec out;
        unsigned i, n = in.size();
        out.reserve(n);
        for (i = 0; i < n; ++i)
            out.push_back(std::pair<Number, ptr_base>(in[i].first,
                                                        lag(in[i].second, l)));
        return mk_add(out);
    } else if (t == MUL) {
        const num_ex_pair_vec &in = p.get<ex_mul>()->get_ops();
        num_ex_pair_vec out;
        unsigned i, n = in.size();
        out.reserve(n);
        for (i = 0; i < n; ++i)
            out.push_back(std::pair<Number, ptr_base>(in[i].first,
                                                        lag(in[i].second, l)));
        return mk_mul(out);
    } else if (t == POW) {
        const ex_pow *pt = p.get<ex_pow>();
        return mk_pow(lag(pt->get_base(), l), lag(pt->get_exp(), l));
    } else if (t == FUN) {
        const ex_func *pt = p.get<ex_func>();
        return mk_func(pt->get_code(), lag(pt->get_arg(), l));
    } else if (t == IDX) {
        const ex_idx *pt = p.get<ex_idx>();
        return ex_idx::create(pt->get_ie(), lag(pt->get_e(), l));
    } else if (t == SUM) {
        const ex_sum *pt = p.get<ex_sum>();
        return ex_sum::create(pt->get_ie(), lag(pt->get_e(), l));
    } else if (t == PROD) {
        const ex_prod *pt = p.get<ex_prod>();
        return ex_prod::create(pt->get_ie(), lag(pt->get_e(), l));
    } else INTERNAL_ERROR
}
Exemplo n.º 2
0
ex_e::ex_e(const ptr_base &e, int l)
    : ex_base(EX | HAST | (e->flag() & HASIDX)), m_arg(e), m_lag(l)
{
}
Exemplo n.º 3
0
ex_func::ex_func(func_code c, const ptr_base &arg)
    : ex_base(FUN | (arg->flag() & HAST) | (arg->flag() & HASIDX) | SINGLE),
      m_code(c), m_arg(arg)
{
}