bool SIteratorFunctions::s_ContainsType(const CConstObjectInfo& object, TTypeInfo needType) { if ( object.GetTypeInfo()->IsType(needType) ) return true; switch ( object.GetTypeFamily() ) { case eTypeFamilyClass: for ( CConstObjectInfo::CMemberIterator m(object); m; ++m ) { if ( m.GetMemberInfo()->GetTypeInfo()->MayContainType(needType) && s_ContainsType(*m, needType) ) return true; } return false; case eTypeFamilyChoice: { CConstObjectInfo::CChoiceVariant v = object.GetCurrentChoiceVariant(); return v && v.GetVariantInfo()->GetTypeInfo()->MayContainType(needType) && s_ContainsType(*v, needType); } case eTypeFamilyPointer: return s_ContainsType(object.GetPointedObject(), needType); case eTypeFamilyContainer: for ( CConstObjectInfo::CElementIterator e(object); e; ++e ) { if ( s_ContainsType(*e, needType) ) return true; } return false; default: return false; } }
bool CConstTreeLevelIterator::HaveChildren(const CConstObjectInfo& object) { if ( !object ) return false; switch ( object.GetTypeFamily() ) { case eTypeFamilyClass: case eTypeFamilyChoice: case eTypeFamilyPointer: case eTypeFamilyContainer: return true; default: return false; } }