]> git.donarmstrong.com Git - bamtools.git/blobdiff - src/api/internal/BamMultiReader_p.cpp
merge conflict
[bamtools.git] / src / api / internal / BamMultiReader_p.cpp
index a5c7ca62df54b42461fe63cc6240578c08e3b676..bacc44935c37b30813409f1191235a0547e1f973 100644 (file)
@@ -370,6 +370,9 @@ bool BamMultiReaderPrivate::Open(const vector<string>& filenames) {
     // put all current readers back at beginning
     openedOk &= Rewind();
 
+    // put all current readers back at beginning (refreshes alignment cache)
+    Rewind();
+
     // iterate over filenames
     vector<string>::const_iterator filenameIter = filenames.begin();
     vector<string>::const_iterator filenameEnd  = filenames.end();
@@ -447,6 +450,7 @@ bool BamMultiReaderPrivate::OpenIndexes(const vector<string>& indexFilenames) {
     return result;
 }
 
+
 bool BamMultiReaderPrivate::PopNextCachedAlignment(BamAlignment& al, const bool needCharData) {
 
     // skip if no alignments available
@@ -476,6 +480,33 @@ bool BamMultiReaderPrivate::PopNextCachedAlignment(BamAlignment& al, const bool
     return true;
 }
 
+bool BamMultiReaderPrivate::PopNextCachedAlignment(BamAlignment& al, const bool needCharData) {
+
+    // bail out if no more data to process
+    if ( !HasAlignmentData() )
+        return false;
+
+    // pop next reader/alignment pair
+    ReaderAlignment nextReaderAlignment = m_alignments->TakeFirst();
+    BamReader*    reader    = nextReaderAlignment.first;
+    BamAlignment* alignment = nextReaderAlignment.second;
+
+    // store cached alignment into destination parameter (by copy)
+    al = *alignment;
+
+    // set char data if requested
+    if ( needCharData ) {
+        al.BuildCharData();
+        al.Filename = reader->GetFilename();
+    }
+
+    // load next alignment from reader & store in cache
+    SaveNextAlignment(reader, alignment);
+
+    // return success
+    return true;
+}
+
 // returns BAM file pointers to beginning of alignment data & resets alignment cache
 bool BamMultiReaderPrivate::Rewind(void) {