/* Given two Tokid sequences corresponding to two tokens * make these correspond to equivalence classes of same lengths. * Getting the Token constituents again will return Tokids that * satisfy the above postcondition. * The operation only modifies the underlying equivalence classes */ void Tpart::homogenize(const dequeTpart &a, const dequeTpart &b) { dequeTpart::const_iterator ai = a.begin(); dequeTpart::const_iterator bi = b.begin(); Eclass *ae = (*ai).get_tokid().get_ec(); Eclass *be = (*bi).get_tokid().get_ec(); int alen, blen; if (DP()) cout << "Homogenize a:" << a << " b: " << b << "\n"; while (ai != a.end() && bi != b.end()) { alen = ae->get_len(); blen = be->get_len(); if (DP()) cout << "alen=" << alen << " blen=" << blen << "\n"; if (blen < alen) { ae = ae->split(blen - 1); bi++; if (bi != b.end()) be = (*bi).get_tokid().get_ec(); } else if (alen < blen) { be = be->split(alen - 1); ai++; if (ai != a.end()) ae = (*ai).get_tokid().get_ec(); } else if (alen == blen) { ai++; if (ai != a.end()) ae = (*ai).get_tokid().get_ec(); bi++; if (bi != b.end()) be = (*bi).get_tokid().get_ec(); } } }
main() { Tokid a(Fileid("tokid.cpp"), 10); Tokid b(Fileid("./tokid.cpp"), 15); // Need pointer so that the delete in merge will work Eclass *e1 = new Eclass(5); e1->add_tokid(a); e1->add_tokid(b); cout << "e1:\n" << *e1; Eclass *e2 = new Eclass(5); Tokid c(Fileid("tokid.h"), 1); Tokid d(Fileid("./tokid.h"), 5); e2->add_tokid(c); e2->add_tokid(d); cout << "e2:\n" << *e2; Eclass *enew = merge(e1, e2); cout << "merged:\n" << *enew; Eclass *es = enew->split(2); cout << "split 0:\n" << *enew << "\n"; cout << "split 2:\n" << *es << "\n"; return (0); }