diff --git a/include/boost/python/converter/arg_from_python.hpp b/include/boost/python/converter/arg_from_python.hpp index 160659af..e1d15e68 100755 --- a/include/boost/python/converter/arg_from_python.hpp +++ b/include/boost/python/converter/arg_from_python.hpp @@ -11,7 +11,12 @@ # include # include # include +# include # include +# include +# include +# include +# include # include # include # include @@ -141,60 +146,47 @@ struct back_reference_arg_from_python // ================== +template +struct if_2 + : mpl::eval_if, F> +{}; + // This metafunction selects the appropriate arg_from_python converter // type for an argument of type T. template struct select_arg_from_python { - BOOST_STATIC_CONSTANT( - bool, obj_mgr = is_object_manager::value); - - BOOST_STATIC_CONSTANT( - bool, obj_mgr_ref = is_reference_to_object_manager::value); - - BOOST_STATIC_CONSTANT( - bool, ptr = is_pointer::value); - - BOOST_STATIC_CONSTANT( - bool, ptr_cref - = indirect_traits::is_reference_to_pointer::value - && indirect_traits::is_reference_to_const::value - && !indirect_traits::is_reference_to_volatile::value); - - - BOOST_STATIC_CONSTANT( - bool, ref = - indirect_traits::is_reference_to_non_const::value - || indirect_traits::is_reference_to_volatile::value); - - BOOST_STATIC_CONSTANT( - bool, back_ref = - boost::python::is_back_reference::value); - - typedef typename mpl::if_c< - obj_mgr - , object_manager_value_arg_from_python - , typename mpl::if_c< - obj_mgr_ref - , object_manager_ref_arg_from_python - , typename mpl::if_c< - ptr - , pointer_arg_from_python - , typename mpl::if_c< - ptr_cref - , pointer_cref_arg_from_python - , typename mpl::if_c< - ref + typedef typename if_2< + is_object_manager + , object_manager_value_arg_from_python + , if_2< + is_reference_to_object_manager + , object_manager_ref_arg_from_python + , if_2< + is_pointer + , pointer_arg_from_python + , if_2< + mpl::and_< + indirect_traits::is_reference_to_pointer + , indirect_traits::is_reference_to_const + , mpl::not_ > + > + , pointer_cref_arg_from_python + , if_2< + mpl::or_< + indirect_traits::is_reference_to_non_const + , indirect_traits::is_reference_to_volatile + > , reference_arg_from_python - , typename mpl::if_c< - back_ref + , mpl::if_< + boost::python::is_back_reference , back_reference_arg_from_python , arg_rvalue_from_python - >::type - >::type - >::type - >::type - >::type + > + > + > + > + > >::type type; };