blob: 5a7266f263683b7c46e94b4ba870567931a948d4 [file] [log] [blame]
// 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 <cstddef>
#if (BOOST_PARAMETER_MAX_ARITY < 2)
#error Define BOOST_PARAMETER_MAX_ARITY as 2 or greater.
#endif
#if !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) && \
(BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY < 3)
#error Define BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY \
as 3 or greater.
#endif
namespace test {
struct count_instances
{
count_instances()
{
++count_instances::count;
}
count_instances(count_instances const&)
{
++count_instances::count;
}
template <typename T>
count_instances(T const&)
{
++count_instances::count;
}
~count_instances()
{
--count_instances::count;
}
static std::size_t count;
void noop() const
{
}
};
std::size_t count_instances::count = 0;
} // namespace test
#include <boost/parameter/name.hpp>
namespace test {
BOOST_PARAMETER_NAME(x)
BOOST_PARAMETER_NAME(y)
} // namespace test
#include <boost/parameter/preprocessor.hpp>
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
#include <type_traits>
#else
#include <boost/mpl/bool.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/type_traits/is_convertible.hpp>
#endif
namespace test {
BOOST_PARAMETER_FUNCTION((int), f, tag,
(required
(x, (long))
)
(optional
(y, (long), 2L)
)
)
{
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
static_assert(
std::is_convertible<x_type,long>::value
, "is_convertible<x_type,long>"
);
static_assert(
std::is_convertible<y_type,long>::value
, "is_convertible<y_type,long>"
);
#else
BOOST_MPL_ASSERT((
typename boost::mpl::if_<
boost::is_convertible<x_type,long>
, boost::mpl::true_
, boost::mpl::false_
>::type
));
BOOST_MPL_ASSERT((
typename boost::mpl::if_<
boost::is_convertible<y_type,long>
, boost::mpl::true_
, boost::mpl::false_
>::type
));
#endif // BOOST_PARAMETER_CAN_USE_MP11
return 0;
}
} // namespace test
#include <boost/core/lightweight_test.hpp>
namespace test {
BOOST_PARAMETER_FUNCTION((int), g, tag,
(required
(x, (test::count_instances))
)
)
{
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
static_assert(
std::is_convertible<x_type,test::count_instances>::value
, "is_convertible<x_type,test::count_instances>"
);
#else
BOOST_MPL_ASSERT((
typename boost::mpl::if_<
boost::is_convertible<x_type,test::count_instances>
, boost::mpl::true_
, boost::mpl::false_
>::type
));
#endif
x.noop();
#if !BOOST_WORKAROUND(BOOST_GCC, < 40000)
BOOST_TEST_LT(0, test::count_instances::count);
#endif
return 0;
}
BOOST_PARAMETER_FUNCTION((int), h, tag,
(required
(x, (test::count_instances const&))
)
)
{
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
static_assert(
std::is_convertible<x_type,test::count_instances const>::value
, "is_convertible<x_type,test::count_instances const>"
);
#else
BOOST_MPL_ASSERT((
typename boost::mpl::if_<
boost::is_convertible<x_type,test::count_instances const>
, boost::mpl::true_
, boost::mpl::false_
>::type
));
#endif
x.noop();
#if !BOOST_WORKAROUND(BOOST_GCC, < 40000)
BOOST_TEST_EQ(1, test::count_instances::count);
#endif
return 0;
}
} // namespace test
int main()
{
test::f(1, 2);
test::f(1., 2.f);
test::f(1U);
test::g(0);
test::h(0);
return boost::report_errors();
}