CSeq_entry_Handle CBioseq_Handle::GetComplexityLevel(CBioseq_set::EClass cls) const { const CBioseq_set_Handle::TComplexityTable& ctab = CBioseq_set_Handle::sx_GetComplexityTable(); if (cls == CBioseq_set::eClass_other) { // adjust 255 to the correct value cls = CBioseq_set::EClass(sizeof(ctab) - 1); } CSeq_entry_Handle last = GetParentEntry(); _ASSERT(last && last.IsSeq()); CSeq_entry_Handle e = last.GetParentEntry(); while ( e ) { _ASSERT(e.IsSet()); // Found good level if ( last.IsSet() && ctab[last.GetSet().GetClass()] == ctab[cls] ) break; // Gone too high if ( ctab[e.GetSet().GetClass()] > ctab[cls] ) { break; } // Go up one level last = e; e = e.GetParentEntry(); } return last; }
CSeq_entry_Handle CBioseq_Handle::GetExactComplexityLevel(CBioseq_set::EClass cls) const { CSeq_entry_Handle ret = GetComplexityLevel(cls); if ( ret && (!ret.IsSet() || !ret.GetSet().IsSetClass() || ret.GetSet().GetClass() != cls) ) { ret.Reset(); } return ret; }
CSeq_entry_CI::CSeq_entry_CI(const CSeq_entry_Handle& entry, TFlags flags, CSeq_entry::E_Choice type_filter ) : m_Flags(flags), m_Filter(type_filter) { if ( m_Flags & fIncludeGivenEntry ) { m_Current = entry; while ((*this) && !x_ValidType()) { x_Next(); } } else { if ( entry.IsSet() ) { x_Initialize( entry.GetSet() ); } } }