libs/parameter/test/deduced_dependent_predicate.cpp
// Copyright Daniel Wallin 2006. // 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) #include <boost/parameter/config.hpp> #include <boost/parameter/parameters.hpp> #include <boost/parameter/name.hpp> #include <boost/parameter/binding.hpp> #include "deduced.hpp" #if defined(BOOST_PARAMETER_CAN_USE_MP11) #include <boost/mp11/bind.hpp> #include <boost/mp11/utility.hpp> #include <type_traits> #else #include <boost/mpl/bool.hpp> #include <boost/mpl/placeholders.hpp> #include <boost/mpl/if.hpp> #include <boost/type_traits/is_same.hpp> #include <boost/type_traits/is_convertible.hpp> #if BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x564)) #include <boost/type_traits/remove_reference.hpp> #else #include <boost/type_traits/add_lvalue_reference.hpp> #endif // Borland workarounds needed #endif // BOOST_PARAMETER_CAN_USE_MP11 namespace test { BOOST_PARAMETER_NAME(x) BOOST_PARAMETER_NAME(y) BOOST_PARAMETER_NAME(z) } // namespace test #include <boost/core/lightweight_test.hpp> int main() { test::check< boost::parameter::parameters< test::tag::x , boost::parameter::optional< boost::parameter::deduced<test::tag::y> #if defined(BOOST_PARAMETER_CAN_USE_MP11) , boost::mp11::mp_bind< std::is_same , boost::mp11::_1 , boost::mp11::mp_bind< test::tag::x::binding_fn , boost::mp11::_2 > > #else // !defined(BOOST_PARAMETER_CAN_USE_MP11) , boost::mpl::if_< boost::is_same< #if BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x564)) boost::mpl::_1 , boost::remove_reference< boost::parameter::binding< boost::mpl::_2 , test::tag::x > > #else boost::add_lvalue_reference<boost::mpl::_1> , boost::parameter::binding<boost::mpl::_2,test::tag::x> #endif // Borland workarounds needed > , boost::mpl::true_ , boost::mpl::false_ > #endif // BOOST_PARAMETER_CAN_USE_MP11 > > >((test::_x = 0, test::_y = 1), 0, 1); test::check< boost::parameter::parameters< test::tag::x , boost::parameter::optional< boost::parameter::deduced<test::tag::y> #if defined(BOOST_PARAMETER_CAN_USE_MP11) , boost::mp11::mp_bind< std::is_same , boost::mp11::_1 , boost::mp11::mp_bind< test::tag::x::binding_fn , boost::mp11::_2 > > #else // !defined(BOOST_PARAMETER_CAN_USE_MP11) , boost::mpl::if_< boost::is_same< #if BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x564)) boost::mpl::_1 , boost::remove_reference< boost::parameter::binding< boost::mpl::_2 , test::tag::x > > #else boost::add_lvalue_reference<boost::mpl::_1> , boost::parameter::binding<boost::mpl::_2,test::tag::x> #endif // Borland workarounds needed > , boost::mpl::true_ , boost::mpl::false_ > #endif // BOOST_PARAMETER_CAN_USE_MP11 > > >((test::_x = 0U, test::_y = 1U), 0U, 1U); test::check< boost::parameter::parameters< test::tag::x , boost::parameter::optional< boost::parameter::deduced<test::tag::y> #if defined(BOOST_PARAMETER_CAN_USE_MP11) , boost::mp11::mp_bind< std::is_convertible , boost::mp11::_1 , boost::mp11::mp_bind_q<test::tag::x,boost::mp11::_2> > #else , boost::mpl::if_< boost::is_convertible<boost::mpl::_1,test::tag::x::_> , boost::mpl::true_ , boost::mpl::false_ > #endif > > >((test::_x = 0, test::_y = 1), 0, 1); test::check< boost::parameter::parameters< test::tag::x , boost::parameter::optional< boost::parameter::deduced<test::tag::y> #if defined(BOOST_PARAMETER_CAN_USE_MP11) , boost::mp11::mp_bind< std::is_convertible , boost::mp11::_1 , boost::mp11::mp_bind_q<test::tag::x,boost::mp11::_2> > #else , boost::mpl::if_< boost::is_convertible<boost::mpl::_1,test::tag::x::_1> , boost::mpl::true_ , boost::mpl::false_ > #endif > > >((test::_x = 0U, test::_y = 1U), 0U, 1U); return boost::report_errors(); }