void CBaseCountItem::x_GatherInfo(CBioseqContext& ctx) { if ( ctx.IsProt() ) { x_SetSkip(); return; } CSeqVector v(ctx.GetLocation(), ctx.GetHandle().GetScope(), CBioseq_Handle::eCoding_Iupac); const size_t COUNT = kMax_UChar+1; TSeqPos counters[COUNT] = {}; // "{}" will set all counters to zero // every how many bases do we check if the flatfile generator is canceled? // (feel free to adjust this number if it makes things faster) const static TSeqPos kCancelCheckBases = 4096; CSeqVector_CI it(v, 0, CSeqVector_CI::eCaseConversion_lower); TSeqPos count = v.size(); while ( count > 0 ) { const TSeqPos uBasesToCopyRightNow = min( kCancelCheckBases, count ); ITERATE_SIMPLE(uBasesToCopyRightNow) { ++counters[*it]; ++it; } count -= uBasesToCopyRightNow; ctx.ThrowIfCanceled(); } m_A = counters[Uchar('a')]; m_C = counters[Uchar('c')]; m_G = counters[Uchar('g')]; m_T = counters[Uchar('t')]; m_Other = v.size() - m_A - m_C - m_G - m_T; }
void CBaseCountItem::x_GatherInfo(CBioseqContext& ctx) { if ( ctx.IsProt() ) { x_SetSkip(); return; } CSeqVector v(ctx.GetLocation(), ctx.GetHandle().GetScope(), CBioseq_Handle::eCoding_Iupac); const size_t COUNT = kMax_UChar+1; TSeqPos counters[COUNT]; for ( size_t i = 0; i < COUNT; ++i) { counters[i] = 0; } CSeqVector_CI it(v, 0, CSeqVector_CI::eCaseConversion_lower); for ( TSeqPos count = v.size(); count; --count, ++it ) { ++counters[*it]; } m_A = counters[Uchar('a')]; m_C = counters[Uchar('c')]; m_G = counters[Uchar('g')]; m_T = counters[Uchar('t')]; m_Other = v.size() - m_A - m_C - m_G - m_T; }