nothing in the API to prevent you from doing so, but the results may be
unexpected.
+ \returns \c true if merge order could be successfully applied
\sa BamMultiReader::MergeOrder, GetMergeOrder(), GetNextAlignment(), GetNextAlignmentCore()
*/
-void BamMultiReader::SetExplicitMergeOrder(BamMultiReader::MergeOrder order) {
- d->SetExplicitMergeOrder(order);
+bool BamMultiReader::SetExplicitMergeOrder(BamMultiReader::MergeOrder order) {
+ return d->SetExplicitMergeOrder(order);
}
/*! \fn bool BamMultiReader::SetRegion(const BamRegion& region)
// returns file pointers to beginning of alignments
bool Rewind(void);
// sets an explicit merge order, regardless of the BAM files' SO header tag
- void SetExplicitMergeOrder(BamMultiReader::MergeOrder order);
+ bool SetExplicitMergeOrder(BamMultiReader::MergeOrder order);
// sets the target region of interest
bool SetRegion(const BamRegion& region);
// sets the target region of interest
m_alignmentCache->Add( MergeItem(reader, alignment) );
}
-void BamMultiReaderPrivate::SetExplicitMergeOrder(BamMultiReader::MergeOrder order) {
+bool BamMultiReaderPrivate::SetExplicitMergeOrder(BamMultiReader::MergeOrder order) {
// set new merge flags
m_hasUserMergeOrder = true;
m_mergeOrder = order;
- // remove any existing merger
- if ( m_alignmentCache ) {
- m_alignmentCache->Clear();
+ // remove any existing merger (storing any existing data sitting in the cache)
+ vector<MergeItem> currentCacheData;
+ if ( m_alignmentCache ) {
+ while ( !m_alignmentCache->IsEmpty() )
+ currentCacheData.push_back( m_alignmentCache->TakeFirst() );
delete m_alignmentCache;
m_alignmentCache = 0;
}
- // update cache with new strategy
- UpdateAlignmentCache();
+ // create new cache using the new merge flags
+ m_alignmentCache = CreateAlignmentCache();
+ if ( m_alignmentCache == 0 ) {
+ SetErrorString("BamMultiReader::SetExplicitMergeOrder", "requested order is unrecognized");
+ return false;
+ }
+
+ // push current data onto new cache
+ vector<MergeItem>::const_iterator readerIter = currentCacheData.begin();
+ vector<MergeItem>::const_iterator readerEnd = currentCacheData.end();
+ for ( ; readerIter != readerEnd; ++readerIter ) {
+ const MergeItem& item = (*readerIter);
+ m_alignmentCache->Add(item);
+ }
+
+ // return success
+ return true;
}
void BamMultiReaderPrivate::SetErrorString(const string& where, const string& what) const {
bool GetNextAlignment(BamAlignment& al);
bool GetNextAlignmentCore(BamAlignment& al);
bool HasOpenReaders(void);
- void SetExplicitMergeOrder(BamMultiReader::MergeOrder order);
+ bool SetExplicitMergeOrder(BamMultiReader::MergeOrder order);
// access auxiliary data
SamHeader GetHeader(void) const;