+++ /dev/null
-#ifndef __cpExtensions__DataStructures__Graph__hxx__
-#define __cpExtensions__DataStructures__Graph__hxx__
-
-// -------------------------------------------------------------------------
-template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare >
-void cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-Clear( )
-{
- this->m_Vertices.clear( );
- this->m_Matrix.clear( );
-}
-
-// -------------------------------------------------------------------------
-template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare >
-bool cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-RenameVertex( const TIndex& old_index, const TIndex& new_index )
-{
- auto old_v = this->m_Vertices.find( old_index );
- auto new_v = this->m_Vertices.find( new_index );
- if( old_v != this->m_Vertices.end( ) && new_v == this->m_Vertices.end( ) )
- {
- // Replace vertex
- this->m_Vertices[ new_index ] = old_v->second;
- this->m_Vertices.erase( old_index );
-
- // Duplicate edges
- auto mIt = this->m_Matrix.begin( );
- auto found_row = this->m_Matrix.end( );
- for( ; mIt != this->m_Matrix.end( ); ++mIt )
- {
- if( mIt->first == old_index )
- found_row = mIt;
-
- auto rIt = mIt->second.begin( );
- for( ; rIt != mIt->second.end( ); ++rIt )
- {
- if( mIt->first == old_index )
- this->m_Matrix[ new_index ][ rIt->first ] = rIt->second;
- else if( rIt->first == old_index )
- this->m_Matrix[ mIt->first ][ new_index ] = rIt->second;
-
- } // rof
-
- } // rof
-
- // Delete old edges
- if( found_row != this->m_Matrix.end( ) )
- this->m_Matrix.erase( found_row );
-
- mIt = this->m_Matrix.begin( );
- for( ; mIt != this->m_Matrix.end( ); ++mIt )
- {
- auto rIt = mIt->second.begin( );
- while( rIt != mIt->second.end( ) )
- {
- if( rIt->first == old_index )
- {
- mIt->second.erase( rIt );
- rIt = mIt->second.begin( );
- }
- else
- ++rIt;
-
- } // elihw
-
- } // rof
- return( true );
- }
- else
- return( false );
-}
-
-// -------------------------------------------------------------------------
-template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare >
-void cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-RemoveVertex( const TIndex& index )
-{
- auto i = this->m_Vertices.find( index );
- if( i != this->m_Vertices.end( ) )
- {
- // Delete vertex
- this->m_Vertices.erase( i );
-
- // Delete edges starting from given vertex
- auto mIt = this->m_Matrix.find( index );
- if( mIt != this->m_Matrix.end( ) )
- this->m_Matrix.erase( mIt );
-
- // Delete edges arriving to given vertex
- mIt = this->m_Matrix.begin( );
- for( ; mIt != this->m_Matrix.end( ); ++mIt )
- {
- auto rIt = mIt->second.begin( );
- while( rIt != mIt->second.end( ) )
- {
- if( rIt->first == index )
- {
- mIt->second.erase( rIt );
- rIt = mIt->second.begin( );
- }
- else
- ++rIt;
-
- } // elihw
-
- } // rof
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare >
-typename
-cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-TEdges&
-cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-GetEdges( const TIndex& orig, const TIndex& dest )
-{
- static TEdges null_edges;
- auto o = this->m_Matrix.find( orig );
- if( o != this->m_Matrix.find( orig ) )
- {
- auto d = o->second.find( dest );
- if( d == o->second.end( ) )
- {
- null_edges.clear( );
- return( null_edges );
- }
- else
- return( d->second );
- }
- else
- {
- null_edges.clear( );
- return( null_edges );
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare >
-const typename
-cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-TEdges&
-cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-GetEdges( const TIndex& orig, const TIndex& dest ) const
-{
- static const TEdges null_edges;
- auto o = this->m_Matrix.find( orig );
- if( o != this->m_Matrix.find( orig ) )
- {
- auto d = o->second.find( dest );
- if( d == o->second.end( ) )
- return( null_edges );
- else
- return( d->second );
- }
- else
- return( null_edges );
-}
-
-// -------------------------------------------------------------------------
-template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare >
-bool cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-HasEdge( const TIndex& orig, const TIndex& dest ) const
-{
- auto mIt = this->m_Matrix.find( orig );
- if( mIt != this->m_Matrix.end( ) )
- return( mIt->second.find( dest ) != mIt->second.end( ) );
- else
- return( false );
-}
-
-// -------------------------------------------------------------------------
-template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare >
-void cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-RemoveEdge( const TIndex& orig, const TIndex& dest, const TCost& cost )
-{
- auto m = this->m_Matrix.find( orig );
- if( m != this->m_Matrix.end( ) )
- {
- auto r = m->second.find( dest );
- if( r != m->second.end( ) )
- {
- auto e = r->second.end( );
- for(
- auto i = r->second.begin( );
- i != r->second.end( ) && e == r->second.end( );
- ++i
- )
- if( *i == cost )
- e = i;
- if( e != r->second.end( ) )
- {
- r->second.erase( e );
- if( r->second.size( ) == 0 )
- {
- m->second.erase( r );
- if( m->second.size( ) == 0 )
- this->m_Matrix.erase( m );
-
- } // fi
-
- } // fi
-
- } // fi
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare >
-void cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-RemoveEdges( const TIndex& orig, const TIndex& dest )
-{
- auto m = this->m_Matrix.find( orig );
- if( m != this->m_Matrix.end( ) )
- {
- auto r = m->second.find( dest );
- if( r != m->second.end( ) )
- {
- m->second.erase( r );
- if( m->second.size( ) == 0 )
- this->m_Matrix.erase( m );
-
- } // fi
-
- } // fi
-
-}
-
-// -------------------------------------------------------------------------
-template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare >
-std::set< _TIndex, _TIndexCompare >
-cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-GetSinks( ) const
-{
- std::set< _TIndex, _TIndexCompare > sinks;
-
- auto vIt = this->m_Vertices.begin( );
- for( ; vIt != this->m_Vertices.end( ); ++vIt )
- sinks.insert( vIt->first );
- auto mIt = this->m_Matrix.begin( );
- for( ; mIt != this->m_Matrix.end( ); ++mIt )
- sinks.erase( mIt->first );
-
- return( sinks );
-}
-
-// -------------------------------------------------------------------------
-template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare >
-cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-Graph( )
- : Superclass( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare >
-cpExtensions::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >::
-~Graph( )
-{
-}
-
-#endif // __cpExtensions__DataStructures__Graph__hxx__
-
-// eof - $RCSfile$