00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00029 #ifndef __vtkBoostGraphAdapter_h
00030 #define __vtkBoostGraphAdapter_h
00031
00032 #include "vtkAbstractArray.h"
00033 #include "vtkDirectedGraph.h"
00034 #include "vtkDistributedGraphHelper.h"
00035 #include "vtkDataObject.h"
00036 #include "vtkDataArray.h"
00037 #include "vtkDoubleArray.h"
00038 #include "vtkFloatArray.h"
00039 #include "vtkIdTypeArray.h"
00040 #include "vtkInformation.h"
00041 #include "vtkIntArray.h"
00042 #include "vtkMutableDirectedGraph.h"
00043 #include "vtkMutableUndirectedGraph.h"
00044 #include "vtkTree.h"
00045 #include "vtkUndirectedGraph.h"
00046 #include "vtkVariant.h"
00047
00048 #include <boost/version.hpp>
00049
00050 namespace boost {
00051
00052
00053
00054
00055
00056
00057 template<typename> struct property_traits;
00058 struct read_write_property_map_tag;
00059
00060 #define vtkPropertyMapMacro(T, V) \
00061 template <> \
00062 struct property_traits<T*> \
00063 { \
00064 typedef V value_type; \
00065 typedef V reference; \
00066 typedef vtkIdType key_type; \
00067 typedef read_write_property_map_tag category; \
00068 }; \
00069 \
00070 inline property_traits<T*>::reference \
00071 get( \
00072 T* const & arr, \
00073 property_traits<T*>::key_type key) \
00074 { \
00075 return arr->GetValue(key); \
00076 } \
00077 \
00078 inline void \
00079 put( \
00080 T* arr, \
00081 property_traits<T*>::key_type key, \
00082 const property_traits<T*>::value_type & value) \
00083 { \
00084 arr->InsertValue(key, value); \
00085 }
00086
00087 vtkPropertyMapMacro(vtkIntArray, int)
00088 vtkPropertyMapMacro(vtkIdTypeArray, vtkIdType)
00089 vtkPropertyMapMacro(vtkDoubleArray, double)
00090 vtkPropertyMapMacro(vtkFloatArray, float)
00091
00092
00093 template<>
00094 struct property_traits<vtkDataArray*>
00095 {
00096 typedef double value_type;
00097 typedef double reference;
00098 typedef vtkIdType key_type;
00099 typedef read_write_property_map_tag category;
00100 };
00101
00102 inline double
00103 get(vtkDataArray * const& arr, vtkIdType key)
00104 {
00105 return arr->GetTuple1(key);
00106 }
00107
00108 inline void
00109 put(vtkDataArray *arr, vtkIdType key, const double& value)
00110 {
00111 arr->SetTuple1(key, value);
00112 }
00113
00114
00115 template<>
00116 struct property_traits<vtkAbstractArray*>
00117 {
00118 typedef vtkVariant value_type;
00119 typedef vtkVariant reference;
00120 typedef vtkIdType key_type;
00121 typedef read_write_property_map_tag category;
00122 };
00123
00124 inline vtkVariant
00125 get(vtkAbstractArray * const& arr, vtkIdType key)
00126 {
00127 return arr->GetVariantValue(key);
00128 }
00129
00130 inline void
00131 put(vtkAbstractArray *arr, vtkIdType key, const vtkVariant& value)
00132 {
00133 arr->InsertVariantValue(key, value);
00134 }
00135 }
00136
00137 #include <vtksys/stl/utility>
00138
00139 #include <boost/config.hpp>
00140 #include <boost/iterator/iterator_facade.hpp>
00141 #include <boost/graph/graph_traits.hpp>
00142 #include <boost/graph/properties.hpp>
00143 #include <boost/graph/adjacency_iterator.hpp>
00144
00145
00146
00147
00148
00149 namespace boost {
00150
00151 class vtk_vertex_iterator :
00152 public iterator_facade<vtk_vertex_iterator,
00153 vtkIdType,
00154 bidirectional_traversal_tag,
00155 vtkIdType,
00156 vtkIdType>
00157 {
00158 public:
00159 explicit vtk_vertex_iterator(vtkIdType i = 0) : index(i) {}
00160
00161 private:
00162 vtkIdType dereference() const { return index; }
00163
00164 bool equal(const vtk_vertex_iterator& other) const
00165 { return index == other.index; }
00166
00167 void increment() { index++; }
00168 void decrement() { index--; }
00169
00170 vtkIdType index;
00171
00172 friend class iterator_core_access;
00173 };
00174
00175 class vtk_edge_iterator :
00176 public iterator_facade<vtk_edge_iterator,
00177 vtkEdgeType,
00178 forward_traversal_tag,
00179 vtkEdgeType,
00180 vtkIdType>
00181 {
00182 public:
00183 explicit vtk_edge_iterator(vtkGraph *g = 0, vtkIdType v = 0) :
00184 directed(false), vertex(v), lastVertex(v), iter(0), end(0), graph(g)
00185 {
00186 if (graph)
00187 {
00188 lastVertex = graph->GetNumberOfVertices();
00189 }
00190
00191 vtkIdType myRank = -1;
00192 vtkDistributedGraphHelper *helper
00193 = this->graph? this->graph->GetDistributedGraphHelper() : 0;
00194 if (helper)
00195 {
00196 myRank = this->graph->GetInformation()->Get(vtkDataObject::DATA_PIECE_NUMBER());
00197 vertex = helper->MakeDistributedId(myRank, vertex);
00198 lastVertex = helper->MakeDistributedId(myRank, lastVertex);
00199 }
00200
00201 if (graph != 0)
00202 {
00203 directed = (vtkDirectedGraph::SafeDownCast(graph) != 0);
00204 while (vertex < lastVertex && this->graph->GetOutDegree(vertex) == 0)
00205 {
00206 ++vertex;
00207 }
00208
00209 if (vertex < lastVertex)
00210 {
00211
00212
00213 vtkIdType nedges;
00214 graph->GetOutEdges(vertex, iter, nedges);
00215 end = iter + nedges;
00216
00217 if (!directed)
00218 {
00219 while(iter != 0
00220 && (
00221 (helper && helper->GetEdgeOwner(iter->Id) != myRank)
00222
00223 || (((helper
00224 && myRank == helper->GetVertexOwner(iter->Target))
00225 || !helper)
00226 && vertex > iter->Target)))
00227 {
00228 this->inc();
00229 }
00230 }
00231 }
00232 else
00233 {
00234 iter = 0;
00235 }
00236 }
00237 }
00238
00239 private:
00240 vtkEdgeType dereference() const
00241 { return vtkEdgeType(vertex, iter->Target, iter->Id); }
00242
00243 bool equal(const vtk_edge_iterator& other) const
00244 { return vertex == other.vertex && iter == other.iter; }
00245
00246 void increment()
00247 {
00248 inc();
00249 if (!directed)
00250 {
00251 vtkIdType myRank = -1;
00252 vtkDistributedGraphHelper *helper
00253 = this->graph? this->graph->GetDistributedGraphHelper() : 0;
00254 if (helper)
00255 {
00256 myRank = this->graph->GetInformation()->Get(vtkDataObject::DATA_PIECE_NUMBER());
00257 }
00258
00259 while (iter != 0
00260 && (
00261 (helper && helper->GetEdgeOwner(iter->Id) != myRank)
00262
00263 || (((helper
00264 && myRank == helper->GetVertexOwner(iter->Target))
00265 || !helper)
00266 && vertex > iter->Target)))
00267 {
00268 inc();
00269 }
00270 }
00271 }
00272
00273 void inc()
00274 {
00275 ++iter;
00276 if (iter == end)
00277 {
00278
00279 ++vertex;
00280 while (vertex < lastVertex && this->graph->GetOutDegree(vertex) == 0)
00281 {
00282 ++vertex;
00283 }
00284
00285 if (vertex < lastVertex)
00286 {
00287 vtkIdType nedges;
00288 graph->GetOutEdges(vertex, iter, nedges);
00289 end = iter + nedges;
00290 }
00291 else
00292 {
00293 iter = 0;
00294 }
00295 }
00296 }
00297
00298 bool directed;
00299 vtkIdType vertex;
00300 vtkIdType lastVertex;
00301 const vtkOutEdgeType * iter;
00302 const vtkOutEdgeType * end;
00303 vtkGraph *graph;
00304
00305 friend class iterator_core_access;
00306 };
00307
00308 class vtk_out_edge_pointer_iterator :
00309 public iterator_facade<vtk_out_edge_pointer_iterator,
00310 vtkEdgeType,
00311 bidirectional_traversal_tag,
00312 vtkEdgeType,
00313 ptrdiff_t>
00314 {
00315 public:
00316 explicit vtk_out_edge_pointer_iterator(vtkGraph *g = 0, vtkIdType v = 0, bool end = false) :
00317 vertex(v)
00318 {
00319 if (g)
00320 {
00321 vtkIdType nedges;
00322 g->GetOutEdges(vertex, iter, nedges);
00323 if (end)
00324 {
00325 iter += nedges;
00326 }
00327 }
00328 }
00329
00330 private:
00331 vtkEdgeType dereference() const { return vtkEdgeType(vertex, iter->Target, iter->Id); }
00332
00333 bool equal(const vtk_out_edge_pointer_iterator& other) const
00334 { return iter == other.iter; }
00335
00336 void increment() { iter++; }
00337 void decrement() { iter--; }
00338
00339 vtkIdType vertex;
00340 const vtkOutEdgeType *iter;
00341
00342 friend class iterator_core_access;
00343 };
00344
00345 class vtk_in_edge_pointer_iterator :
00346 public iterator_facade<vtk_in_edge_pointer_iterator,
00347 vtkEdgeType,
00348 bidirectional_traversal_tag,
00349 vtkEdgeType,
00350 ptrdiff_t>
00351 {
00352 public:
00353 explicit vtk_in_edge_pointer_iterator(vtkGraph *g = 0, vtkIdType v = 0, bool end = false) :
00354 vertex(v)
00355 {
00356 if (g)
00357 {
00358 vtkIdType nedges;
00359 g->GetInEdges(vertex, iter, nedges);
00360 if (end)
00361 {
00362 iter += nedges;
00363 }
00364 }
00365 }
00366
00367 private:
00368 vtkEdgeType dereference() const { return vtkEdgeType(iter->Source, vertex, iter->Id); }
00369
00370 bool equal(const vtk_in_edge_pointer_iterator& other) const
00371 { return iter == other.iter; }
00372
00373 void increment() { iter++; }
00374 void decrement() { iter--; }
00375
00376 vtkIdType vertex;
00377 const vtkInEdgeType *iter;
00378
00379 friend class iterator_core_access;
00380 };
00381
00382
00383
00384
00385
00386
00387
00388 struct vtkGraph_traversal_category :
00389 public virtual bidirectional_graph_tag,
00390 public virtual edge_list_graph_tag,
00391 public virtual vertex_list_graph_tag,
00392 public virtual adjacency_graph_tag { };
00393
00394 template <>
00395 struct graph_traits<vtkGraph*> {
00396 typedef vtkIdType vertex_descriptor;
00397 static vertex_descriptor null_vertex() { return -1; }
00398 typedef vtkEdgeType edge_descriptor;
00399 static edge_descriptor null_edge() { return vtkEdgeType(-1, -1, -1); }
00400 typedef vtk_out_edge_pointer_iterator out_edge_iterator;
00401 typedef vtk_in_edge_pointer_iterator in_edge_iterator;
00402
00403 typedef vtk_vertex_iterator vertex_iterator;
00404 typedef vtk_edge_iterator edge_iterator;
00405
00406 typedef allow_parallel_edge_tag edge_parallel_category;
00407 typedef vtkGraph_traversal_category traversal_category;
00408 typedef vtkIdType vertices_size_type;
00409 typedef vtkIdType edges_size_type;
00410 typedef vtkIdType degree_size_type;
00411
00412 typedef adjacency_iterator_generator<vtkGraph*,
00413 vertex_descriptor, out_edge_iterator>::type adjacency_iterator;
00414 };
00415
00416 #if BOOST_VERSION >= 104500
00417 template<>
00418 struct graph_property_type< vtkGraph* > {
00419 typedef no_property type;
00420 };
00421 #endif
00422
00423 template<>
00424 struct vertex_property_type< vtkGraph* > {
00425 typedef no_property type;
00426 };
00427
00428 template<>
00429 struct edge_property_type< vtkGraph* > {
00430 typedef no_property type;
00431 };
00432
00433 #if BOOST_VERSION >= 104500
00434 template<>
00435 struct graph_bundle_type< vtkGraph* > {
00436 typedef no_property type;
00437 };
00438 #endif
00439
00440 template<>
00441 struct vertex_bundle_type< vtkGraph* > {
00442 typedef no_property type;
00443 };
00444
00445 template<>
00446 struct edge_bundle_type< vtkGraph* > {
00447 typedef no_property type;
00448 };
00449
00450 inline bool has_no_edges(vtkGraph* g)
00451 {
00452 return ((g->GetNumberOfEdges() > 0) ? false : true);
00453 }
00454
00455 inline void remove_edge(graph_traits<vtkGraph*>::edge_descriptor e,
00456 vtkGraph* g)
00457 {
00458 if(vtkMutableDirectedGraph::SafeDownCast(g))
00459 {
00460 vtkMutableDirectedGraph::SafeDownCast(g)->RemoveEdge(e.Id);
00461 }
00462 else if(vtkMutableUndirectedGraph::SafeDownCast(g))
00463 {
00464 vtkMutableUndirectedGraph::SafeDownCast(g)->RemoveEdge(e.Id);
00465 }
00466 }
00467
00468
00469
00470
00471 template <>
00472 struct graph_traits<vtkDirectedGraph*> : graph_traits<vtkGraph*>
00473 {
00474 typedef directed_tag directed_category;
00475 };
00476
00477
00478 template <>
00479 struct graph_traits<const vtkDirectedGraph*> : graph_traits<vtkDirectedGraph*> { };
00480
00481
00482 template <>
00483 struct graph_traits<vtkDirectedGraph* const> : graph_traits<vtkDirectedGraph*> { };
00484
00485 #if BOOST_VERSION >= 104500
00486
00487 template<>
00488 struct graph_property_type< vtkDirectedGraph* >
00489 : graph_property_type< vtkGraph* > { };
00490
00491
00492 template<>
00493 struct graph_property_type< vtkDirectedGraph* const >
00494 : graph_property_type< vtkGraph* > { };
00495 #endif
00496
00497
00498 template<>
00499 struct vertex_property_type< vtkDirectedGraph* >
00500 : vertex_property_type< vtkGraph* > { };
00501
00502
00503 template<>
00504 struct vertex_property_type< vtkDirectedGraph* const >
00505 : vertex_property_type< vtkGraph* > { };
00506
00507
00508 template<>
00509 struct edge_property_type< vtkDirectedGraph* >
00510 : edge_property_type< vtkGraph* > { };
00511
00512
00513 template<>
00514 struct edge_property_type< vtkDirectedGraph* const >
00515 : edge_property_type< vtkGraph* > { };
00516
00517 #if BOOST_VERSION >= 104500
00518
00519 template<>
00520 struct graph_bundle_type< vtkDirectedGraph* >
00521 : graph_bundle_type< vtkGraph* > { };
00522
00523
00524 template<>
00525 struct graph_bundle_type< vtkDirectedGraph* const >
00526 : graph_bundle_type< vtkGraph* > { };
00527 #endif
00528
00529
00530 template<>
00531 struct vertex_bundle_type< vtkDirectedGraph* >
00532 : vertex_bundle_type< vtkGraph* > { };
00533
00534
00535 template<>
00536 struct vertex_bundle_type< vtkDirectedGraph* const >
00537 : vertex_bundle_type< vtkGraph* > { };
00538
00539
00540 template<>
00541 struct edge_bundle_type< vtkDirectedGraph* >
00542 : edge_bundle_type< vtkGraph* > { };
00543
00544
00545 template<>
00546 struct edge_bundle_type< vtkDirectedGraph* const >
00547 : edge_bundle_type< vtkGraph* > { };
00548
00549
00550
00551
00552 template <>
00553 struct graph_traits<vtkTree*> : graph_traits<vtkDirectedGraph*> { };
00554
00555
00556 template <>
00557 struct graph_traits<const vtkTree*> : graph_traits<vtkTree*> { };
00558
00559
00560 template <>
00561 struct graph_traits<vtkTree* const> : graph_traits<vtkTree*> { };
00562
00563
00564
00565 template <>
00566 struct graph_traits<vtkUndirectedGraph*> : graph_traits<vtkGraph*>
00567 {
00568 typedef undirected_tag directed_category;
00569 };
00570
00571
00572 template <>
00573 struct graph_traits<const vtkUndirectedGraph*> : graph_traits<vtkUndirectedGraph*> { };
00574
00575
00576 template <>
00577 struct graph_traits<vtkUndirectedGraph* const> : graph_traits<vtkUndirectedGraph*> { };
00578
00579 #if BOOST_VERSION >= 104500
00580
00581 template<>
00582 struct graph_property_type< vtkUndirectedGraph* >
00583 : graph_property_type< vtkGraph* > { };
00584
00585
00586 template<>
00587 struct graph_property_type< vtkUndirectedGraph* const >
00588 : graph_property_type< vtkGraph* > { };
00589 #endif
00590
00591
00592 template<>
00593 struct vertex_property_type< vtkUndirectedGraph* >
00594 : vertex_property_type< vtkGraph* > { };
00595
00596
00597 template<>
00598 struct vertex_property_type< vtkUndirectedGraph* const >
00599 : vertex_property_type< vtkGraph* > { };
00600
00601
00602 template<>
00603 struct edge_property_type< vtkUndirectedGraph* >
00604 : edge_property_type< vtkGraph* > { };
00605
00606
00607 template<>
00608 struct edge_property_type< vtkUndirectedGraph* const >
00609 : edge_property_type< vtkGraph* > { };
00610
00611 #if BOOST_VERSION >= 104500
00612
00613 template<>
00614 struct graph_bundle_type< vtkUndirectedGraph* >
00615 : graph_bundle_type< vtkGraph* > { };
00616
00617
00618 template<>
00619 struct graph_bundle_type< vtkUndirectedGraph* const >
00620 : graph_bundle_type< vtkGraph* > { };
00621 #endif
00622
00623
00624 template<>
00625 struct vertex_bundle_type< vtkUndirectedGraph* >
00626 : vertex_bundle_type< vtkGraph* > { };
00627
00628
00629 template<>
00630 struct vertex_bundle_type< vtkUndirectedGraph* const >
00631 : vertex_bundle_type< vtkGraph* > { };
00632
00633
00634 template<>
00635 struct edge_bundle_type< vtkUndirectedGraph* >
00636 : edge_bundle_type< vtkGraph* > { };
00637
00638
00639 template<>
00640 struct edge_bundle_type< vtkUndirectedGraph* const >
00641 : edge_bundle_type< vtkGraph* > { };
00642
00643
00644
00645
00646 template <>
00647 struct graph_traits<vtkMutableDirectedGraph*> : graph_traits<vtkDirectedGraph*> { };
00648
00649
00650 template <>
00651 struct graph_traits<const vtkMutableDirectedGraph*> : graph_traits<vtkMutableDirectedGraph*> { };
00652
00653
00654 template <>
00655 struct graph_traits<vtkMutableDirectedGraph* const> : graph_traits<vtkMutableDirectedGraph*> { };
00656
00657 #if BOOST_VERSION >= 104500
00658
00659 template<>
00660 struct graph_property_type< vtkMutableDirectedGraph* >
00661 : graph_property_type< vtkDirectedGraph* > { };
00662
00663
00664 template<>
00665 struct graph_property_type< vtkMutableDirectedGraph* const >
00666 : graph_property_type< vtkDirectedGraph* > { };
00667 #endif
00668
00669
00670 template<>
00671 struct vertex_property_type< vtkMutableDirectedGraph* >
00672 : vertex_property_type< vtkDirectedGraph* > { };
00673
00674
00675 template<>
00676 struct vertex_property_type< vtkMutableDirectedGraph* const >
00677 : vertex_property_type< vtkDirectedGraph* > { };
00678
00679
00680 template<>
00681 struct edge_property_type< vtkMutableDirectedGraph* >
00682 : edge_property_type< vtkDirectedGraph* > { };
00683
00684
00685 template<>
00686 struct edge_property_type< vtkMutableDirectedGraph* const >
00687 : edge_property_type< vtkDirectedGraph* > { };
00688
00689 #if BOOST_VERSION >= 104500
00690
00691 template<>
00692 struct graph_bundle_type< vtkMutableDirectedGraph* >
00693 : graph_bundle_type< vtkDirectedGraph* > { };
00694
00695
00696 template<>
00697 struct graph_bundle_type< vtkMutableDirectedGraph* const >
00698 : graph_bundle_type< vtkDirectedGraph* > { };
00699 #endif
00700
00701
00702 template<>
00703 struct vertex_bundle_type< vtkMutableDirectedGraph* >
00704 : vertex_bundle_type< vtkDirectedGraph* > { };
00705
00706
00707 template<>
00708 struct vertex_bundle_type< vtkMutableDirectedGraph* const >
00709 : vertex_bundle_type< vtkDirectedGraph* > { };
00710
00711
00712 template<>
00713 struct edge_bundle_type< vtkMutableDirectedGraph* >
00714 : edge_bundle_type< vtkDirectedGraph* > { };
00715
00716
00717 template<>
00718 struct edge_bundle_type< vtkMutableDirectedGraph* const >
00719 : edge_bundle_type< vtkDirectedGraph* > { };
00720
00721
00722
00723
00724 template <>
00725 struct graph_traits<vtkMutableUndirectedGraph*> : graph_traits<vtkUndirectedGraph*> { };
00726
00727
00728 template <>
00729 struct graph_traits<const vtkMutableUndirectedGraph*> : graph_traits<vtkMutableUndirectedGraph*> { };
00730
00731
00732 template <>
00733 struct graph_traits<vtkMutableUndirectedGraph* const> : graph_traits<vtkMutableUndirectedGraph*> { };
00734
00735 #if BOOST_VERSION >= 104500
00736
00737 template<>
00738 struct graph_property_type< vtkMutableUndirectedGraph* >
00739 : graph_property_type< vtkUndirectedGraph* > { };
00740
00741
00742 template<>
00743 struct graph_property_type< vtkMutableUndirectedGraph* const >
00744 : graph_property_type< vtkUndirectedGraph* > { };
00745 #endif
00746
00747
00748 template<>
00749 struct vertex_property_type< vtkMutableUndirectedGraph* >
00750 : vertex_property_type< vtkUndirectedGraph* > { };
00751
00752
00753 template<>
00754 struct vertex_property_type< vtkMutableUndirectedGraph* const >
00755 : vertex_property_type< vtkUndirectedGraph* > { };
00756
00757
00758 template<>
00759 struct edge_property_type< vtkMutableUndirectedGraph* >
00760 : edge_property_type< vtkUndirectedGraph* > { };
00761
00762
00763 template<>
00764 struct edge_property_type< vtkMutableUndirectedGraph* const >
00765 : edge_property_type< vtkUndirectedGraph* > { };
00766
00767 #if BOOST_VERSION >= 104500
00768
00769 template<>
00770 struct graph_bundle_type< vtkMutableUndirectedGraph* >
00771 : graph_bundle_type< vtkUndirectedGraph* > { };
00772
00773
00774 template<>
00775 struct graph_bundle_type< vtkMutableUndirectedGraph* const >
00776 : graph_bundle_type< vtkUndirectedGraph* > { };
00777 #endif
00778
00779
00780 template<>
00781 struct vertex_bundle_type< vtkMutableUndirectedGraph* >
00782 : vertex_bundle_type< vtkUndirectedGraph* > { };
00783
00784
00785 template<>
00786 struct vertex_bundle_type< vtkMutableUndirectedGraph* const >
00787 : vertex_bundle_type< vtkUndirectedGraph* > { };
00788
00789
00790 template<>
00791 struct edge_bundle_type< vtkMutableUndirectedGraph* >
00792 : edge_bundle_type< vtkUndirectedGraph* > { };
00793
00794
00795 template<>
00796 struct edge_bundle_type< vtkMutableUndirectedGraph* const >
00797 : edge_bundle_type< vtkUndirectedGraph* > { };
00798
00799
00800
00801 template <>
00802 class vertex_property< vtkGraph* > {
00803 public:
00804 typedef vtkIdType type;
00805 };
00806
00807 template <>
00808 class edge_property< vtkGraph* > {
00809 public:
00810 typedef vtkIdType type;
00811 };
00812 }
00813
00814 inline boost::graph_traits< vtkGraph* >::vertex_descriptor
00815 source(boost::graph_traits< vtkGraph* >::edge_descriptor e,
00816 vtkGraph *)
00817 {
00818 return e.Source;
00819 }
00820
00821 inline boost::graph_traits< vtkGraph* >::vertex_descriptor
00822 target(boost::graph_traits< vtkGraph* >::edge_descriptor e,
00823 vtkGraph *)
00824 {
00825 return e.Target;
00826 }
00827
00828 inline vtksys_stl::pair<
00829 boost::graph_traits< vtkGraph* >::vertex_iterator,
00830 boost::graph_traits< vtkGraph* >::vertex_iterator >
00831 vertices(vtkGraph *g)
00832 {
00833 typedef boost::graph_traits< vtkGraph* >::vertex_iterator Iter;
00834 vtkIdType start = 0;
00835 if (vtkDistributedGraphHelper *helper = g->GetDistributedGraphHelper())
00836 {
00837 int rank =
00838 g->GetInformation()->Get(vtkDataObject::DATA_PIECE_NUMBER());
00839 start = helper->MakeDistributedId(rank, start);
00840 }
00841
00842 return vtksys_stl::make_pair( Iter(start),
00843 Iter(start + g->GetNumberOfVertices()) );
00844 }
00845
00846 inline vtksys_stl::pair<
00847 boost::graph_traits< vtkGraph* >::edge_iterator,
00848 boost::graph_traits< vtkGraph* >::edge_iterator >
00849 edges(vtkGraph *g)
00850 {
00851 typedef boost::graph_traits< vtkGraph* >::edge_iterator Iter;
00852 return vtksys_stl::make_pair( Iter(g), Iter(g, g->GetNumberOfVertices()) );
00853 }
00854
00855 inline vtksys_stl::pair<
00856 boost::graph_traits< vtkGraph* >::out_edge_iterator,
00857 boost::graph_traits< vtkGraph* >::out_edge_iterator >
00858 out_edges(
00859 boost::graph_traits< vtkGraph* >::vertex_descriptor u,
00860 vtkGraph *g)
00861 {
00862 typedef boost::graph_traits< vtkGraph* >::out_edge_iterator Iter;
00863 vtksys_stl::pair<Iter, Iter> p = vtksys_stl::make_pair( Iter(g, u), Iter(g, u, true) );
00864 return p;
00865 }
00866
00867 inline vtksys_stl::pair<
00868 boost::graph_traits< vtkGraph* >::in_edge_iterator,
00869 boost::graph_traits< vtkGraph* >::in_edge_iterator >
00870 in_edges(
00871 boost::graph_traits< vtkGraph* >::vertex_descriptor u,
00872 vtkGraph *g)
00873 {
00874 typedef boost::graph_traits< vtkGraph* >::in_edge_iterator Iter;
00875 vtksys_stl::pair<Iter, Iter> p = vtksys_stl::make_pair( Iter(g, u), Iter(g, u, true) );
00876 return p;
00877 }
00878
00879 inline vtksys_stl::pair<
00880 boost::graph_traits< vtkGraph* >::adjacency_iterator,
00881 boost::graph_traits< vtkGraph* >::adjacency_iterator >
00882 adjacent_vertices(
00883 boost::graph_traits< vtkGraph* >::vertex_descriptor u,
00884 vtkGraph *g)
00885 {
00886 typedef boost::graph_traits< vtkGraph* >::adjacency_iterator Iter;
00887 typedef boost::graph_traits< vtkGraph* >::out_edge_iterator OutEdgeIter;
00888 vtksys_stl::pair<OutEdgeIter, OutEdgeIter> out = out_edges(u, g);
00889 return vtksys_stl::make_pair( Iter(out.first, &g), Iter(out.second, &g) );
00890 }
00891
00892 inline boost::graph_traits< vtkGraph* >::vertices_size_type
00893 num_vertices(vtkGraph *g)
00894 {
00895 return g->GetNumberOfVertices();
00896 }
00897
00898 inline boost::graph_traits< vtkGraph* >::edges_size_type
00899 num_edges(vtkGraph *g)
00900 {
00901 return g->GetNumberOfEdges();
00902 }
00903
00904 inline boost::graph_traits< vtkGraph* >::degree_size_type
00905 out_degree(
00906 boost::graph_traits< vtkGraph* >::vertex_descriptor u,
00907 vtkGraph *g)
00908 {
00909 return g->GetOutDegree(u);
00910 }
00911
00912 inline boost::graph_traits< vtkDirectedGraph* >::degree_size_type
00913 in_degree(
00914 boost::graph_traits< vtkDirectedGraph* >::vertex_descriptor u,
00915 vtkDirectedGraph *g)
00916 {
00917 return g->GetInDegree(u);
00918 }
00919
00920 inline boost::graph_traits< vtkGraph* >::degree_size_type
00921 degree(
00922 boost::graph_traits< vtkGraph* >::vertex_descriptor u,
00923 vtkGraph *g)
00924 {
00925 return g->GetDegree(u);
00926 }
00927
00928 inline boost::graph_traits< vtkMutableDirectedGraph* >::vertex_descriptor
00929 add_vertex(vtkMutableDirectedGraph *g)
00930 {
00931 return g->AddVertex();
00932 }
00933
00934 inline vtksys_stl::pair<
00935 boost::graph_traits< vtkMutableDirectedGraph* >::edge_descriptor,
00936 bool>
00937 add_edge(
00938 boost::graph_traits< vtkMutableDirectedGraph* >::vertex_descriptor u,
00939 boost::graph_traits< vtkMutableDirectedGraph* >::vertex_descriptor v,
00940 vtkMutableDirectedGraph *g)
00941 {
00942 boost::graph_traits< vtkMutableDirectedGraph* >::edge_descriptor e = g->AddEdge(u, v);
00943 return vtksys_stl::make_pair(e, true);
00944 }
00945
00946 inline boost::graph_traits< vtkMutableUndirectedGraph* >::vertex_descriptor
00947 add_vertex(vtkMutableUndirectedGraph *g)
00948 {
00949 return g->AddVertex();
00950 }
00951
00952 inline vtksys_stl::pair<
00953 boost::graph_traits< vtkMutableUndirectedGraph* >::edge_descriptor,
00954 bool>
00955 add_edge(
00956 boost::graph_traits< vtkMutableUndirectedGraph* >::vertex_descriptor u,
00957 boost::graph_traits< vtkMutableUndirectedGraph* >::vertex_descriptor v,
00958 vtkMutableUndirectedGraph *g)
00959 {
00960 boost::graph_traits< vtkMutableUndirectedGraph* >::edge_descriptor e = g->AddEdge(u, v);
00961 return vtksys_stl::make_pair(e, true);
00962 }
00963
00964 namespace boost {
00965
00966
00967
00968
00969 struct vtkGraphEdgeMap { };
00970
00971 template <>
00972 struct property_traits<vtkGraphEdgeMap>
00973 {
00974 typedef vtkIdType value_type;
00975 typedef vtkIdType reference;
00976 typedef vtkEdgeType key_type;
00977 typedef readable_property_map_tag category;
00978 };
00979
00980 inline property_traits<vtkGraphEdgeMap>::reference
00981 get(
00982 vtkGraphEdgeMap vtkNotUsed(arr),
00983 property_traits<vtkGraphEdgeMap>::key_type key)
00984 {
00985 return key.Id;
00986 }
00987
00988
00989
00990
00991
00992 template<typename PMap>
00993 class vtkGraphEdgePropertyMapHelper
00994 {
00995 public:
00996 vtkGraphEdgePropertyMapHelper(PMap m) : pmap(m) { }
00997 PMap pmap;
00998 typedef typename property_traits<PMap>::value_type value_type;
00999 typedef typename property_traits<PMap>::reference reference;
01000 typedef vtkEdgeType key_type;
01001 typedef typename property_traits<PMap>::category category;
01002 };
01003
01004 template<typename PMap>
01005 inline typename property_traits<PMap>::reference
01006 get(
01007 vtkGraphEdgePropertyMapHelper<PMap> helper,
01008 vtkEdgeType key)
01009 {
01010 return get(helper.pmap, key.Id);
01011 }
01012
01013 template<typename PMap>
01014 inline void
01015 put(
01016 vtkGraphEdgePropertyMapHelper<PMap> helper,
01017 vtkEdgeType key,
01018 const typename property_traits<PMap>::value_type & value)
01019 {
01020 put(helper.pmap, key.Id, value);
01021 }
01022
01023
01024
01025
01026
01027 struct vtkGraphIndexMap { };
01028
01029 template <>
01030 struct property_traits<vtkGraphIndexMap>
01031 {
01032 typedef vtkIdType value_type;
01033 typedef vtkIdType reference;
01034 typedef vtkIdType key_type;
01035 typedef readable_property_map_tag category;
01036 };
01037
01038 inline property_traits<vtkGraphIndexMap>::reference
01039 get(
01040 vtkGraphIndexMap vtkNotUsed(arr),
01041 property_traits<vtkGraphIndexMap>::key_type key)
01042 {
01043 return key;
01044 }
01045
01046
01047
01048
01049 template<typename PMap>
01050 class vtkGraphPropertyMapMultiplier
01051 {
01052 public:
01053 vtkGraphPropertyMapMultiplier(PMap m, float multi=1) : pmap(m),multiplier(multi){}
01054 PMap pmap;
01055 float multiplier;
01056 typedef typename property_traits<PMap>::value_type value_type;
01057 typedef typename property_traits<PMap>::reference reference;
01058 typedef typename property_traits<PMap>::key_type key_type;
01059 typedef typename property_traits<PMap>::category category;
01060 };
01061
01062 template<typename PMap>
01063 inline typename property_traits<PMap>::reference
01064 get(
01065 vtkGraphPropertyMapMultiplier<PMap> multi,
01066 const typename property_traits<PMap>::key_type key)
01067 {
01068 return multi.multiplier * get(multi.pmap, key);
01069 }
01070
01071 template<typename PMap>
01072 inline void
01073 put(
01074 vtkGraphPropertyMapMultiplier<PMap> multi,
01075 const typename property_traits<PMap>::key_type key,
01076 const typename property_traits<PMap>::value_type & value)
01077 {
01078 put(multi.pmap, key, value);
01079 }
01080
01081
01082
01083 template<>
01084 struct property_map<vtkGraph*, vertex_index_t>
01085 {
01086 typedef vtkGraphIndexMap type;
01087 typedef vtkGraphIndexMap const_type;
01088 };
01089
01090 template<>
01091 struct property_map<vtkDirectedGraph*, vertex_index_t>
01092 : property_map<vtkGraph*, vertex_index_t> { };
01093
01094 template<>
01095 struct property_map<vtkUndirectedGraph*, vertex_index_t>
01096 : property_map<vtkGraph*, vertex_index_t> { };
01097
01098 inline vtkGraphIndexMap get(vertex_index_t, vtkGraph*) { return vtkGraphIndexMap(); }
01099
01100 template<>
01101 struct property_map<vtkGraph*, edge_index_t>
01102 {
01103 typedef vtkGraphIndexMap type;
01104 typedef vtkGraphIndexMap const_type;
01105 };
01106
01107 template<>
01108 struct property_map<vtkDirectedGraph*, edge_index_t>
01109 : property_map<vtkGraph*, edge_index_t> { };
01110
01111 template<>
01112 struct property_map<vtkUndirectedGraph*, edge_index_t>
01113 : property_map<vtkGraph*, edge_index_t> { };
01114
01115 inline vtkGraphIndexMap get(edge_index_t, vtkGraph*) { return vtkGraphIndexMap(); }
01116
01117
01118 template<>
01119 struct property_map<vtkDirectedGraph* const, vertex_index_t>
01120 : property_map<vtkDirectedGraph*, vertex_index_t> { };
01121
01122 template<>
01123 struct property_map<vtkUndirectedGraph* const, vertex_index_t>
01124 : property_map<vtkUndirectedGraph*, vertex_index_t> { };
01125
01126 template<>
01127 struct property_map<vtkDirectedGraph* const, edge_index_t>
01128 : property_map<vtkDirectedGraph*, edge_index_t> { };
01129
01130 template<>
01131 struct property_map<vtkUndirectedGraph* const, edge_index_t>
01132 : property_map<vtkUndirectedGraph*, edge_index_t> { };
01133 }
01134
01135 #if BOOST_VERSION > 104000
01136 #include <boost/property_map/vector_property_map.hpp>
01137 #else
01138 #include <boost/vector_property_map.hpp>
01139 #endif
01140
01141
01142 #endif // __vtkBoostGraphAdapter_h