You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
322 lines
10 KiB
322 lines
10 KiB
//======================================================================= |
|
// Copyright 2007 Aaron Windsor |
|
// |
|
// Distributed under the Boost Software License, Version 1.0. (See |
|
// accompanying file LICENSE_1_0.txt or copy at |
|
// http://www.boost.org/LICENSE_1_0.txt) |
|
//======================================================================= |
|
|
|
#ifndef __BOYER_MYRVOLD_PLANAR_TEST_HPP__ |
|
#define __BOYER_MYRVOLD_PLANAR_TEST_HPP__ |
|
|
|
#include <boost/graph/planar_detail/boyer_myrvold_impl.hpp> |
|
#include <boost/parameter.hpp> |
|
#include <boost/type_traits.hpp> |
|
#include <boost/mpl/bool.hpp> |
|
|
|
|
|
namespace boost |
|
{ |
|
|
|
struct no_kuratowski_subgraph_isolation {}; |
|
struct no_planar_embedding {}; |
|
|
|
namespace boyer_myrvold_params |
|
{ |
|
|
|
BOOST_PARAMETER_KEYWORD(tag, graph) |
|
BOOST_PARAMETER_KEYWORD(tag, embedding) |
|
BOOST_PARAMETER_KEYWORD(tag, kuratowski_subgraph) |
|
BOOST_PARAMETER_KEYWORD(tag, vertex_index_map) |
|
BOOST_PARAMETER_KEYWORD(tag, edge_index_map) |
|
|
|
typedef parameter::parameters< parameter::required<tag::graph>, |
|
tag::embedding, |
|
tag::kuratowski_subgraph, |
|
tag::vertex_index_map, |
|
tag::edge_index_map |
|
> boyer_myrvold_params_t; |
|
|
|
namespace core |
|
{ |
|
|
|
template <typename ArgumentPack> |
|
bool dispatched_boyer_myrvold(ArgumentPack const& args, |
|
mpl::true_, |
|
mpl::true_ |
|
) |
|
{ |
|
//Dispatch for no planar embedding, no kuratowski subgraph isolation |
|
|
|
typedef typename remove_const |
|
< |
|
typename remove_reference |
|
< typename parameter::binding |
|
< ArgumentPack, tag::graph>::type |
|
>::type |
|
>::type graph_t; |
|
|
|
typedef typename parameter::binding |
|
< ArgumentPack, |
|
tag::vertex_index_map, |
|
typename property_map |
|
< typename remove_reference<graph_t>::type, |
|
vertex_index_t>::const_type |
|
>::type vertex_index_map_t; |
|
|
|
boyer_myrvold_impl |
|
<graph_t, |
|
vertex_index_map_t, |
|
graph::detail::no_old_handles, |
|
graph::detail::no_embedding |
|
> |
|
planarity_tester(args[graph], |
|
args[vertex_index_map | |
|
get(vertex_index, args[graph]) |
|
] |
|
); |
|
|
|
return planarity_tester.is_planar() ? true : false; |
|
} |
|
|
|
|
|
|
|
template <typename ArgumentPack> |
|
bool dispatched_boyer_myrvold(ArgumentPack const& args, |
|
mpl::true_, |
|
mpl::false_ |
|
) |
|
{ |
|
//Dispatch for no planar embedding, kuratowski subgraph isolation |
|
typedef typename remove_const |
|
< |
|
typename remove_reference |
|
< typename parameter::binding |
|
< ArgumentPack, tag::graph>::type |
|
>::type |
|
>::type graph_t; |
|
|
|
typedef typename parameter::binding |
|
< ArgumentPack, |
|
tag::vertex_index_map, |
|
typename property_map<graph_t, vertex_index_t>::type |
|
>::type vertex_index_map_t; |
|
|
|
boyer_myrvold_impl |
|
<graph_t, |
|
vertex_index_map_t, |
|
graph::detail::store_old_handles, |
|
graph::detail::no_embedding |
|
> |
|
planarity_tester(args[graph], |
|
args[vertex_index_map | |
|
get(vertex_index, args[graph]) |
|
] |
|
); |
|
|
|
if (planarity_tester.is_planar()) |
|
return true; |
|
else |
|
{ |
|
planarity_tester.extract_kuratowski_subgraph |
|
(args[kuratowski_subgraph], |
|
args[edge_index_map|get(edge_index, args[graph])] |
|
); |
|
return false; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
template <typename ArgumentPack> |
|
bool dispatched_boyer_myrvold(ArgumentPack const& args, |
|
mpl::false_, |
|
mpl::true_ |
|
) |
|
{ |
|
//Dispatch for planar embedding, no kuratowski subgraph isolation |
|
typedef typename remove_const |
|
< |
|
typename remove_reference |
|
< typename parameter::binding |
|
< ArgumentPack, tag::graph>::type |
|
>::type |
|
>::type graph_t; |
|
|
|
typedef typename parameter::binding |
|
< ArgumentPack, |
|
tag::vertex_index_map, |
|
typename property_map<graph_t, vertex_index_t>::type |
|
>::type vertex_index_map_t; |
|
|
|
boyer_myrvold_impl |
|
<graph_t, |
|
vertex_index_map_t, |
|
graph::detail::no_old_handles, |
|
#ifdef BOOST_GRAPH_PREFER_STD_LIB |
|
graph::detail::std_list |
|
#else |
|
graph::detail::recursive_lazy_list |
|
#endif |
|
> |
|
planarity_tester(args[graph], |
|
args[vertex_index_map | |
|
get(vertex_index, args[graph]) |
|
] |
|
); |
|
|
|
if (planarity_tester.is_planar()) |
|
{ |
|
planarity_tester.make_edge_permutation(args[embedding]); |
|
return true; |
|
} |
|
else |
|
return false; |
|
} |
|
|
|
|
|
|
|
template <typename ArgumentPack> |
|
bool dispatched_boyer_myrvold(ArgumentPack const& args, |
|
mpl::false_, |
|
mpl::false_ |
|
) |
|
{ |
|
//Dispatch for planar embedding, kuratowski subgraph isolation |
|
typedef typename remove_const |
|
< |
|
typename remove_reference |
|
< typename parameter::binding |
|
< ArgumentPack, tag::graph>::type |
|
>::type |
|
>::type graph_t; |
|
|
|
typedef typename parameter::binding |
|
< ArgumentPack, |
|
tag::vertex_index_map, |
|
typename property_map<graph_t, vertex_index_t>::type |
|
>::type vertex_index_map_t; |
|
|
|
boyer_myrvold_impl |
|
<graph_t, |
|
vertex_index_map_t, |
|
graph::detail::store_old_handles, |
|
#ifdef BOOST_BGL_PREFER_STD_LIB |
|
graph::detail::std_list |
|
#else |
|
graph::detail::recursive_lazy_list |
|
#endif |
|
> |
|
planarity_tester(args[graph], |
|
args[vertex_index_map | |
|
get(vertex_index, args[graph]) |
|
] |
|
); |
|
|
|
if (planarity_tester.is_planar()) |
|
{ |
|
planarity_tester.make_edge_permutation(args[embedding]); |
|
return true; |
|
} |
|
else |
|
{ |
|
planarity_tester.extract_kuratowski_subgraph |
|
(args[kuratowski_subgraph], |
|
args[edge_index_map | get(edge_index, args[graph])] |
|
); |
|
return false; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
template <typename ArgumentPack> |
|
bool boyer_myrvold_planarity_test(ArgumentPack const& args) |
|
{ |
|
|
|
typedef typename parameter::binding |
|
< ArgumentPack, |
|
tag::kuratowski_subgraph, |
|
const no_kuratowski_subgraph_isolation& |
|
>::type |
|
kuratowski_arg_t; |
|
|
|
typedef typename parameter::binding |
|
< ArgumentPack, |
|
tag::embedding, |
|
const no_planar_embedding& |
|
>::type |
|
embedding_arg_t; |
|
|
|
return dispatched_boyer_myrvold |
|
(args, |
|
boost::is_same |
|
<embedding_arg_t, const no_planar_embedding&>(), |
|
boost::is_same |
|
<kuratowski_arg_t, const no_kuratowski_subgraph_isolation&>() |
|
); |
|
} |
|
|
|
|
|
|
|
} //namespace core |
|
|
|
} //namespace boyer_myrvold_params |
|
|
|
|
|
template <typename A0> |
|
bool boyer_myrvold_planarity_test(A0 const& arg0) |
|
{ |
|
return boyer_myrvold_params::core::boyer_myrvold_planarity_test |
|
(boyer_myrvold_params::boyer_myrvold_params_t()(arg0)); |
|
} |
|
|
|
template <typename A0, typename A1> |
|
// bool boyer_myrvold_planarity_test(A0 const& arg0, A1 const& arg1) |
|
bool boyer_myrvold_planarity_test(A0 const& arg0, A1 const& arg1) |
|
{ |
|
return boyer_myrvold_params::core::boyer_myrvold_planarity_test |
|
(boyer_myrvold_params::boyer_myrvold_params_t()(arg0,arg1)); |
|
} |
|
|
|
template <typename A0, typename A1, typename A2> |
|
bool boyer_myrvold_planarity_test(A0 const& arg0, |
|
A1 const& arg1, |
|
A2 const& arg2 |
|
) |
|
{ |
|
return boyer_myrvold_params::core::boyer_myrvold_planarity_test |
|
(boyer_myrvold_params::boyer_myrvold_params_t()(arg0,arg1,arg2)); |
|
} |
|
|
|
template <typename A0, typename A1, typename A2, typename A3> |
|
bool boyer_myrvold_planarity_test(A0 const& arg0, |
|
A1 const& arg1, |
|
A2 const& arg2, |
|
A3 const& arg3 |
|
) |
|
{ |
|
return boyer_myrvold_params::core::boyer_myrvold_planarity_test |
|
(boyer_myrvold_params::boyer_myrvold_params_t()(arg0,arg1,arg2,arg3)); |
|
} |
|
|
|
template <typename A0, typename A1, typename A2, typename A3, typename A4> |
|
bool boyer_myrvold_planarity_test(A0 const& arg0, |
|
A1 const& arg1, |
|
A2 const& arg2, |
|
A3 const& arg3, |
|
A4 const& arg4 |
|
) |
|
{ |
|
return boyer_myrvold_params::core::boyer_myrvold_planarity_test |
|
(boyer_myrvold_params::boyer_myrvold_params_t() |
|
(arg0,arg1,arg2,arg3,arg4) |
|
); |
|
} |
|
|
|
|
|
} |
|
|
|
#endif //__BOYER_MYRVOLD_PLANAR_TEST_HPP__
|
|
|