void CSeqVector_CI::GetSeqData(string& buffer, TSeqPos count) { buffer.erase(); TSeqPos pos = GetPos(); _ASSERT(pos <= x_GetSize()); count = min(count, x_GetSize() - pos); if ( !count ) { return; } if ( m_TSE && !CanGetRange(pos, pos+count) ) { NCBI_THROW_FMT(CSeqVectorException, eDataError, "CSeqVector_CI::GetSeqData: " "cannot get seq-data in range: " <<pos<<"-"<<pos+count); } buffer.reserve(count); while ( count ) { TCache_I cache = m_Cache; TCache_I cache_end = m_CacheEnd; TSeqPos chunk_count = min(count, TSeqPos(cache_end - cache)); _ASSERT(chunk_count > 0); TCache_I chunk_end = cache + chunk_count; buffer.append(cache, chunk_end); count -= chunk_count; //if ( count == 0 ) break; if ( chunk_end == cache_end ) { x_NextCacheSeg(); } else { m_Cache = chunk_end; } } }
void CSeqVector_CI::x_CheckForward(void) { TSeqPos scanned = m_ScannedEnd - m_ScannedStart; TSeqPos more = x_GetSize() - m_ScannedEnd; TSeqPos check = min(min(scanned, more), kMaxPreloadBases); if ( check > 0 ) { CanGetRange(m_ScannedEnd, m_ScannedEnd+check); } }
void CSeqVector_CI::x_CheckBackward(void) { TSeqPos scanned = m_ScannedEnd - m_ScannedStart; TSeqPos more = m_ScannedStart; TSeqPos check = min(min(scanned, more), kMaxPreloadBases); if ( check > 0 ) { CanGetRange(m_ScannedStart-check, m_ScannedStart); } }
void CSeqVector::GetPackedSeqData(string& dst_str, TSeqPos src_pos, TSeqPos src_end) { dst_str.erase(); src_end = min(src_end, size()); if ( src_pos >= src_end ) { return; } if ( m_TSE && !CanGetRange(src_pos, src_end) ) { NCBI_THROW_FMT(CSeqVectorException, eDataError, "CSeqVector::GetPackedSeqData: " "cannot get seq-data in range: " <<src_pos<<"-"<<src_end); } TCoding dst_coding = GetCoding(); switch ( dst_coding ) { case CSeq_data::e_Iupacna: case CSeq_data::e_Ncbi8na: case CSeq_data::e_Iupacaa: case CSeq_data::e_Ncbieaa: case CSeq_data::e_Ncbi8aa: case CSeq_data::e_Ncbistdaa: x_GetPacked8SeqData(dst_str, src_pos, src_end); break; case CSeq_data::e_Ncbi4na: x_GetPacked4naSeqData(dst_str, src_pos, src_end); break; case CSeq_data::e_Ncbi2na: x_GetPacked2naSeqData(dst_str, src_pos, src_end); break; default: NCBI_THROW_FMT(CSeqVectorException, eCodingError, "Can not pack data using the selected coding: "<< GetCoding()); } }