void merge_sub_vectors(std::vector<std::vector<T> >& dst, const std::vector<std::vector<T> >& src) { if (dst.size() < src.size()) { dst.resize(src.size()); } typename std::vector<std::vector<T> >::iterator dst_it = dst.begin(); typename std::vector<std::vector<T> >::const_iterator src_it = src.begin(); while (src_it != src.end()) { merge_vectors(*dst_it++, *src_it++); } }
/* Merges two VectorSiteContainers into a single VectorSiteContainer */ shared_ptr<VectorSiteContainer> merge_vscs(shared_ptr<VectorSiteContainer> s1, shared_ptr<VectorSiteContainer> s2) throw (AlphabetMismatchException, Exception) { if (s1->getAlphabet()->getAlphabetType() != s2->getAlphabet()->getAlphabetType()) throw AlphabetMismatchException("SiteContainerTools::merge.", s1->getAlphabet(), s2->getAlphabet()); auto alphabet = s1->getAlphabet(); const int unknown_char = alphabet->getUnknownCharacterCode(); size_t l1 = s1->getNumberOfSites(); size_t l2 = s2->getNumberOfSites(); auto n1 = s1->getSequencesNames(); auto n2 = s2->getSequencesNames(); vector<string> allnames = merge_vectors(n1, n2); unique_ptr<VectorSequenceContainer> tmp_container(new VectorSequenceContainer(alphabet)); for (auto &n : allnames) { vector<int> seqvec1; vector<int> seqvec2; seqvec1.reserve(l1+l2); seqvec2.reserve(l2); if (s1->hasSequence(n)) { auto tmpvec = s1->getSequence(n).getContent(); seqvec1.insert( seqvec1.end(), tmpvec.begin(), tmpvec.end()); } else { vector<int> tmpvec(l1, unknown_char); seqvec1.insert( seqvec1.end(), tmpvec.begin(), tmpvec.end()); } if (s2->hasSequence(n)) { auto tmpvec = s2->getSequence(n).getContent(); seqvec2.insert( seqvec2.end(), tmpvec.begin(), tmpvec.end()); } else { vector<int> tmpvec(l2, unknown_char); seqvec2.insert( seqvec2.end(), tmpvec.begin(), tmpvec.end()); } seqvec1.insert(seqvec1.end(), seqvec2.begin(), seqvec2.end()); unique_ptr<BasicSequence> seq(new BasicSequence(n, seqvec1, alphabet)); tmp_container->addSequence(*seq, false); } auto output = make_shared<VectorSiteContainer>(*tmp_container); return output; }