boyer_myrvold_planar_test.hpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. //=======================================================================
  2. // Copyright 2007 Aaron Windsor
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //=======================================================================
  8. #ifndef __BOYER_MYRVOLD_PLANAR_TEST_HPP__
  9. #define __BOYER_MYRVOLD_PLANAR_TEST_HPP__
  10. #include <boost/graph/planar_detail/boyer_myrvold_impl.hpp>
  11. #include <boost/parameter.hpp>
  12. #include <boost/type_traits.hpp>
  13. #include <boost/mpl/bool.hpp>
  14. namespace boost
  15. {
  16. struct no_kuratowski_subgraph_isolation {};
  17. struct no_planar_embedding {};
  18. namespace boyer_myrvold_params
  19. {
  20. BOOST_PARAMETER_KEYWORD(tag, graph)
  21. BOOST_PARAMETER_KEYWORD(tag, embedding)
  22. BOOST_PARAMETER_KEYWORD(tag, kuratowski_subgraph)
  23. BOOST_PARAMETER_KEYWORD(tag, vertex_index_map)
  24. BOOST_PARAMETER_KEYWORD(tag, edge_index_map)
  25. typedef parameter::parameters< parameter::required<tag::graph>,
  26. tag::embedding,
  27. tag::kuratowski_subgraph,
  28. tag::vertex_index_map,
  29. tag::edge_index_map
  30. > boyer_myrvold_params_t;
  31. namespace core
  32. {
  33. template <typename ArgumentPack>
  34. bool dispatched_boyer_myrvold(ArgumentPack const& args,
  35. mpl::true_,
  36. mpl::true_
  37. )
  38. {
  39. //Dispatch for no planar embedding, no kuratowski subgraph isolation
  40. typedef typename remove_const
  41. <
  42. typename remove_reference
  43. < typename parameter::binding
  44. < ArgumentPack, tag::graph>::type
  45. >::type
  46. >::type graph_t;
  47. typedef typename parameter::binding
  48. < ArgumentPack,
  49. tag::vertex_index_map,
  50. typename property_map
  51. < typename remove_reference<graph_t>::type,
  52. vertex_index_t>::const_type
  53. >::type vertex_index_map_t;
  54. boyer_myrvold_impl
  55. <graph_t,
  56. vertex_index_map_t,
  57. graph::detail::no_old_handles,
  58. graph::detail::no_embedding
  59. >
  60. planarity_tester(args[graph],
  61. args[vertex_index_map |
  62. get(vertex_index, args[graph])
  63. ]
  64. );
  65. return planarity_tester.is_planar() ? true : false;
  66. }
  67. template <typename ArgumentPack>
  68. bool dispatched_boyer_myrvold(ArgumentPack const& args,
  69. mpl::true_,
  70. mpl::false_
  71. )
  72. {
  73. //Dispatch for no planar embedding, kuratowski subgraph isolation
  74. typedef typename remove_const
  75. <
  76. typename remove_reference
  77. < typename parameter::binding
  78. < ArgumentPack, tag::graph>::type
  79. >::type
  80. >::type graph_t;
  81. typedef typename parameter::binding
  82. < ArgumentPack,
  83. tag::vertex_index_map,
  84. typename property_map<graph_t, vertex_index_t>::type
  85. >::type vertex_index_map_t;
  86. boyer_myrvold_impl
  87. <graph_t,
  88. vertex_index_map_t,
  89. graph::detail::store_old_handles,
  90. graph::detail::no_embedding
  91. >
  92. planarity_tester(args[graph],
  93. args[vertex_index_map |
  94. get(vertex_index, args[graph])
  95. ]
  96. );
  97. if (planarity_tester.is_planar())
  98. return true;
  99. else
  100. {
  101. planarity_tester.extract_kuratowski_subgraph
  102. (args[kuratowski_subgraph],
  103. args[edge_index_map|get(edge_index, args[graph])]
  104. );
  105. return false;
  106. }
  107. }
  108. template <typename ArgumentPack>
  109. bool dispatched_boyer_myrvold(ArgumentPack const& args,
  110. mpl::false_,
  111. mpl::true_
  112. )
  113. {
  114. //Dispatch for planar embedding, no kuratowski subgraph isolation
  115. typedef typename remove_const
  116. <
  117. typename remove_reference
  118. < typename parameter::binding
  119. < ArgumentPack, tag::graph>::type
  120. >::type
  121. >::type graph_t;
  122. typedef typename parameter::binding
  123. < ArgumentPack,
  124. tag::vertex_index_map,
  125. typename property_map<graph_t, vertex_index_t>::type
  126. >::type vertex_index_map_t;
  127. boyer_myrvold_impl
  128. <graph_t,
  129. vertex_index_map_t,
  130. graph::detail::no_old_handles,
  131. #ifdef BOOST_GRAPH_PREFER_STD_LIB
  132. graph::detail::std_list
  133. #else
  134. graph::detail::recursive_lazy_list
  135. #endif
  136. >
  137. planarity_tester(args[graph],
  138. args[vertex_index_map |
  139. get(vertex_index, args[graph])
  140. ]
  141. );
  142. if (planarity_tester.is_planar())
  143. {
  144. planarity_tester.make_edge_permutation(args[embedding]);
  145. return true;
  146. }
  147. else
  148. return false;
  149. }
  150. template <typename ArgumentPack>
  151. bool dispatched_boyer_myrvold(ArgumentPack const& args,
  152. mpl::false_,
  153. mpl::false_
  154. )
  155. {
  156. //Dispatch for planar embedding, kuratowski subgraph isolation
  157. typedef typename remove_const
  158. <
  159. typename remove_reference
  160. < typename parameter::binding
  161. < ArgumentPack, tag::graph>::type
  162. >::type
  163. >::type graph_t;
  164. typedef typename parameter::binding
  165. < ArgumentPack,
  166. tag::vertex_index_map,
  167. typename property_map<graph_t, vertex_index_t>::type
  168. >::type vertex_index_map_t;
  169. boyer_myrvold_impl
  170. <graph_t,
  171. vertex_index_map_t,
  172. graph::detail::store_old_handles,
  173. #ifdef BOOST_BGL_PREFER_STD_LIB
  174. graph::detail::std_list
  175. #else
  176. graph::detail::recursive_lazy_list
  177. #endif
  178. >
  179. planarity_tester(args[graph],
  180. args[vertex_index_map |
  181. get(vertex_index, args[graph])
  182. ]
  183. );
  184. if (planarity_tester.is_planar())
  185. {
  186. planarity_tester.make_edge_permutation(args[embedding]);
  187. return true;
  188. }
  189. else
  190. {
  191. planarity_tester.extract_kuratowski_subgraph
  192. (args[kuratowski_subgraph],
  193. args[edge_index_map | get(edge_index, args[graph])]
  194. );
  195. return false;
  196. }
  197. }
  198. template <typename ArgumentPack>
  199. bool boyer_myrvold_planarity_test(ArgumentPack const& args)
  200. {
  201. typedef typename parameter::binding
  202. < ArgumentPack,
  203. tag::kuratowski_subgraph,
  204. const no_kuratowski_subgraph_isolation&
  205. >::type
  206. kuratowski_arg_t;
  207. typedef typename parameter::binding
  208. < ArgumentPack,
  209. tag::embedding,
  210. const no_planar_embedding&
  211. >::type
  212. embedding_arg_t;
  213. return dispatched_boyer_myrvold
  214. (args,
  215. boost::is_same
  216. <embedding_arg_t, const no_planar_embedding&>(),
  217. boost::is_same
  218. <kuratowski_arg_t, const no_kuratowski_subgraph_isolation&>()
  219. );
  220. }
  221. } //namespace core
  222. } //namespace boyer_myrvold_params
  223. template <typename A0>
  224. bool boyer_myrvold_planarity_test(A0 const& arg0)
  225. {
  226. return boyer_myrvold_params::core::boyer_myrvold_planarity_test
  227. (boyer_myrvold_params::boyer_myrvold_params_t()(arg0));
  228. }
  229. template <typename A0, typename A1>
  230. // bool boyer_myrvold_planarity_test(A0 const& arg0, A1 const& arg1)
  231. bool boyer_myrvold_planarity_test(A0 const& arg0, A1 const& arg1)
  232. {
  233. return boyer_myrvold_params::core::boyer_myrvold_planarity_test
  234. (boyer_myrvold_params::boyer_myrvold_params_t()(arg0,arg1));
  235. }
  236. template <typename A0, typename A1, typename A2>
  237. bool boyer_myrvold_planarity_test(A0 const& arg0,
  238. A1 const& arg1,
  239. A2 const& arg2
  240. )
  241. {
  242. return boyer_myrvold_params::core::boyer_myrvold_planarity_test
  243. (boyer_myrvold_params::boyer_myrvold_params_t()(arg0,arg1,arg2));
  244. }
  245. template <typename A0, typename A1, typename A2, typename A3>
  246. bool boyer_myrvold_planarity_test(A0 const& arg0,
  247. A1 const& arg1,
  248. A2 const& arg2,
  249. A3 const& arg3
  250. )
  251. {
  252. return boyer_myrvold_params::core::boyer_myrvold_planarity_test
  253. (boyer_myrvold_params::boyer_myrvold_params_t()(arg0,arg1,arg2,arg3));
  254. }
  255. template <typename A0, typename A1, typename A2, typename A3, typename A4>
  256. bool boyer_myrvold_planarity_test(A0 const& arg0,
  257. A1 const& arg1,
  258. A2 const& arg2,
  259. A3 const& arg3,
  260. A4 const& arg4
  261. )
  262. {
  263. return boyer_myrvold_params::core::boyer_myrvold_planarity_test
  264. (boyer_myrvold_params::boyer_myrvold_params_t()
  265. (arg0,arg1,arg2,arg3,arg4)
  266. );
  267. }
  268. }
  269. #endif //__BOYER_MYRVOLD_PLANAR_TEST_HPP__