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++);
    }
}
Exemple #2
0
/*
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;
}