123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- // Copyright David Abrahams, Daniel Wallin 2005.
- // 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>
- #if (BOOST_PARAMETER_MAX_ARITY < 4)
- #error Define BOOST_PARAMETER_MAX_ARITY as 4 or greater.
- #endif
- #if !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) && \
- (BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY < 5)
- #error Define BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY \
- as 5 or greater.
- #endif
- #include <boost/parameter/name.hpp>
- namespace test {
- BOOST_PARAMETER_NAME(w)
- BOOST_PARAMETER_NAME(x)
- BOOST_PARAMETER_NAME(y)
- BOOST_PARAMETER_NAME(z)
- } // namespace test
- #if !defined(BOOST_PARAMETER_CAN_USE_MP11)
- #include <boost/mpl/bool.hpp>
- #include <boost/mpl/if.hpp>
- #include <boost/type_traits/is_convertible.hpp>
- namespace test {
- struct f_predicate
- {
- template <typename T, typename Args>
- struct apply
- : boost::mpl::if_<
- boost::is_convertible<T,int>
- , boost::mpl::true_
- , boost::mpl::false_
- >
- {
- };
- };
- } // namespace test
- #endif // BOOST_PARAMETER_CAN_USE_MP11
- #include <boost/parameter/parameters.hpp>
- #if defined(BOOST_PARAMETER_CAN_USE_MP11)
- #include <boost/mp11/bind.hpp>
- #include <type_traits>
- #endif
- namespace test {
- struct f_parameters // vc6 is happier with inheritance than with a typedef
- : boost::parameter::parameters<
- boost::parameter::required<test::tag::w>
- #if defined(BOOST_PARAMETER_CAN_USE_MP11)
- , boost::parameter::optional<
- test::tag::x
- , boost::mp11::mp_bind<std::is_convertible,boost::mp11::_1,int>
- >
- , boost::parameter::optional<
- test::tag::y
- , boost::mp11::mp_bind<std::is_convertible,boost::mp11::_1,int>
- >
- , boost::parameter::optional<
- test::tag::z
- , boost::mp11::mp_bind<std::is_convertible,boost::mp11::_1,int>
- >
- #else
- , boost::parameter::optional<test::tag::x,test::f_predicate>
- , boost::parameter::optional<test::tag::y,test::f_predicate>
- , boost::parameter::optional<test::tag::z,test::f_predicate>
- #endif // BOOST_PARAMETER_CAN_USE_MP11
- >
- {
- };
- } // namespace test
- #include <boost/parameter/macros.hpp>
- #include <boost/core/lightweight_test.hpp>
- namespace test {
- #if defined(BOOST_NO_VOID_RETURNS)
- BOOST_PARAMETER_FUN(int, f, 1, 4, f_parameters)
- #else
- BOOST_PARAMETER_FUN(void, f, 1, 4, f_parameters)
- #endif
- {
- BOOST_TEST_EQ(p[test::_w][0], p[test::_x | -1]);
- BOOST_TEST_EQ(p[test::_w][1], p[test::_y | -2]);
- BOOST_TEST_EQ(p[test::_w][2], p[test::_z | -3]);
- #if defined(BOOST_NO_VOID_RETURNS)
- return 0;
- #endif
- }
- } // namespace test
- int main()
- {
- int a[3];
- a[0] = 1;
- a[1] = 2;
- a[2] = 3;
- test::f(test::_x = 1, test::_y = 2, test::_z = 3, test::_w = a);
- a[1] = -2;
- a[2] = -3;
- test::f(test::_x = 1, test::_w = a);
- a[0] = -1;
- a[1] = 2;
- test::f(test::_y = 2, test::_w = a);
- a[1] = -2;
- a[2] = 3;
- test::f(test::_z = 3, test::_w = a);
- a[0] = 1;
- test::f(test::_z = 3, test::_x = 1, test::_w = a);
- return boost::report_errors();
- }
|