diff --git a/include/boost/bind/bind.hpp b/include/boost/bind/bind.hpp index f793551..85d675a 100644 --- a/include/boost/bind/bind.hpp +++ b/include/boost/bind/bind.hpp @@ -887,9 +887,17 @@ public: template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist1 a( a1_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist1 a( a1_ ); + return b.eval( a ); + } }; template< class A1, class A2 > class rrlist2 @@ -915,9 +923,17 @@ public: template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist2 a( a1_, a2_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist2 a( a1_, a2_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3 > class rrlist3 @@ -946,9 +962,17 @@ public: template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist3 a( a1_, a2_, a3_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist3 a( a1_, a2_, a3_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3, class A4 > class rrlist4 @@ -980,9 +1004,17 @@ public: template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist4 a( a1_, a2_, a3_, a4_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist4 a( a1_, a2_, a3_, a4_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3, class A4, class A5 > class rrlist5 @@ -1017,9 +1049,17 @@ public: template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist5 a( a1_, a2_, a3_, a4_, a5_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist5 a( a1_, a2_, a3_, a4_, a5_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3, class A4, class A5, class A6 > class rrlist6 @@ -1057,9 +1097,17 @@ public: template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist6 a( a1_, a2_, a3_, a4_, a5_, a6_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist6 a( a1_, a2_, a3_, a4_, a5_, a6_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3, class A4, class A5, class A6, class A7 > class rrlist7 @@ -1100,9 +1148,17 @@ public: template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist7 a( a1_, a2_, a3_, a4_, a5_, a6_, a7_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist7 a( a1_, a2_, a3_, a4_, a5_, a6_, a7_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > class rrlist8 @@ -1146,9 +1202,17 @@ public: template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist8 a( a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist8 a( a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > class rrlist9 @@ -1195,9 +1259,17 @@ public: template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist9 a( a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_, a9_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist9 a( a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_, a9_ ); + return b.eval( a ); + } }; template class bind_t diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index ce68da4..179d1d1 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -55,4 +55,5 @@ test-suite "bind" [ run bind_function_ap_test.cpp ] [ run bind_type_test.cpp ] [ run bind_unique_ptr_test.cpp ] + [ run bind_nested_rv_test.cpp ] ; diff --git a/test/bind_nested_rv_test.cpp b/test/bind_nested_rv_test.cpp new file mode 100644 index 0000000..281088f --- /dev/null +++ b/test/bind_nested_rv_test.cpp @@ -0,0 +1,177 @@ +#include + +// +// bind_nested_rv_test.cpp +// +// Copyright (c) 2016 Peter Dimov +// +// 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 +#include +#include +#include + +// + +bool f1( boost::shared_ptr p1 ) +{ + BOOST_TEST( p1 != 0 && *p1 == 1 ); + return true; +} + +bool f2( boost::shared_ptr p1, boost::shared_ptr p2 ) +{ + BOOST_TEST( p1 != 0 && *p1 == 1 ); + BOOST_TEST( p2 != 0 && *p2 == 2 ); + return true; +} + +bool f3( boost::shared_ptr p1, boost::shared_ptr p2, boost::shared_ptr p3 ) +{ + BOOST_TEST( p1 != 0 && *p1 == 1 ); + BOOST_TEST( p2 != 0 && *p2 == 2 ); + BOOST_TEST( p3 != 0 && *p3 == 3 ); + return true; +} + +bool f4( boost::shared_ptr p1, boost::shared_ptr p2, boost::shared_ptr p3, boost::shared_ptr p4 ) +{ + BOOST_TEST( p1 != 0 && *p1 == 1 ); + BOOST_TEST( p2 != 0 && *p2 == 2 ); + BOOST_TEST( p3 != 0 && *p3 == 3 ); + BOOST_TEST( p4 != 0 && *p4 == 4 ); + return true; +} + +bool f5( boost::shared_ptr p1, boost::shared_ptr p2, boost::shared_ptr p3, boost::shared_ptr p4, boost::shared_ptr p5 ) +{ + BOOST_TEST( p1 != 0 && *p1 == 1 ); + BOOST_TEST( p2 != 0 && *p2 == 2 ); + BOOST_TEST( p3 != 0 && *p3 == 3 ); + BOOST_TEST( p4 != 0 && *p4 == 4 ); + BOOST_TEST( p5 != 0 && *p5 == 5 ); + return true; +} + +bool f6( boost::shared_ptr p1, boost::shared_ptr p2, boost::shared_ptr p3, boost::shared_ptr p4, boost::shared_ptr p5, boost::shared_ptr p6 ) +{ + BOOST_TEST( p1 != 0 && *p1 == 1 ); + BOOST_TEST( p2 != 0 && *p2 == 2 ); + BOOST_TEST( p3 != 0 && *p3 == 3 ); + BOOST_TEST( p4 != 0 && *p4 == 4 ); + BOOST_TEST( p5 != 0 && *p5 == 5 ); + BOOST_TEST( p6 != 0 && *p6 == 6 ); + return true; +} + +bool f7( boost::shared_ptr p1, boost::shared_ptr p2, boost::shared_ptr p3, boost::shared_ptr p4, boost::shared_ptr p5, boost::shared_ptr p6, boost::shared_ptr p7 ) +{ + BOOST_TEST( p1 != 0 && *p1 == 1 ); + BOOST_TEST( p2 != 0 && *p2 == 2 ); + BOOST_TEST( p3 != 0 && *p3 == 3 ); + BOOST_TEST( p4 != 0 && *p4 == 4 ); + BOOST_TEST( p5 != 0 && *p5 == 5 ); + BOOST_TEST( p6 != 0 && *p6 == 6 ); + BOOST_TEST( p7 != 0 && *p7 == 7 ); + return true; +} + +bool f8( boost::shared_ptr p1, boost::shared_ptr p2, boost::shared_ptr p3, boost::shared_ptr p4, boost::shared_ptr p5, boost::shared_ptr p6, boost::shared_ptr p7, boost::shared_ptr p8 ) +{ + BOOST_TEST( p1 != 0 && *p1 == 1 ); + BOOST_TEST( p2 != 0 && *p2 == 2 ); + BOOST_TEST( p3 != 0 && *p3 == 3 ); + BOOST_TEST( p4 != 0 && *p4 == 4 ); + BOOST_TEST( p5 != 0 && *p5 == 5 ); + BOOST_TEST( p6 != 0 && *p6 == 6 ); + BOOST_TEST( p7 != 0 && *p7 == 7 ); + BOOST_TEST( p8 != 0 && *p8 == 8 ); + return true; +} + +bool f9( boost::shared_ptr p1, boost::shared_ptr p2, boost::shared_ptr p3, boost::shared_ptr p4, boost::shared_ptr p5, boost::shared_ptr p6, boost::shared_ptr p7, boost::shared_ptr p8, boost::shared_ptr p9 ) +{ + BOOST_TEST( p1 != 0 && *p1 == 1 ); + BOOST_TEST( p2 != 0 && *p2 == 2 ); + BOOST_TEST( p3 != 0 && *p3 == 3 ); + BOOST_TEST( p4 != 0 && *p4 == 4 ); + BOOST_TEST( p5 != 0 && *p5 == 5 ); + BOOST_TEST( p6 != 0 && *p6 == 6 ); + BOOST_TEST( p7 != 0 && *p7 == 7 ); + BOOST_TEST( p8 != 0 && *p8 == 8 ); + BOOST_TEST( p9 != 0 && *p9 == 9 ); + return true; +} + +void test() +{ + { + boost::function)> f( f1 ); + + ( boost::bind( f, _1 ) && boost::bind( f1, _1 ) )( boost::make_shared( 1 ) ); + } + + { + boost::function, boost::shared_ptr)> f( f2 ); + + ( boost::bind( f, _1, _2 ) && boost::bind( f2, _1, _2 ) )( boost::make_shared( 1 ), boost::make_shared( 2 ) ); + } + + { + boost::function, boost::shared_ptr, boost::shared_ptr)> f( f3 ); + + ( boost::bind( f, _1, _2, _3 ) && boost::bind( f3, _1, _2, _3 ) )( boost::make_shared( 1 ), boost::make_shared( 2 ), boost::make_shared( 3 ) ); + } + + { + boost::function, boost::shared_ptr, boost::shared_ptr)> f( f3 ); + + ( boost::bind( f, _1, _2, _3 ) && boost::bind( f3, _1, _2, _3 ) )( boost::make_shared( 1 ), boost::make_shared( 2 ), boost::make_shared( 3 ) ); + } + + { + boost::function, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr)> f( f4 ); + + ( boost::bind( f, _1, _2, _3, _4 ) && boost::bind( f4, _1, _2, _3, _4 ) )( boost::make_shared( 1 ), boost::make_shared( 2 ), boost::make_shared( 3 ), boost::make_shared( 4 ) ); + } + + { + boost::function, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr)> f( f5 ); + + ( boost::bind( f, _1, _2, _3, _4, _5 ) && boost::bind( f5, _1, _2, _3, _4, _5 ) )( boost::make_shared( 1 ), boost::make_shared( 2 ), boost::make_shared( 3 ), boost::make_shared( 4 ), boost::make_shared( 5 ) ); + } + + { + boost::function, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr)> f( f6 ); + + ( boost::bind( f, _1, _2, _3, _4, _5, _6 ) && boost::bind( f6, _1, _2, _3, _4, _5, _6 ) )( boost::make_shared( 1 ), boost::make_shared( 2 ), boost::make_shared( 3 ), boost::make_shared( 4 ), boost::make_shared( 5 ), boost::make_shared( 6 ) ); + } + + { + boost::function, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr)> f( f7 ); + + ( boost::bind( f, _1, _2, _3, _4, _5, _6, _7 ) && boost::bind( f7, _1, _2, _3, _4, _5, _6, _7 ) )( boost::make_shared( 1 ), boost::make_shared( 2 ), boost::make_shared( 3 ), boost::make_shared( 4 ), boost::make_shared( 5 ), boost::make_shared( 6 ), boost::make_shared( 7 ) ); + } + + { + boost::function, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr)> f( f8 ); + + ( boost::bind( f, _1, _2, _3, _4, _5, _6, _7, _8 ) && boost::bind( f8, _1, _2, _3, _4, _5, _6, _7, _8 ) )( boost::make_shared( 1 ), boost::make_shared( 2 ), boost::make_shared( 3 ), boost::make_shared( 4 ), boost::make_shared( 5 ), boost::make_shared( 6 ), boost::make_shared( 7 ), boost::make_shared( 8 ) ); + } + + { + boost::function, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr, boost::shared_ptr)> f( f9 ); + + ( boost::bind( f, _1, _2, _3, _4, _5, _6, _7, _8, _9 ) && boost::bind( f9, _1, _2, _3, _4, _5, _6, _7, _8, _9 ) )( boost::make_shared( 1 ), boost::make_shared( 2 ), boost::make_shared( 3 ), boost::make_shared( 4 ), boost::make_shared( 5 ), boost::make_shared( 6 ), boost::make_shared( 7 ), boost::make_shared( 8 ), boost::make_shared( 9 ) ); + } +} + +int main() +{ + test(); + return boost::report_errors(); +}