31 #if defined(DigitalSurfaceBoostGraphInterface_RECURSES)
32 #error Recursive header files inclusion detected in DigitalSurfaceBoostGraphInterface.h
33 #else // defined(DigitalSurfaceBoostGraphInterface_RECURSES)
35 #define DigitalSurfaceBoostGraphInterface_RECURSES
37 #if !defined DigitalSurfaceBoostGraphInterface_h
39 #define DigitalSurfaceBoostGraphInterface_h
45 #include <boost/iterator/iterator_facade.hpp>
46 #include <boost/graph/graph_traits.hpp>
47 #include <boost/graph/properties.hpp>
48 #include <boost/property_map/property_map.hpp>
49 #include "DGtal/base/Common.h"
50 #include "DGtal/base/ConstAlias.h"
51 #include "DGtal/base/CountedPtr.h"
52 #include "DGtal/topology/DigitalSurface.h"
92 template <
class TDigitalSurfaceContainer >
93 struct graph_traits<
DGtal::DigitalSurface< TDigitalSurfaceContainer > >
172 class adjacency_iterator
173 :
public iterator_facade< adjacency_iterator,
175 bidirectional_traversal_tag,
181 : myIterator(), myVertices( 0 ) {}
185 : myIterator( it ), myVertices(
vertices ) {}
190 ASSERT( myIterator != myVertices->end() );
195 bool equal(
const adjacency_iterator& other)
const
197 bool thisAtEnd = ( myIterator == myVertices->end() );
198 bool otherAtEnd = ( other.myIterator == other.myVertices->end() );
199 if ( thisAtEnd || otherAtEnd )
return thisAtEnd && otherAtEnd;
200 else return *myIterator == *other.myIterator;
215 friend class iterator_core_access;
251 class out_edge_iterator
252 :
public iterator_facade< out_edge_iterator,
254 bidirectional_traversal_tag,
260 : myIterator(), myOutEdges( 0 ) {}
264 : myIterator( it ), myOutEdges(
out_edges ) {}
269 ASSERT( myIterator != myOutEdges->end() );
274 bool equal(
const out_edge_iterator & other)
const
276 bool thisAtEnd = ( myIterator == myOutEdges->end() );
277 bool otherAtEnd = ( other.myIterator == other.myOutEdges->end() );
278 if ( thisAtEnd || otherAtEnd )
return thisAtEnd && otherAtEnd;
279 else return *myIterator == *other.myIterator;
294 friend class iterator_core_access;
330 :
public iterator_facade< edge_iterator,
332 forward_traversal_tag,
337 edge_iterator( ConstAlias<Adapted> graph,
341 const Arc & dereference()
const;
342 bool equal(
const edge_iterator & other)
const;
349 friend class iterator_core_access;
375 template <
class TDigitalSurfaceContainer >
377 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::vertex_descriptor
381 return digSurf.
tail( edge );
388 template <
class TDigitalSurfaceContainer >
390 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::vertex_descriptor
394 return digSurf.
head( edge );
402 template <
class TDigitalSurfaceContainer >
404 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::vertex_iterator,
405 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::vertex_iterator
413 template <
class TDigitalSurfaceContainer >
415 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::vertices_size_type
418 return digSurf.
size();
428 template <
class TDigitalSurfaceContainer >
431 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::adjacency_iterator,
432 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::adjacency_iterator
437 typedef typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >
438 ::adjacency_iterator Iterator;
439 typedef typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >
442 std::back_insert_iterator< Container > outIt = std::back_inserter( *ptrAdjVertices );
444 return std::make_pair( Iterator( ptrAdjVertices->begin(), ptrAdjVertices ),
445 Iterator( ptrAdjVertices->end(), ptrAdjVertices ) );
457 template <
class TDigitalSurfaceContainer >
460 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::out_edge_iterator,
461 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::out_edge_iterator
466 typedef typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >
467 ::out_edge_iterator Iterator;
468 typedef typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >
471 return std::make_pair( Iterator( ptrOutEdges->begin(), ptrOutEdges ),
472 Iterator( ptrOutEdges->end(), ptrOutEdges ) );
482 template <
class TDigitalSurfaceContainer >
484 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::degree_size_type
488 return digSurf.
degree( u );
497 template <
class TDigitalSurfaceContainer >
500 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::edge_iterator,
501 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::edge_iterator
505 typedef typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::edge_iterator
507 return std::make_pair( edge_iterator( digSurf, digSurf.
begin(), digSurf.
end() ),
508 edge_iterator( digSurf, digSurf.
end(), digSurf.
end() ) );
515 template <
class TDigitalSurfaceContainer >
517 typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::edges_size_type
520 typedef typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::edge_iterator
522 typedef typename graph_traits< DGtal::DigitalSurface< TDigitalSurfaceContainer > >::edges_size_type
524 edges_size_type nbEdges = 0;
525 for ( std::pair< edge_iterator, edge_iterator > ve =
boost::edges( digSurf );
526 ve.first != ve.second; ++ve.first )
537 #include "DGtal/graph/DigitalSurfaceBoostGraphInterface.ih"
542 #endif // !defined DigitalSurfaceBoostGraphInterface_h
544 #undef DigitalSurfaceBoostGraphInterface_RECURSES
545 #endif // else defined(DigitalSurfaceBoostGraphInterface_RECURSES)