#ifndef __FPA__BASE__REGIONGROWWITHMULTIPLECRITERIA__HXX__ #define __FPA__BASE__REGIONGROWWITHMULTIPLECRITERIA__HXX__ // ------------------------------------------------------------------------- template< class V, class R, class VV, class VC, class B > unsigned int fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >:: GetNumberOfMembershipFunctions( ) const { return( this->m_Functions.size( ) ); } // ------------------------------------------------------------------------- template< class V, class R, class VV, class VC, class B > void fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >:: ClearMembershipFunctions( ) { this->m_Functions.clear( ); this->Modified( ); } // ------------------------------------------------------------------------- template< class V, class R, class VV, class VC, class B > void fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >:: AddMembershipFunction( TMembershipFunction* function ) { this->m_Functions.push_back( function ); this->Modified( ); } // ------------------------------------------------------------------------- template< class V, class R, class VV, class VC, class B > fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >:: RegionGrowWithMultipleCriteria( ) : Superclass( ) { } // ------------------------------------------------------------------------- template< class V, class R, class VV, class VC, class B > fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >:: ~RegionGrowWithMultipleCriteria( ) { } // ------------------------------------------------------------------------- template< class V, class R, class VV, class VC, class B > void fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >:: _BeforeMainLoop( ) { this->Superclass::_BeforeMainLoop( ); this->m_ActualFunction = this->m_Functions.begin( ); } // ------------------------------------------------------------------------- template< class V, class R, class VV, class VC, class B > void fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >:: _AfterLoop( ) { this->Superclass::_AfterLoop( ); // Replace queue this->_QueueClear( ); while( !( this->m_AuxiliaryQueue.empty( ) ) ) { // Get node _TNode node = this->m_AuxiliaryQueue.front( ); this->m_AuxiliaryQueue.pop( ); this->_QueuePush( node ); // Unmark it typename _TMarks::iterator mIt = this->m_Marks.find( node.Vertex ); if( mIt != this->m_Marks.end( ) ) this->m_Marks.erase( mIt ); } // elihw // Move to next function this->m_ActualFunction++; } // ------------------------------------------------------------------------- template< class V, class R, class VV, class VC, class B > void fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >:: _Loop( ) { while( this->m_ActualFunction != this->m_Functions.end( ) ) this->Superclass::_Loop( ); } // ------------------------------------------------------------------------- template< class V, class R, class VV, class VC, class B > bool fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >:: _CheckMembership( const _TNode& n ) const { if( this->m_ActualFunction != this->m_Functions.end( ) ) { bool ret = ( *( this->m_ActualFunction ) )->Evaluate( n.Vertex ); if( !ret ) this->m_AuxiliaryQueue.push( n ); return( ret ); } else return( false ); } #endif // __FPA__BASE__REGIONGROWWITHMULTIPLECRITERIA__HXX__ // eof - $RCSfile$