diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index d8551bf..3125851 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -82,3 +82,4 @@ run std_placeholders_test.cpp ; run apply_test.cpp ; run apply_test2.cpp ; run apply_rv_test.cpp ; +run apply_rv_test2.cpp ; diff --git a/test/apply_rv_test2.cpp b/test/apply_rv_test2.cpp new file mode 100644 index 0000000..b5a8247 --- /dev/null +++ b/test/apply_rv_test2.cpp @@ -0,0 +1,92 @@ +// Copyright 2021 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include + +#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) + +BOOST_PRAGMA_MESSAGE("Skipping test because BOOST_NO_CXX11_RVALUE_REFERENCES is defined") +int main() {} + +#elif defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) + +BOOST_PRAGMA_MESSAGE("Skipping test because BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined") +int main() {} + +#elif defined(BOOST_NO_CXX11_REF_QUALIFIERS) + +BOOST_PRAGMA_MESSAGE("Skipping test because BOOST_NO_CXX11_REF_QUALIFIERS is defined") +int main() {} + +#else + +struct F +{ +public: + + int operator()( int & x ) & + { + return x; + } + + int operator()( int && x ) & + { + return -x; + } + + int operator()( int & x ) && + { + return x + 10; + } + + int operator()( int && x ) && + { + return -x - 10; + } +}; + +int& get_lvalue_arg() +{ + static int a = 1; + return a; +} + +int get_prvalue_arg() +{ + return 2; +} + +F& get_lvalue_f() +{ + static F f; + return f; +} + +F get_prvalue_f() +{ + return F(); +} + +int main() +{ + using namespace boost::placeholders; + + BOOST_TEST_EQ( boost::bind(boost::apply(), boost::bind(get_lvalue_f), boost::bind(get_lvalue_arg))(), 1 ); + BOOST_TEST_EQ( boost::bind(boost::apply(), boost::bind(get_lvalue_f), boost::bind(get_prvalue_arg))(), -2 ); + BOOST_TEST_EQ( boost::bind(boost::apply(), boost::bind(get_prvalue_f), boost::bind(get_lvalue_arg))(), 11 ); + BOOST_TEST_EQ( boost::bind(boost::apply(), boost::bind(get_prvalue_f), boost::bind(get_prvalue_arg))(), -12 ); + + BOOST_TEST_EQ( boost::bind(boost::apply(), boost::bind(boost::apply(), _1), boost::bind(boost::apply(), _2))(get_lvalue_f, get_lvalue_arg), 1 ); + BOOST_TEST_EQ( boost::bind(boost::apply(), boost::bind(boost::apply(), _1), boost::bind(boost::apply(), _2))(get_lvalue_f, get_prvalue_arg), -2 ); + BOOST_TEST_EQ( boost::bind(boost::apply(), boost::bind(boost::apply(), _1), boost::bind(boost::apply(), _2))(get_prvalue_f, get_lvalue_arg), 11 ); + BOOST_TEST_EQ( boost::bind(boost::apply(), boost::bind(boost::apply(), _1), boost::bind(boost::apply(), _2))(get_prvalue_f, get_prvalue_arg), -12 ); + + return boost::report_errors(); +} + +#endif