boyer_myrvold_planar_test.hpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  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. typename parameter::value_type<ArgumentPack, tag::graph>::type
  42. >::type graph_t;
  43. typedef typename property_map<
  44. graph_t,
  45. vertex_index_t
  46. >::const_type vertex_default_index_map_t;
  47. typedef typename parameter::value_type<
  48. ArgumentPack,
  49. tag::vertex_index_map,
  50. vertex_default_index_map_t
  51. >::type vertex_index_map_t;
  52. graph_t const& g = args[graph];
  53. vertex_default_index_map_t v_d_map = get(vertex_index, g);
  54. vertex_index_map_t v_i_map = args[vertex_index_map | v_d_map];
  55. boyer_myrvold_impl
  56. <graph_t,
  57. vertex_index_map_t,
  58. graph::detail::no_old_handles,
  59. graph::detail::no_embedding
  60. >
  61. planarity_tester(g, v_i_map);
  62. return planarity_tester.is_planar() ? true : false;
  63. }
  64. template <typename ArgumentPack>
  65. bool dispatched_boyer_myrvold(ArgumentPack const& args,
  66. mpl::true_,
  67. mpl::false_
  68. )
  69. {
  70. //Dispatch for no planar embedding, kuratowski subgraph isolation
  71. typedef typename remove_const<
  72. typename parameter::value_type<ArgumentPack, tag::graph>::type
  73. >::type graph_t;
  74. typedef typename property_map<
  75. graph_t,
  76. vertex_index_t
  77. >::const_type vertex_default_index_map_t;
  78. typedef typename parameter::value_type<
  79. ArgumentPack,
  80. tag::vertex_index_map,
  81. vertex_default_index_map_t
  82. >::type vertex_index_map_t;
  83. typedef typename property_map<
  84. graph_t,
  85. edge_index_t
  86. >::const_type edge_default_index_map_t;
  87. typedef typename parameter::value_type<
  88. ArgumentPack,
  89. tag::edge_index_map,
  90. edge_default_index_map_t
  91. >::type edge_index_map_t;
  92. graph_t const& g = args[graph];
  93. vertex_default_index_map_t v_d_map = get(vertex_index, g);
  94. vertex_index_map_t v_i_map = args[vertex_index_map | v_d_map];
  95. edge_default_index_map_t e_d_map = get(edge_index, g);
  96. edge_index_map_t e_i_map = args[edge_index_map | e_d_map];
  97. boyer_myrvold_impl
  98. <graph_t,
  99. vertex_index_map_t,
  100. graph::detail::store_old_handles,
  101. graph::detail::no_embedding
  102. >
  103. planarity_tester(g, v_i_map);
  104. if (planarity_tester.is_planar())
  105. return true;
  106. else
  107. {
  108. planarity_tester.extract_kuratowski_subgraph
  109. (args[kuratowski_subgraph], e_i_map);
  110. return false;
  111. }
  112. }
  113. template <typename ArgumentPack>
  114. bool dispatched_boyer_myrvold(ArgumentPack const& args,
  115. mpl::false_,
  116. mpl::true_
  117. )
  118. {
  119. //Dispatch for planar embedding, no kuratowski subgraph isolation
  120. typedef typename remove_const<
  121. typename parameter::value_type<ArgumentPack, tag::graph>::type
  122. >::type graph_t;
  123. typedef typename property_map<
  124. graph_t,
  125. vertex_index_t
  126. >::const_type vertex_default_index_map_t;
  127. typedef typename parameter::value_type<
  128. ArgumentPack,
  129. tag::vertex_index_map,
  130. vertex_default_index_map_t
  131. >::type vertex_index_map_t;
  132. graph_t const& g = args[graph];
  133. vertex_default_index_map_t v_d_map = get(vertex_index, g);
  134. vertex_index_map_t v_i_map = args[vertex_index_map | v_d_map];
  135. boyer_myrvold_impl
  136. <graph_t,
  137. vertex_index_map_t,
  138. graph::detail::no_old_handles,
  139. #ifdef BOOST_GRAPH_PREFER_STD_LIB
  140. graph::detail::std_list
  141. #else
  142. graph::detail::recursive_lazy_list
  143. #endif
  144. >
  145. planarity_tester(g, v_i_map);
  146. if (planarity_tester.is_planar())
  147. {
  148. planarity_tester.make_edge_permutation(args[embedding]);
  149. return true;
  150. }
  151. else
  152. return false;
  153. }
  154. template <typename ArgumentPack>
  155. bool dispatched_boyer_myrvold(ArgumentPack const& args,
  156. mpl::false_,
  157. mpl::false_
  158. )
  159. {
  160. //Dispatch for planar embedding, kuratowski subgraph isolation
  161. typedef typename remove_const<
  162. typename parameter::value_type<ArgumentPack, tag::graph>::type
  163. >::type graph_t;
  164. typedef typename property_map<
  165. graph_t,
  166. vertex_index_t
  167. >::const_type vertex_default_index_map_t;
  168. typedef typename parameter::value_type<
  169. ArgumentPack,
  170. tag::vertex_index_map,
  171. vertex_default_index_map_t
  172. >::type vertex_index_map_t;
  173. typedef typename property_map<
  174. graph_t,
  175. edge_index_t
  176. >::const_type edge_default_index_map_t;
  177. typedef typename parameter::value_type<
  178. ArgumentPack,
  179. tag::edge_index_map,
  180. edge_default_index_map_t
  181. >::type edge_index_map_t;
  182. graph_t const& g = args[graph];
  183. vertex_default_index_map_t v_d_map = get(vertex_index, g);
  184. vertex_index_map_t v_i_map = args[vertex_index_map | v_d_map];
  185. edge_default_index_map_t e_d_map = get(edge_index, g);
  186. edge_index_map_t e_i_map = args[edge_index_map | e_d_map];
  187. boyer_myrvold_impl
  188. <graph_t,
  189. vertex_index_map_t,
  190. graph::detail::store_old_handles,
  191. #ifdef BOOST_BGL_PREFER_STD_LIB
  192. graph::detail::std_list
  193. #else
  194. graph::detail::recursive_lazy_list
  195. #endif
  196. >
  197. planarity_tester(g, v_i_map);
  198. if (planarity_tester.is_planar())
  199. {
  200. planarity_tester.make_edge_permutation(args[embedding]);
  201. return true;
  202. }
  203. else
  204. {
  205. planarity_tester.extract_kuratowski_subgraph
  206. (args[kuratowski_subgraph], e_i_map);
  207. return false;
  208. }
  209. }
  210. template <typename ArgumentPack>
  211. bool boyer_myrvold_planarity_test(ArgumentPack const& args)
  212. {
  213. typedef typename parameter::binding
  214. < ArgumentPack,
  215. tag::kuratowski_subgraph,
  216. const no_kuratowski_subgraph_isolation&
  217. >::type
  218. kuratowski_arg_t;
  219. typedef typename parameter::binding
  220. < ArgumentPack,
  221. tag::embedding,
  222. const no_planar_embedding&
  223. >::type
  224. embedding_arg_t;
  225. return dispatched_boyer_myrvold
  226. (args,
  227. boost::is_same
  228. <embedding_arg_t, const no_planar_embedding&>(),
  229. boost::is_same
  230. <kuratowski_arg_t, const no_kuratowski_subgraph_isolation&>()
  231. );
  232. }
  233. } //namespace core
  234. } //namespace boyer_myrvold_params
  235. template <typename A0>
  236. bool boyer_myrvold_planarity_test(A0 const& arg0)
  237. {
  238. return boyer_myrvold_params::core::boyer_myrvold_planarity_test
  239. (boyer_myrvold_params::boyer_myrvold_params_t()(arg0));
  240. }
  241. template <typename A0, typename A1>
  242. // bool boyer_myrvold_planarity_test(A0 const& arg0, A1 const& arg1)
  243. bool boyer_myrvold_planarity_test(A0 const& arg0, A1 const& arg1)
  244. {
  245. return boyer_myrvold_params::core::boyer_myrvold_planarity_test
  246. (boyer_myrvold_params::boyer_myrvold_params_t()(arg0,arg1));
  247. }
  248. template <typename A0, typename A1, typename A2>
  249. bool boyer_myrvold_planarity_test(A0 const& arg0,
  250. A1 const& arg1,
  251. A2 const& arg2
  252. )
  253. {
  254. return boyer_myrvold_params::core::boyer_myrvold_planarity_test
  255. (boyer_myrvold_params::boyer_myrvold_params_t()(arg0,arg1,arg2));
  256. }
  257. template <typename A0, typename A1, typename A2, typename A3>
  258. bool boyer_myrvold_planarity_test(A0 const& arg0,
  259. A1 const& arg1,
  260. A2 const& arg2,
  261. A3 const& arg3
  262. )
  263. {
  264. return boyer_myrvold_params::core::boyer_myrvold_planarity_test
  265. (boyer_myrvold_params::boyer_myrvold_params_t()(arg0,arg1,arg2,arg3));
  266. }
  267. template <typename A0, typename A1, typename A2, typename A3, typename A4>
  268. bool boyer_myrvold_planarity_test(A0 const& arg0,
  269. A1 const& arg1,
  270. A2 const& arg2,
  271. A3 const& arg3,
  272. A4 const& arg4
  273. )
  274. {
  275. return boyer_myrvold_params::core::boyer_myrvold_planarity_test
  276. (boyer_myrvold_params::boyer_myrvold_params_t()
  277. (arg0,arg1,arg2,arg3,arg4)
  278. );
  279. }
  280. }
  281. #endif //__BOYER_MYRVOLD_PLANAR_TEST_HPP__