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) {
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)); }