diff --git a/test/Jamfile b/test/Jamfile index 69fe638..5ac58f5 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -28,10 +28,12 @@ DEPENDS all : bind ; [ run bind_rel_test.cpp ] [ run bind_function_test.cpp ] [ run bind_lookup_problem_test.cpp ] + [ run bind_rv_sp_test.cpp ] [ run mem_fn_test.cpp ] [ run mem_fn_void_test.cpp ] [ run mem_fn_derived_test.cpp ] [ run mem_fn_eq_test.cpp ] [ run mem_fn_dm_test.cpp ] + [ run mem_fn_rv_test.cpp ] ; } diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index ff1d2bb..12f1739 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -22,9 +22,11 @@ test-suite "bind" [ run bind_rel_test.cpp ] [ run bind_function_test.cpp ] [ run bind_lookup_problem_test.cpp ] + [ run bind_rv_sp_test.cpp ] [ run mem_fn_test.cpp ] [ run mem_fn_void_test.cpp ] [ run mem_fn_derived_test.cpp ] [ run mem_fn_eq_test.cpp ] [ run mem_fn_dm_test.cpp ] + [ run mem_fn_rv_test.cpp ] ; diff --git a/test/bind_rv_sp_test.cpp b/test/bind_rv_sp_test.cpp new file mode 100644 index 0000000..b5853cd --- /dev/null +++ b/test/bind_rv_sp_test.cpp @@ -0,0 +1,64 @@ +#include + +#if defined(BOOST_MSVC) +#pragma warning(disable: 4786) // identifier truncated in debug info +#pragma warning(disable: 4710) // function not inlined +#pragma warning(disable: 4711) // function selected for automatic inline expansion +#pragma warning(disable: 4514) // unreferenced inline removed +#endif + +// +// bind_rv_sp_test.cpp - smart pointer returned by value from an inner bind +// +// Copyright (c) 2005 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 + +#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) +#pragma warning(push, 3) +#endif + +#include + +#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) +#pragma warning(pop) +#endif + +#include +#include + +struct X +{ + int v_; + + X( int v ): v_( v ) + { + } + + int f() + { + return v_; + } +}; + +struct Y +{ + boost::shared_ptr f() + { + return boost::shared_ptr( new X( 42 ) ); + } +}; + +int main() +{ + Y y; + + BOOST_TEST( boost::bind( &X::f, boost::bind( &Y::f, &y ) )() == 42 ); + + return boost::report_errors(); +} diff --git a/test/mem_fn_rv_test.cpp b/test/mem_fn_rv_test.cpp new file mode 100644 index 0000000..060aa8f --- /dev/null +++ b/test/mem_fn_rv_test.cpp @@ -0,0 +1,144 @@ +#include + +#if defined(BOOST_MSVC) +#pragma warning(disable: 4786) // identifier truncated in debug info +#pragma warning(disable: 4710) // function not inlined +#pragma warning(disable: 4711) // function selected for automatic inline expansion +#pragma warning(disable: 4514) // unreferenced inline removed +#endif + +// +// mem_fn_test.cpp - mem_fn.hpp with rvalues +// +// Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. +// Copyright (c) 2005 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 + +#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) +#pragma warning(push, 3) +#endif + +#include + +#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) +#pragma warning(pop) +#endif + +unsigned int hash = 0; + +struct X +{ + int f0() { f1(17); return 0; } + int g0() const { g1(17); return 0; } + + int f1(int a1) { hash = (hash * 17041 + a1) % 32768; return 0; } + int g1(int a1) const { hash = (hash * 17041 + a1 * 2) % 32768; return 0; } + + int f2(int a1, int a2) { f1(a1); f1(a2); return 0; } + int g2(int a1, int a2) const { g1(a1); g1(a2); return 0; } + + int f3(int a1, int a2, int a3) { f2(a1, a2); f1(a3); return 0; } + int g3(int a1, int a2, int a3) const { g2(a1, a2); g1(a3); return 0; } + + int f4(int a1, int a2, int a3, int a4) { f3(a1, a2, a3); f1(a4); return 0; } + int g4(int a1, int a2, int a3, int a4) const { g3(a1, a2, a3); g1(a4); return 0; } + + int f5(int a1, int a2, int a3, int a4, int a5) { f4(a1, a2, a3, a4); f1(a5); return 0; } + int g5(int a1, int a2, int a3, int a4, int a5) const { g4(a1, a2, a3, a4); g1(a5); return 0; } + + int f6(int a1, int a2, int a3, int a4, int a5, int a6) { f5(a1, a2, a3, a4, a5); f1(a6); return 0; } + int g6(int a1, int a2, int a3, int a4, int a5, int a6) const { g5(a1, a2, a3, a4, a5); g1(a6); return 0; } + + int f7(int a1, int a2, int a3, int a4, int a5, int a6, int a7) { f6(a1, a2, a3, a4, a5, a6); f1(a7); return 0; } + int g7(int a1, int a2, int a3, int a4, int a5, int a6, int a7) const { g6(a1, a2, a3, a4, a5, a6); g1(a7); return 0; } + + int f8(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) { f7(a1, a2, a3, a4, a5, a6, a7); f1(a8); return 0; } + int g8(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) const { g7(a1, a2, a3, a4, a5, a6, a7); g1(a8); return 0; } +}; + +int detect_errors(bool x) +{ + if( x ) + { + std::cerr << "no errors detected.\n"; + return 0; + } + else + { + std::cerr << "test failed.\n"; + return 1; + } +} + +boost::shared_ptr make() +{ + return boost::shared_ptr( new X ); +} + +int main() +{ + using boost::mem_fn; + + mem_fn(&X::f0)( X() ); + mem_fn(&X::f0)( make() ); + + mem_fn(&X::g0)( X() ); + mem_fn(&X::g0)( make() ); + + mem_fn(&X::f1)( X(), 1 ); + mem_fn(&X::f1)( make(), 1 ); + + mem_fn(&X::g1)( X(), 1 ); + mem_fn(&X::g1)( make(), 1 ); + + mem_fn(&X::f2)( X(), 1, 2 ); + mem_fn(&X::f2)( make(), 1, 2 ); + + mem_fn(&X::g2)( X(), 1, 2 ); + mem_fn(&X::g2)( make(), 1, 2 ); + + mem_fn(&X::f3)( X(), 1, 2, 3 ); + mem_fn(&X::f3)( make(), 1, 2, 3 ); + + mem_fn(&X::g3)( X(), 1, 2, 3 ); + mem_fn(&X::g3)( make(), 1, 2, 3 ); + + mem_fn(&X::f4)( X(), 1, 2, 3, 4 ); + mem_fn(&X::f4)( make(), 1, 2, 3, 4 ); + + mem_fn(&X::g4)( X(), 1, 2, 3, 4 ); + mem_fn(&X::g4)( make(), 1, 2, 3, 4 ); + + mem_fn(&X::f5)( X(), 1, 2, 3, 4, 5 ); + mem_fn(&X::f5)( make(), 1, 2, 3, 4, 5 ); + + mem_fn(&X::g5)( X(), 1, 2, 3, 4, 5 ); + mem_fn(&X::g5)( make(), 1, 2, 3, 4, 5 ); + + mem_fn(&X::f6)( X(), 1, 2, 3, 4, 5, 6 ); + mem_fn(&X::f6)( make(), 1, 2, 3, 4, 5, 6 ); + + mem_fn(&X::g6)( X(), 1, 2, 3, 4, 5, 6 ); + mem_fn(&X::g6)( make(), 1, 2, 3, 4, 5, 6 ); + + mem_fn(&X::f7)( X(), 1, 2, 3, 4, 5, 6, 7 ); + mem_fn(&X::f7)( make(), 1, 2, 3, 4, 5, 6, 7 ); + + mem_fn(&X::g7)( X(), 1, 2, 3, 4, 5, 6, 7 ); + mem_fn(&X::g7)( make(), 1, 2, 3, 4, 5, 6, 7 ); + + mem_fn(&X::f8)( X(), 1, 2, 3, 4, 5, 6, 7, 8 ); + mem_fn(&X::f8)( make(), 1, 2, 3, 4, 5, 6, 7, 8 ); + + mem_fn(&X::g8)( X(), 1, 2, 3, 4, 5, 6, 7, 8 ); + mem_fn(&X::g8)( make(), 1, 2, 3, 4, 5, 6, 7, 8 ); + + return detect_errors( hash == 23558 ); +}