Example #1
0
    void mergeClusters(typename std::vector<FragT>::iterator start,
                       typename std::vector<FragT>::iterator finish) {
        // Use a lock_guard to ensure this is a locked (and exception-safe) operation
#if defined __APPLE__
        spin_lock::scoped_lock sl(clusterMutex_);
#else
        std::lock_guard<std::mutex> lock(clusterMutex_);
#endif
        size_t firstCluster, otherCluster;
        auto firstTranscriptID = start->transcriptID();
        ++start;

        for (auto it = start; it != finish; ++it) {
            firstCluster = disjointSets_.find_set(firstTranscriptID);
            otherCluster = disjointSets_.find_set(it->transcriptID());
            if (otherCluster != firstCluster)  {
                disjointSets_.link(firstCluster, otherCluster);
                auto parentClust = disjointSets_.find_set(it->transcriptID());
                auto childClust = (parentClust == firstCluster)  ? otherCluster : firstCluster;
                if (parentClust == firstCluster or parentClust == otherCluster) {
                    clusters_[parentClust].merge(clusters_[childClust]);
                    clusters_[childClust].deactivate();
                } else {
                    std::cerr << "DANGER\n";
                }
            }
        }
    }