diff options
Diffstat (limited to 'src/boost/libs/phoenix/test/bll_compatibility/result_of_tests.cpp')
-rw-r--r-- | src/boost/libs/phoenix/test/bll_compatibility/result_of_tests.cpp | 315 |
1 files changed, 315 insertions, 0 deletions
diff --git a/src/boost/libs/phoenix/test/bll_compatibility/result_of_tests.cpp b/src/boost/libs/phoenix/test/bll_compatibility/result_of_tests.cpp new file mode 100644 index 000000000..6213c0d9b --- /dev/null +++ b/src/boost/libs/phoenix/test/bll_compatibility/result_of_tests.cpp @@ -0,0 +1,315 @@ +// result_of_tests.cpp -- The Boost Lambda Library ------------------ +// +// Copyright (C) 2010 Steven Watanabe +// +// 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) +// +// For more information, see www.boost.org + +// ----------------------------------------------------------------------- + + +#include <boost/core/lightweight_test.hpp> +#include <boost/lambda/bind.hpp> +#include <boost/lambda/lambda.hpp> +#include <boost/mpl/assert.hpp> +#include <boost/type_traits/is_same.hpp> + +struct with_result_type { + typedef int result_type; + int operator()() const { return 0; } + int operator()(int) const { return 1; } + int operator()(int, int) const { return 2; } + int operator()(int, int, int) const { return 3; } + int operator()(int, int, int, int) const { return 4; } + int operator()(int, int, int, int, int) const { return 5; } + int operator()(int, int, int, int, int, int) const { return 6; } + int operator()(int, int, int, int, int, int, int) const { return 7; } + int operator()(int, int, int, int, int, int, int, int) const { return 8; } + int operator()(int, int, int, int, int, int, int, int, int) const { return 9; } +}; + +struct with_result_template_value { + template<class Sig> + struct result; + template<class This> + struct result<This()> { + typedef int type; + }; + template<class This, class A1> + struct result<This(A1)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int>)); + typedef int type; + }; + template<class This, class A1, class A2> + struct result<This(A1, A2)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3> + struct result<This(A1, A2, A3)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3, class A4> + struct result<This(A1, A2, A3, A4)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int>)); + BOOST_MPL_ASSERT((boost::is_same<A4, int>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3, class A4, class A5> + struct result<This(A1, A2, A3, A4, A5)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int>)); + BOOST_MPL_ASSERT((boost::is_same<A4, int>)); + BOOST_MPL_ASSERT((boost::is_same<A5, int>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3, class A4, class A5, class A6> + struct result<This(A1, A2, A3, A4, A5, A6)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int>)); + BOOST_MPL_ASSERT((boost::is_same<A4, int>)); + BOOST_MPL_ASSERT((boost::is_same<A5, int>)); + BOOST_MPL_ASSERT((boost::is_same<A6, int>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3, class A4, class A5, class A6, class A7> + struct result<This(A1, A2, A3, A4, A5, A6, A7)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int>)); + BOOST_MPL_ASSERT((boost::is_same<A4, int>)); + BOOST_MPL_ASSERT((boost::is_same<A5, int>)); + BOOST_MPL_ASSERT((boost::is_same<A6, int>)); + BOOST_MPL_ASSERT((boost::is_same<A7, int>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> + struct result<This(A1, A2, A3, A4, A5, A6, A7, A8)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int>)); + BOOST_MPL_ASSERT((boost::is_same<A4, int>)); + BOOST_MPL_ASSERT((boost::is_same<A5, int>)); + BOOST_MPL_ASSERT((boost::is_same<A6, int>)); + BOOST_MPL_ASSERT((boost::is_same<A7, int>)); + BOOST_MPL_ASSERT((boost::is_same<A8, int>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> + struct result<This(A1, A2, A3, A4, A5, A6, A7, A8, A9)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int>)); + BOOST_MPL_ASSERT((boost::is_same<A4, int>)); + BOOST_MPL_ASSERT((boost::is_same<A5, int>)); + BOOST_MPL_ASSERT((boost::is_same<A6, int>)); + BOOST_MPL_ASSERT((boost::is_same<A7, int>)); + BOOST_MPL_ASSERT((boost::is_same<A8, int>)); + BOOST_MPL_ASSERT((boost::is_same<A9, int>)); + typedef int type; + }; + + int operator()() const { return 0; } + int operator()(int) const { return 1; } + int operator()(int, int) const { return 2; } + int operator()(int, int, int) const { return 3; } + int operator()(int, int, int, int) const { return 4; } + int operator()(int, int, int, int, int) const { return 5; } + int operator()(int, int, int, int, int, int) const { return 6; } + int operator()(int, int, int, int, int, int, int) const { return 7; } + int operator()(int, int, int, int, int, int, int, int) const { return 8; } + int operator()(int, int, int, int, int, int, int, int, int) const { return 9; } +}; + +struct with_result_template_reference { + template<class Sig> + struct result; + template<class This> + struct result<This()> { + typedef int type; + }; + template<class This, class A1> + struct result<This(A1)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int&>)); + typedef int type; + }; + template<class This, class A1, class A2> + struct result<This(A1, A2)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int&>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3> + struct result<This(A1, A2, A3)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int&>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3, class A4> + struct result<This(A1, A2, A3, A4)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A4, int&>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3, class A4, class A5> + struct result<This(A1, A2, A3, A4, A5)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A4, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A5, int&>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3, class A4, class A5, class A6> + struct result<This(A1, A2, A3, A4, A5, A6)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A4, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A5, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A6, int&>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3, class A4, class A5, class A6, class A7> + struct result<This(A1, A2, A3, A4, A5, A6, A7)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A4, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A5, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A6, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A7, int&>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> + struct result<This(A1, A2, A3, A4, A5, A6, A7, A8)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A4, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A5, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A6, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A7, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A8, int&>)); + typedef int type; + }; + template<class This, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> + struct result<This(A1, A2, A3, A4, A5, A6, A7, A8, A9)> { + BOOST_MPL_ASSERT((boost::is_same<A1, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A2, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A3, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A4, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A5, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A6, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A7, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A8, int&>)); + BOOST_MPL_ASSERT((boost::is_same<A9, int&>)); + typedef int type; + }; + + int operator()() const { return 0; } + int operator()(int) const { return 1; } + int operator()(int, int) const { return 2; } + int operator()(int, int, int) const { return 3; } + int operator()(int, int, int, int) const { return 4; } + int operator()(int, int, int, int, int) const { return 5; } + int operator()(int, int, int, int, int, int) const { return 6; } + int operator()(int, int, int, int, int, int, int) const { return 7; } + int operator()(int, int, int, int, int, int, int, int) const { return 8; } + int operator()(int, int, int, int, int, int, int, int, int) const { return 9; } +}; + +template<class F> +typename boost::result_of<F()>::type apply0(F f) { + return f(); +} +template<class A, class F> +typename boost::result_of<F(A)>::type apply1(F f, A a) { + return f(a); +} +template<class A, class B, class F> +typename boost::result_of<F(A, B)>::type apply2(F f, A a, B b) { + return f(a, b); +} +template<class A, class B, class C, class F> +typename boost::result_of<F(A, B, C)>::type apply3(F f, A a, B b, C c) { + return f(a, b, c); +} + +using namespace boost::lambda; + +int main() +{ + BOOST_TEST_EQ(boost::lambda::bind(with_result_type())(), 0); + BOOST_TEST_EQ(boost::lambda::bind(with_result_type(), 1)(), 1); + BOOST_TEST_EQ(boost::lambda::bind(with_result_type(), 1, 2)(), 2); + BOOST_TEST_EQ(boost::lambda::bind(with_result_type(), 1, 2, 3)(), 3); + BOOST_TEST_EQ(boost::lambda::bind(with_result_type(), 1, 2, 3, 4)(), 4); + BOOST_TEST_EQ(boost::lambda::bind(with_result_type(), 1, 2, 3, 4, 5)(), 5); + BOOST_TEST_EQ(boost::lambda::bind(with_result_type(), 1, 2, 3, 4, 5, 6)(), 6); + BOOST_TEST_EQ(boost::lambda::bind(with_result_type(), 1, 2, 3, 4, 5, 6, 7)(), 7); + BOOST_TEST_EQ(boost::lambda::bind(with_result_type(), 1, 2, 3, 4, 5, 6, 7, 8)(), 8); + BOOST_TEST_EQ(boost::lambda::bind(with_result_type(), 1, 2, 3, 4, 5, 6, 7, 8, 9)(), 9); + + // Nullary result_of fails + //BOOST_TEST_EQ(boost::lambda::bind(with_result_template_value())(), 0); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_value(), 1)(), 1); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_value(), 1, 2)(), 2); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_value(), 1, 2, 3)(), 3); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_value(), 1, 2, 3, 4)(), 4); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_value(), 1, 2, 3, 4, 5)(), 5); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_value(), 1, 2, 3, 4, 5, 6)(), 6); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_value(), 1, 2, 3, 4, 5, 6, 7)(), 7); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_value(), 1, 2, 3, 4, 5, 6, 7, 8)(), 8); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_value(), 1, 2, 3, 4, 5, 6, 7, 8, 9)(), 9); + + int one = 1, + two = 2, + three = 3, + four = 4, + five = 5, + six = 6, + seven = 7, + eight = 8, + nine = 9; + + // Nullary result_of fails + //BOOST_TEST_EQ(boost::lambda::bind(with_result_template_reference())(), 0); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_reference(), var(one))(), 1); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_reference(), var(one), var(two))(), 2); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_reference(), var(one), var(two), var(three))(), 3); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_reference(), var(one), var(two), var(three), var(four))(), 4); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_reference(), var(one), var(two), var(three), var(four), var(five))(), 5); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_reference(), var(one), var(two), var(three), var(four), var(five), var(six))(), 6); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_reference(), var(one), var(two), var(three), var(four), var(five), var(six), var(seven))(), 7); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_reference(), var(one), var(two), var(three), var(four), var(five), var(six), var(seven), var(eight))(), 8); + BOOST_TEST_EQ(boost::lambda::bind(with_result_template_reference(), var(one), var(two), var(three), var(four), var(five), var(six), var(seven), var(eight), var(nine))(), 9); + + // Check using result_of with lambda functors + //BOOST_TEST_EQ(apply0(constant(0)), 0); + BOOST_TEST_EQ(apply1<int>(_1, one), 1); + BOOST_TEST_EQ(apply1<int&>(_1, one), 1); + BOOST_TEST_EQ(apply1<const int&>(_1, one), 1); + BOOST_TEST_EQ((apply2<int, int>(_1 + _2, one, two)), 3); + BOOST_TEST_EQ((apply2<int&, int&>(_1 + _2, one, two)), 3); + BOOST_TEST_EQ((apply2<const int&, const int&>(_1 + _2, one, two)), 3); + BOOST_TEST_EQ((apply3<int, int, int>(_1 + _2 + _3, one, two, three)), 6); + BOOST_TEST_EQ((apply3<int&, int&, int&>(_1 + _2 + _3, one, two, three)), 6); + BOOST_TEST_EQ((apply3<const int&, const int&, const int&>(_1 + _2 + _3, one, two, three)), 6); + + return boost::report_errors(); +} |