Exemplo n.º 1
0
ptr_base
symbolic::internal::add_idx(const ptr_base &p, const idx_ex &ie)
{
    if (!ie) return p;
    unsigned t = p->type();
    if (t == IDX) {
        const ex_idx *pt = p.get<ex_idx>();
        return ex_idx::create(pt->get_ie(), add_idx(pt->get_e(), ie));
//         return add_idx(pt->get_e(), ie);
    } else if (t == SYMB) {
        const ex_symb *pt = p.get<ex_symb>();
        return ex_symbidx::create(pt->m_hash, 1, ie.m_id, 0, 0, 0);
    } else if (t == SYMBIDX) {
        if (p->hasidx(ie.m_id)) return p;
        const ex_symbidx *pt = p.get<ex_symbidx>();
        unsigned no = pt->m_noid;
        int i1 = pt->m_idx1, i2 = pt->m_idx2, i3 = pt->m_idx3, i4 = pt->m_idx4;
        switch (no) {
            case 1: i2 = ie.m_id; break;
            case 2: i3 = ie.m_id; break;
            case 3: i4 = ie.m_id; break;
            default: INTERNAL_ERROR
        }
        return ex_symbidx::create(pt->m_hash, no + 1, i1, i2, i3, i4);
    } else if (t == VART) {
Exemplo n.º 2
0
ptr_base
ex_idx::create(const idx_ex &ie, const ptr_base &e)
{
    if (!ie) return e;
    if (!e->hasidx(ie.m_id)) return e;
    if (e->type() == IDX) {
        if (e.get<ex_idx>()->has_ie(ie)) return e;
    }
    return ptr_base(new ex_idx(ie, e));
}