// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to 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 #include #include #include #include "basics.hpp" namespace parameter = boost::parameter; namespace mpl = boost::mpl; struct not_present_tag {}; not_present_tag not_present; BOOST_PARAMETER_NAME(x) BOOST_PARAMETER_NAME(y) BOOST_PARAMETER_NAME(z) template struct assert_expected { assert_expected(E const& e, ArgPack const& args) : expected(e) , args(args) {} template bool check_not_present(T const&) const { BOOST_MPL_ASSERT((boost::is_same)); return true; } template bool check(K const& k, not_present_tag const&, long) const { return check_not_present(args[k | not_present]); } template bool check(K const& k, Expected const& expected, int) const { return test::equal(args[k], expected); } template void operator()(K) const { parameter::keyword const& k = parameter::keyword::get(); assert(check(k, expected[k], 0L)); } E const& expected; ArgPack const& args; }; template void check0(E const& e, ArgPack const& args) { mpl::for_each(assert_expected(e, args)); } template void check(E const& e, A0 const& a0) { check0(e, P()(a0)); } template void check(E const& e, A0 const& a0, A1 const& a1) { check0(e, P()(a0,a1)); } template void check(E const& e, A0 const& a0, A1 const& a1, A2 const& a2) { check0(e, P()(a0,a1,a2)); } int main() { using namespace parameter; check< parameters< tag::x , tag::y > >( (_x = 0, _y = 1) , 0 , 1 ); check< parameters< tag::x , required, boost::is_convertible > , optional, boost::is_convertible > > >( (_x = 0, _y = not_present, _z = "foo") , _x = 0 , "foo" ); check< parameters< tag::x , required, boost::is_convertible > , optional, boost::is_convertible > > >( (_x = 0, _y = 1, _z = "foo") , 0 , "foo" , 1 ); check< parameters< tag::x , required, boost::is_convertible > , optional, boost::is_convertible > > >( (_x = 0, _y = 1, _z = "foo") , 0 , 1 , "foo" ); check< parameters< tag::x , required, boost::is_convertible > , optional, boost::is_convertible > > >( (_x = 0, _y = 1, _z = "foo") , 0 , _y = 1 , "foo" ); check< parameters< tag::x , required, boost::is_convertible > , optional, boost::is_convertible > > >( (_x = 0, _y = 1, _z = "foo") , _z = "foo" , _x = 0 , 1 ); // Fails becasue of parameters.hpp:428 /* check< parameters< tag::x , required, boost::is_convertible > , optional, boost::is_convertible > > >( (_x = 0, _y = 1, _z = "foo") , _x = 0 , (long*)0 , 1 ); */ return 0; };