leda_graph.hpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950
  1. //=======================================================================
  2. // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
  3. // Copyright 2004 The Trustees of Indiana University.
  4. // Copyright 2007 University of Karlsruhe
  5. // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek, Douglas Gregor,
  6. // Jens Mueller
  7. //
  8. // Distributed under the Boost Software License, Version 1.0. (See
  9. // accompanying file LICENSE_1_0.txt or copy at
  10. // http://www.boost.org/LICENSE_1_0.txt)
  11. //=======================================================================
  12. #ifndef BOOST_GRAPH_LEDA_HPP
  13. #define BOOST_GRAPH_LEDA_HPP
  14. #include <boost/config.hpp>
  15. #include <boost/iterator/iterator_facade.hpp>
  16. #include <boost/graph/graph_traits.hpp>
  17. #include <boost/graph/properties.hpp>
  18. #include <LEDA/graph/graph.h>
  19. #include <LEDA/graph/node_array.h>
  20. #include <LEDA/graph/node_map.h>
  21. // The functions and classes in this file allows the user to
  22. // treat a LEDA GRAPH object as a boost graph "as is". No
  23. // wrapper is needed for the GRAPH object.
  24. // Warning: this implementation relies on partial specialization
  25. // for the graph_traits class (so it won't compile with Visual C++)
  26. // Warning: this implementation is in alpha and has not been tested
  27. namespace boost {
  28. struct leda_graph_traversal_category :
  29. public virtual bidirectional_graph_tag,
  30. public virtual adjacency_graph_tag,
  31. public virtual vertex_list_graph_tag { };
  32. template <class vtype, class etype>
  33. struct graph_traits< leda::GRAPH<vtype,etype> > {
  34. typedef leda::node vertex_descriptor;
  35. typedef leda::edge edge_descriptor;
  36. class adjacency_iterator
  37. : public iterator_facade<adjacency_iterator,
  38. leda::node,
  39. bidirectional_traversal_tag,
  40. leda::node,
  41. const leda::node*>
  42. {
  43. public:
  44. adjacency_iterator(leda::node node = 0,
  45. const leda::GRAPH<vtype, etype>* g = 0)
  46. : base(node), g(g) {}
  47. private:
  48. leda::node dereference() const { return leda::target(base); }
  49. bool equal(const adjacency_iterator& other) const
  50. { return base == other.base; }
  51. void increment() { base = g->adj_succ(base); }
  52. void decrement() { base = g->adj_pred(base); }
  53. leda::edge base;
  54. const leda::GRAPH<vtype, etype>* g;
  55. friend class iterator_core_access;
  56. };
  57. class out_edge_iterator
  58. : public iterator_facade<out_edge_iterator,
  59. leda::edge,
  60. bidirectional_traversal_tag,
  61. const leda::edge&,
  62. const leda::edge*>
  63. {
  64. public:
  65. out_edge_iterator(leda::node node = 0,
  66. const leda::GRAPH<vtype, etype>* g = 0)
  67. : base(node), g(g) {}
  68. private:
  69. const leda::edge& dereference() const { return base; }
  70. bool equal(const out_edge_iterator& other) const
  71. { return base == other.base; }
  72. void increment() { base = g->adj_succ(base); }
  73. void decrement() { base = g->adj_pred(base); }
  74. leda::edge base;
  75. const leda::GRAPH<vtype, etype>* g;
  76. friend class iterator_core_access;
  77. };
  78. class in_edge_iterator
  79. : public iterator_facade<in_edge_iterator,
  80. leda::edge,
  81. bidirectional_traversal_tag,
  82. const leda::edge&,
  83. const leda::edge*>
  84. {
  85. public:
  86. in_edge_iterator(leda::node node = 0,
  87. const leda::GRAPH<vtype, etype>* g = 0)
  88. : base(node), g(g) {}
  89. private:
  90. const leda::edge& dereference() const { return base; }
  91. bool equal(const in_edge_iterator& other) const
  92. { return base == other.base; }
  93. void increment() { base = g->in_succ(base); }
  94. void decrement() { base = g->in_pred(base); }
  95. leda::edge base;
  96. const leda::GRAPH<vtype, etype>* g;
  97. friend class iterator_core_access;
  98. };
  99. class vertex_iterator
  100. : public iterator_facade<vertex_iterator,
  101. leda::node,
  102. bidirectional_traversal_tag,
  103. const leda::node&,
  104. const leda::node*>
  105. {
  106. public:
  107. vertex_iterator(leda::node node = 0,
  108. const leda::GRAPH<vtype, etype>* g = 0)
  109. : base(node), g(g) {}
  110. private:
  111. const leda::node& dereference() const { return base; }
  112. bool equal(const vertex_iterator& other) const
  113. { return base == other.base; }
  114. void increment() { base = g->succ_node(base); }
  115. void decrement() { base = g->pred_node(base); }
  116. leda::node base;
  117. const leda::GRAPH<vtype, etype>* g;
  118. friend class iterator_core_access;
  119. };
  120. class edge_iterator
  121. : public iterator_facade<edge_iterator,
  122. leda::edge,
  123. bidirectional_traversal_tag,
  124. const leda::edge&,
  125. const leda::edge*>
  126. {
  127. public:
  128. edge_iterator(leda::edge edge = 0,
  129. const leda::GRAPH<vtype, etype>* g = 0)
  130. : base(edge), g(g) {}
  131. private:
  132. const leda::edge& dereference() const { return base; }
  133. bool equal(const edge_iterator& other) const
  134. { return base == other.base; }
  135. void increment() { base = g->succ_edge(base); }
  136. void decrement() { base = g->pred_edge(base); }
  137. leda::node base;
  138. const leda::GRAPH<vtype, etype>* g;
  139. friend class iterator_core_access;
  140. };
  141. typedef directed_tag directed_category;
  142. typedef allow_parallel_edge_tag edge_parallel_category; // not sure here
  143. typedef leda_graph_traversal_category traversal_category;
  144. typedef int vertices_size_type;
  145. typedef int edges_size_type;
  146. typedef int degree_size_type;
  147. };
  148. template<>
  149. struct graph_traits<leda::graph> {
  150. typedef leda::node vertex_descriptor;
  151. typedef leda::edge edge_descriptor;
  152. class adjacency_iterator
  153. : public iterator_facade<adjacency_iterator,
  154. leda::node,
  155. bidirectional_traversal_tag,
  156. leda::node,
  157. const leda::node*>
  158. {
  159. public:
  160. adjacency_iterator(leda::edge edge = 0,
  161. const leda::graph* g = 0)
  162. : base(edge), g(g) {}
  163. private:
  164. leda::node dereference() const { return leda::target(base); }
  165. bool equal(const adjacency_iterator& other) const
  166. { return base == other.base; }
  167. void increment() { base = g->adj_succ(base); }
  168. void decrement() { base = g->adj_pred(base); }
  169. leda::edge base;
  170. const leda::graph* g;
  171. friend class iterator_core_access;
  172. };
  173. class out_edge_iterator
  174. : public iterator_facade<out_edge_iterator,
  175. leda::edge,
  176. bidirectional_traversal_tag,
  177. const leda::edge&,
  178. const leda::edge*>
  179. {
  180. public:
  181. out_edge_iterator(leda::edge edge = 0,
  182. const leda::graph* g = 0)
  183. : base(edge), g(g) {}
  184. private:
  185. const leda::edge& dereference() const { return base; }
  186. bool equal(const out_edge_iterator& other) const
  187. { return base == other.base; }
  188. void increment() { base = g->adj_succ(base); }
  189. void decrement() { base = g->adj_pred(base); }
  190. leda::edge base;
  191. const leda::graph* g;
  192. friend class iterator_core_access;
  193. };
  194. class in_edge_iterator
  195. : public iterator_facade<in_edge_iterator,
  196. leda::edge,
  197. bidirectional_traversal_tag,
  198. const leda::edge&,
  199. const leda::edge*>
  200. {
  201. public:
  202. in_edge_iterator(leda::edge edge = 0,
  203. const leda::graph* g = 0)
  204. : base(edge), g(g) {}
  205. private:
  206. const leda::edge& dereference() const { return base; }
  207. bool equal(const in_edge_iterator& other) const
  208. { return base == other.base; }
  209. void increment() { base = g->in_succ(base); }
  210. void decrement() { base = g->in_pred(base); }
  211. leda::edge base;
  212. const leda::graph* g;
  213. friend class iterator_core_access;
  214. };
  215. class vertex_iterator
  216. : public iterator_facade<vertex_iterator,
  217. leda::node,
  218. bidirectional_traversal_tag,
  219. const leda::node&,
  220. const leda::node*>
  221. {
  222. public:
  223. vertex_iterator(leda::node node = 0,
  224. const leda::graph* g = 0)
  225. : base(node), g(g) {}
  226. private:
  227. const leda::node& dereference() const { return base; }
  228. bool equal(const vertex_iterator& other) const
  229. { return base == other.base; }
  230. void increment() { base = g->succ_node(base); }
  231. void decrement() { base = g->pred_node(base); }
  232. leda::node base;
  233. const leda::graph* g;
  234. friend class iterator_core_access;
  235. };
  236. class edge_iterator
  237. : public iterator_facade<edge_iterator,
  238. leda::edge,
  239. bidirectional_traversal_tag,
  240. const leda::edge&,
  241. const leda::edge*>
  242. {
  243. public:
  244. edge_iterator(leda::edge edge = 0,
  245. const leda::graph* g = 0)
  246. : base(edge), g(g) {}
  247. private:
  248. const leda::edge& dereference() const { return base; }
  249. bool equal(const edge_iterator& other) const
  250. { return base == other.base; }
  251. void increment() { base = g->succ_edge(base); }
  252. void decrement() { base = g->pred_edge(base); }
  253. leda::edge base;
  254. const leda::graph* g;
  255. friend class iterator_core_access;
  256. };
  257. typedef directed_tag directed_category;
  258. typedef allow_parallel_edge_tag edge_parallel_category; // not sure here
  259. typedef leda_graph_traversal_category traversal_category;
  260. typedef int vertices_size_type;
  261. typedef int edges_size_type;
  262. typedef int degree_size_type;
  263. };
  264. } // namespace boost
  265. namespace boost {
  266. //===========================================================================
  267. // functions for GRAPH<vtype,etype>
  268. template <class vtype, class etype>
  269. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor
  270. source(typename graph_traits< leda::GRAPH<vtype,etype> >::edge_descriptor e,
  271. const leda::GRAPH<vtype,etype>& g)
  272. {
  273. return source(e);
  274. }
  275. template <class vtype, class etype>
  276. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor
  277. target(typename graph_traits< leda::GRAPH<vtype,etype> >::edge_descriptor e,
  278. const leda::GRAPH<vtype,etype>& g)
  279. {
  280. return target(e);
  281. }
  282. template <class vtype, class etype>
  283. inline std::pair<
  284. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_iterator,
  285. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_iterator >
  286. vertices(const leda::GRAPH<vtype,etype>& g)
  287. {
  288. typedef typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_iterator
  289. Iter;
  290. return std::make_pair( Iter(g.first_node(),&g), Iter(0,&g) );
  291. }
  292. template <class vtype, class etype>
  293. inline std::pair<
  294. typename graph_traits< leda::GRAPH<vtype,etype> >::edge_iterator,
  295. typename graph_traits< leda::GRAPH<vtype,etype> >::edge_iterator >
  296. edges(const leda::GRAPH<vtype,etype>& g)
  297. {
  298. typedef typename graph_traits< leda::GRAPH<vtype,etype> >::edge_iterator
  299. Iter;
  300. return std::make_pair( Iter(g.first_edge(),&g), Iter(0,&g) );
  301. }
  302. template <class vtype, class etype>
  303. inline std::pair<
  304. typename graph_traits< leda::GRAPH<vtype,etype> >::out_edge_iterator,
  305. typename graph_traits< leda::GRAPH<vtype,etype> >::out_edge_iterator >
  306. out_edges(
  307. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
  308. const leda::GRAPH<vtype,etype>& g)
  309. {
  310. typedef typename graph_traits< leda::GRAPH<vtype,etype> >
  311. ::out_edge_iterator Iter;
  312. return std::make_pair( Iter(g.first_adj_edge(u,0),&g), Iter(0,&g) );
  313. }
  314. template <class vtype, class etype>
  315. inline std::pair<
  316. typename graph_traits< leda::GRAPH<vtype,etype> >::in_edge_iterator,
  317. typename graph_traits< leda::GRAPH<vtype,etype> >::in_edge_iterator >
  318. in_edges(
  319. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
  320. const leda::GRAPH<vtype,etype>& g)
  321. {
  322. typedef typename graph_traits< leda::GRAPH<vtype,etype> >
  323. ::in_edge_iterator Iter;
  324. return std::make_pair( Iter(g.first_adj_edge(u,1),&g), Iter(0,&g) );
  325. }
  326. template <class vtype, class etype>
  327. inline std::pair<
  328. typename graph_traits< leda::GRAPH<vtype,etype> >::adjacency_iterator,
  329. typename graph_traits< leda::GRAPH<vtype,etype> >::adjacency_iterator >
  330. adjacent_vertices(
  331. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
  332. const leda::GRAPH<vtype,etype>& g)
  333. {
  334. typedef typename graph_traits< leda::GRAPH<vtype,etype> >
  335. ::adjacency_iterator Iter;
  336. return std::make_pair( Iter(g.first_adj_edge(u,0),&g), Iter(0,&g) );
  337. }
  338. template <class vtype, class etype>
  339. typename graph_traits< leda::GRAPH<vtype,etype> >::vertices_size_type
  340. num_vertices(const leda::GRAPH<vtype,etype>& g)
  341. {
  342. return g.number_of_nodes();
  343. }
  344. template <class vtype, class etype>
  345. typename graph_traits< leda::GRAPH<vtype,etype> >::edges_size_type
  346. num_edges(const leda::GRAPH<vtype,etype>& g)
  347. {
  348. return g.number_of_edges();
  349. }
  350. template <class vtype, class etype>
  351. typename graph_traits< leda::GRAPH<vtype,etype> >::degree_size_type
  352. out_degree(
  353. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
  354. const leda::GRAPH<vtype,etype>& g)
  355. {
  356. return g.outdeg(u);
  357. }
  358. template <class vtype, class etype>
  359. typename graph_traits< leda::GRAPH<vtype,etype> >::degree_size_type
  360. in_degree(
  361. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
  362. const leda::GRAPH<vtype,etype>& g)
  363. {
  364. return g.indeg(u);
  365. }
  366. template <class vtype, class etype>
  367. typename graph_traits< leda::GRAPH<vtype,etype> >::degree_size_type
  368. degree(
  369. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
  370. const leda::GRAPH<vtype,etype>& g)
  371. {
  372. return g.outdeg(u) + g.indeg(u);
  373. }
  374. template <class vtype, class etype>
  375. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor
  376. add_vertex(leda::GRAPH<vtype,etype>& g)
  377. {
  378. return g.new_node();
  379. }
  380. template <class vtype, class etype>
  381. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor
  382. add_vertex(const vtype& vp, leda::GRAPH<vtype,etype>& g)
  383. {
  384. return g.new_node(vp);
  385. }
  386. template <class vtype, class etype>
  387. void clear_vertex(
  388. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
  389. leda::GRAPH<vtype,etype>& g)
  390. {
  391. typename graph_traits< leda::GRAPH<vtype,etype> >::out_edge_iterator ei, ei_end;
  392. for (boost::tie(ei, ei_end)=out_edges(u,g); ei!=ei_end; ei++)
  393. remove_edge(*ei);
  394. typename graph_traits< leda::GRAPH<vtype,etype> >::in_edge_iterator iei, iei_end;
  395. for (boost::tie(iei, iei_end)=in_edges(u,g); iei!=iei_end; iei++)
  396. remove_edge(*iei);
  397. }
  398. template <class vtype, class etype>
  399. void remove_vertex(
  400. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
  401. leda::GRAPH<vtype,etype>& g)
  402. {
  403. g.del_node(u);
  404. }
  405. template <class vtype, class etype>
  406. std::pair<
  407. typename graph_traits< leda::GRAPH<vtype,etype> >::edge_descriptor,
  408. bool>
  409. add_edge(
  410. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
  411. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor v,
  412. leda::GRAPH<vtype,etype>& g)
  413. {
  414. return std::make_pair(g.new_edge(u, v), true);
  415. }
  416. template <class vtype, class etype>
  417. std::pair<
  418. typename graph_traits< leda::GRAPH<vtype,etype> >::edge_descriptor,
  419. bool>
  420. add_edge(
  421. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
  422. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor v,
  423. const etype& et,
  424. leda::GRAPH<vtype,etype>& g)
  425. {
  426. return std::make_pair(g.new_edge(u, v, et), true);
  427. }
  428. template <class vtype, class etype>
  429. void
  430. remove_edge(
  431. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
  432. typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor v,
  433. leda::GRAPH<vtype,etype>& g)
  434. {
  435. typename graph_traits< leda::GRAPH<vtype,etype> >::out_edge_iterator
  436. i,iend;
  437. for (boost::tie(i,iend) = out_edges(u,g); i != iend; ++i)
  438. if (target(*i,g) == v)
  439. g.del_edge(*i);
  440. }
  441. template <class vtype, class etype>
  442. void
  443. remove_edge(
  444. typename graph_traits< leda::GRAPH<vtype,etype> >::edge_descriptor e,
  445. leda::GRAPH<vtype,etype>& g)
  446. {
  447. g.del_edge(e);
  448. }
  449. //===========================================================================
  450. // functions for graph (non-templated version)
  451. graph_traits<leda::graph>::vertex_descriptor
  452. source(graph_traits<leda::graph>::edge_descriptor e,
  453. const leda::graph& g)
  454. {
  455. return source(e);
  456. }
  457. graph_traits<leda::graph>::vertex_descriptor
  458. target(graph_traits<leda::graph>::edge_descriptor e,
  459. const leda::graph& g)
  460. {
  461. return target(e);
  462. }
  463. inline std::pair<
  464. graph_traits<leda::graph>::vertex_iterator,
  465. graph_traits<leda::graph>::vertex_iterator >
  466. vertices(const leda::graph& g)
  467. {
  468. typedef graph_traits<leda::graph>::vertex_iterator
  469. Iter;
  470. return std::make_pair( Iter(g.first_node(),&g), Iter(0,&g) );
  471. }
  472. inline std::pair<
  473. graph_traits<leda::graph>::edge_iterator,
  474. graph_traits<leda::graph>::edge_iterator >
  475. edges(const leda::graph& g)
  476. {
  477. typedef graph_traits<leda::graph>::edge_iterator
  478. Iter;
  479. return std::make_pair( Iter(g.first_edge(),&g), Iter(0,&g) );
  480. }
  481. inline std::pair<
  482. graph_traits<leda::graph>::out_edge_iterator,
  483. graph_traits<leda::graph>::out_edge_iterator >
  484. out_edges(
  485. graph_traits<leda::graph>::vertex_descriptor u, const leda::graph& g)
  486. {
  487. typedef graph_traits<leda::graph>::out_edge_iterator Iter;
  488. return std::make_pair( Iter(g.first_adj_edge(u),&g), Iter(0,&g) );
  489. }
  490. inline std::pair<
  491. graph_traits<leda::graph>::in_edge_iterator,
  492. graph_traits<leda::graph>::in_edge_iterator >
  493. in_edges(
  494. graph_traits<leda::graph>::vertex_descriptor u,
  495. const leda::graph& g)
  496. {
  497. typedef graph_traits<leda::graph>
  498. ::in_edge_iterator Iter;
  499. return std::make_pair( Iter(g.first_in_edge(u),&g), Iter(0,&g) );
  500. }
  501. inline std::pair<
  502. graph_traits<leda::graph>::adjacency_iterator,
  503. graph_traits<leda::graph>::adjacency_iterator >
  504. adjacent_vertices(
  505. graph_traits<leda::graph>::vertex_descriptor u,
  506. const leda::graph& g)
  507. {
  508. typedef graph_traits<leda::graph>
  509. ::adjacency_iterator Iter;
  510. return std::make_pair( Iter(g.first_adj_edge(u),&g), Iter(0,&g) );
  511. }
  512. graph_traits<leda::graph>::vertices_size_type
  513. num_vertices(const leda::graph& g)
  514. {
  515. return g.number_of_nodes();
  516. }
  517. graph_traits<leda::graph>::edges_size_type
  518. num_edges(const leda::graph& g)
  519. {
  520. return g.number_of_edges();
  521. }
  522. graph_traits<leda::graph>::degree_size_type
  523. out_degree(
  524. graph_traits<leda::graph>::vertex_descriptor u,
  525. const leda::graph& g)
  526. {
  527. return g.outdeg(u);
  528. }
  529. graph_traits<leda::graph>::degree_size_type
  530. in_degree(
  531. graph_traits<leda::graph>::vertex_descriptor u,
  532. const leda::graph& g)
  533. {
  534. return g.indeg(u);
  535. }
  536. graph_traits<leda::graph>::degree_size_type
  537. degree(
  538. graph_traits<leda::graph>::vertex_descriptor u,
  539. const leda::graph& g)
  540. {
  541. return g.outdeg(u) + g.indeg(u);
  542. }
  543. graph_traits<leda::graph>::vertex_descriptor
  544. add_vertex(leda::graph& g)
  545. {
  546. return g.new_node();
  547. }
  548. void
  549. remove_edge(
  550. graph_traits<leda::graph>::vertex_descriptor u,
  551. graph_traits<leda::graph>::vertex_descriptor v,
  552. leda::graph& g)
  553. {
  554. graph_traits<leda::graph>::out_edge_iterator
  555. i,iend;
  556. for (boost::tie(i,iend) = out_edges(u,g); i != iend; ++i)
  557. if (target(*i,g) == v)
  558. g.del_edge(*i);
  559. }
  560. void
  561. remove_edge(
  562. graph_traits<leda::graph>::edge_descriptor e,
  563. leda::graph& g)
  564. {
  565. g.del_edge(e);
  566. }
  567. void clear_vertex(
  568. graph_traits<leda::graph>::vertex_descriptor u,
  569. leda::graph& g)
  570. {
  571. graph_traits<leda::graph>::out_edge_iterator ei, ei_end;
  572. for (boost::tie(ei, ei_end)=out_edges(u,g); ei!=ei_end; ei++)
  573. remove_edge(*ei, g);
  574. graph_traits<leda::graph>::in_edge_iterator iei, iei_end;
  575. for (boost::tie(iei, iei_end)=in_edges(u,g); iei!=iei_end; iei++)
  576. remove_edge(*iei, g);
  577. }
  578. void remove_vertex(
  579. graph_traits<leda::graph>::vertex_descriptor u,
  580. leda::graph& g)
  581. {
  582. g.del_node(u);
  583. }
  584. std::pair<
  585. graph_traits<leda::graph>::edge_descriptor,
  586. bool>
  587. add_edge(
  588. graph_traits<leda::graph>::vertex_descriptor u,
  589. graph_traits<leda::graph>::vertex_descriptor v,
  590. leda::graph& g)
  591. {
  592. return std::make_pair(g.new_edge(u, v), true);
  593. }
  594. //===========================================================================
  595. // property maps for GRAPH<vtype,etype>
  596. class leda_graph_id_map
  597. : public put_get_helper<int, leda_graph_id_map>
  598. {
  599. public:
  600. typedef readable_property_map_tag category;
  601. typedef int value_type;
  602. typedef int reference;
  603. typedef leda::node key_type;
  604. leda_graph_id_map() { }
  605. template <class T>
  606. long operator[](T x) const { return x->id(); }
  607. };
  608. template <class vtype, class etype>
  609. inline leda_graph_id_map
  610. get(vertex_index_t, const leda::GRAPH<vtype, etype>& g) {
  611. return leda_graph_id_map();
  612. }
  613. template <class vtype, class etype>
  614. inline leda_graph_id_map
  615. get(edge_index_t, const leda::GRAPH<vtype, etype>& g) {
  616. return leda_graph_id_map();
  617. }
  618. template <class Tag>
  619. struct leda_property_map { };
  620. template <>
  621. struct leda_property_map<vertex_index_t> {
  622. template <class vtype, class etype>
  623. struct bind_ {
  624. typedef leda_graph_id_map type;
  625. typedef leda_graph_id_map const_type;
  626. };
  627. };
  628. template <>
  629. struct leda_property_map<edge_index_t> {
  630. template <class vtype, class etype>
  631. struct bind_ {
  632. typedef leda_graph_id_map type;
  633. typedef leda_graph_id_map const_type;
  634. };
  635. };
  636. template <class Data, class DataRef, class GraphPtr>
  637. class leda_graph_data_map
  638. : public put_get_helper<DataRef,
  639. leda_graph_data_map<Data,DataRef,GraphPtr> >
  640. {
  641. public:
  642. typedef Data value_type;
  643. typedef DataRef reference;
  644. typedef void key_type;
  645. typedef lvalue_property_map_tag category;
  646. leda_graph_data_map(GraphPtr g) : m_g(g) { }
  647. template <class NodeOrEdge>
  648. DataRef operator[](NodeOrEdge x) const { return (*m_g)[x]; }
  649. protected:
  650. GraphPtr m_g;
  651. };
  652. template <>
  653. struct leda_property_map<vertex_all_t> {
  654. template <class vtype, class etype>
  655. struct bind_ {
  656. typedef leda_graph_data_map<vtype, vtype&, leda::GRAPH<vtype, etype>*> type;
  657. typedef leda_graph_data_map<vtype, const vtype&,
  658. const leda::GRAPH<vtype, etype>*> const_type;
  659. };
  660. };
  661. template <class vtype, class etype >
  662. inline typename property_map< leda::GRAPH<vtype, etype>, vertex_all_t>::type
  663. get(vertex_all_t, leda::GRAPH<vtype, etype>& g) {
  664. typedef typename property_map< leda::GRAPH<vtype, etype>, vertex_all_t>::type
  665. pmap_type;
  666. return pmap_type(&g);
  667. }
  668. template <class vtype, class etype >
  669. inline typename property_map< leda::GRAPH<vtype, etype>, vertex_all_t>::const_type
  670. get(vertex_all_t, const leda::GRAPH<vtype, etype>& g) {
  671. typedef typename property_map< leda::GRAPH<vtype, etype>,
  672. vertex_all_t>::const_type pmap_type;
  673. return pmap_type(&g);
  674. }
  675. template <>
  676. struct leda_property_map<edge_all_t> {
  677. template <class vtype, class etype>
  678. struct bind_ {
  679. typedef leda_graph_data_map<etype, etype&, leda::GRAPH<vtype, etype>*> type;
  680. typedef leda_graph_data_map<etype, const etype&,
  681. const leda::GRAPH<vtype, etype>*> const_type;
  682. };
  683. };
  684. template <class vtype, class etype >
  685. inline typename property_map< leda::GRAPH<vtype, etype>, edge_all_t>::type
  686. get(edge_all_t, leda::GRAPH<vtype, etype>& g) {
  687. typedef typename property_map< leda::GRAPH<vtype, etype>, edge_all_t>::type
  688. pmap_type;
  689. return pmap_type(&g);
  690. }
  691. template <class vtype, class etype >
  692. inline typename property_map< leda::GRAPH<vtype, etype>, edge_all_t>::const_type
  693. get(edge_all_t, const leda::GRAPH<vtype, etype>& g) {
  694. typedef typename property_map< leda::GRAPH<vtype, etype>,
  695. edge_all_t>::const_type pmap_type;
  696. return pmap_type(&g);
  697. }
  698. // property map interface to the LEDA node_array class
  699. template <class E, class ERef, class NodeMapPtr>
  700. class leda_node_property_map
  701. : public put_get_helper<ERef, leda_node_property_map<E, ERef, NodeMapPtr> >
  702. {
  703. public:
  704. typedef E value_type;
  705. typedef ERef reference;
  706. typedef leda::node key_type;
  707. typedef lvalue_property_map_tag category;
  708. leda_node_property_map(NodeMapPtr a) : m_array(a) { }
  709. ERef operator[](leda::node n) const { return (*m_array)[n]; }
  710. protected:
  711. NodeMapPtr m_array;
  712. };
  713. template <class E>
  714. leda_node_property_map<E, const E&, const leda::node_array<E>*>
  715. make_leda_node_property_map(const leda::node_array<E>& a)
  716. {
  717. typedef leda_node_property_map<E, const E&, const leda::node_array<E>*>
  718. pmap_type;
  719. return pmap_type(&a);
  720. }
  721. template <class E>
  722. leda_node_property_map<E, E&, leda::node_array<E>*>
  723. make_leda_node_property_map(leda::node_array<E>& a)
  724. {
  725. typedef leda_node_property_map<E, E&, leda::node_array<E>*> pmap_type;
  726. return pmap_type(&a);
  727. }
  728. template <class E>
  729. leda_node_property_map<E, const E&, const leda::node_map<E>*>
  730. make_leda_node_property_map(const leda::node_map<E>& a)
  731. {
  732. typedef leda_node_property_map<E,const E&,const leda::node_map<E>*>
  733. pmap_type;
  734. return pmap_type(&a);
  735. }
  736. template <class E>
  737. leda_node_property_map<E, E&, leda::node_map<E>*>
  738. make_leda_node_property_map(leda::node_map<E>& a)
  739. {
  740. typedef leda_node_property_map<E, E&, leda::node_map<E>*> pmap_type;
  741. return pmap_type(&a);
  742. }
  743. // g++ 'enumeral_type' in template unification not implemented workaround
  744. template <class vtype, class etype, class Tag>
  745. struct property_map<leda::GRAPH<vtype, etype>, Tag> {
  746. typedef typename
  747. leda_property_map<Tag>::template bind_<vtype, etype> map_gen;
  748. typedef typename map_gen::type type;
  749. typedef typename map_gen::const_type const_type;
  750. };
  751. template <class vtype, class etype, class PropertyTag, class Key>
  752. inline
  753. typename boost::property_traits<
  754. typename boost::property_map<leda::GRAPH<vtype, etype>,PropertyTag>::const_type
  755. >::value_type
  756. get(PropertyTag p, const leda::GRAPH<vtype, etype>& g, const Key& key) {
  757. return get(get(p, g), key);
  758. }
  759. template <class vtype, class etype, class PropertyTag, class Key,class Value>
  760. inline void
  761. put(PropertyTag p, leda::GRAPH<vtype, etype>& g,
  762. const Key& key, const Value& value)
  763. {
  764. typedef typename property_map<leda::GRAPH<vtype, etype>, PropertyTag>::type Map;
  765. Map pmap = get(p, g);
  766. put(pmap, key, value);
  767. }
  768. // property map interface to the LEDA edge_array class
  769. template <class E, class ERef, class EdgeMapPtr>
  770. class leda_edge_property_map
  771. : public put_get_helper<ERef, leda_edge_property_map<E, ERef, EdgeMapPtr> >
  772. {
  773. public:
  774. typedef E value_type;
  775. typedef ERef reference;
  776. typedef leda::edge key_type;
  777. typedef lvalue_property_map_tag category;
  778. leda_edge_property_map(EdgeMapPtr a) : m_array(a) { }
  779. ERef operator[](leda::edge n) const { return (*m_array)[n]; }
  780. protected:
  781. EdgeMapPtr m_array;
  782. };
  783. template <class E>
  784. leda_edge_property_map<E, const E&, const leda::edge_array<E>*>
  785. make_leda_node_property_map(const leda::node_array<E>& a)
  786. {
  787. typedef leda_edge_property_map<E, const E&, const leda::node_array<E>*>
  788. pmap_type;
  789. return pmap_type(&a);
  790. }
  791. template <class E>
  792. leda_edge_property_map<E, E&, leda::edge_array<E>*>
  793. make_leda_edge_property_map(leda::edge_array<E>& a)
  794. {
  795. typedef leda_edge_property_map<E, E&, leda::edge_array<E>*> pmap_type;
  796. return pmap_type(&a);
  797. }
  798. template <class E>
  799. leda_edge_property_map<E, const E&, const leda::edge_map<E>*>
  800. make_leda_edge_property_map(const leda::edge_map<E>& a)
  801. {
  802. typedef leda_edge_property_map<E,const E&,const leda::edge_map<E>*>
  803. pmap_type;
  804. return pmap_type(&a);
  805. }
  806. template <class E>
  807. leda_edge_property_map<E, E&, leda::edge_map<E>*>
  808. make_leda_edge_property_map(leda::edge_map<E>& a)
  809. {
  810. typedef leda_edge_property_map<E, E&, leda::edge_map<E>*> pmap_type;
  811. return pmap_type(&a);
  812. }
  813. } // namespace boost
  814. #endif // BOOST_GRAPH_LEDA_HPP