diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 31258515..f778a2db 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -83,3 +83,6 @@ run apply_test.cpp ; run apply_test2.cpp ; run apply_rv_test.cpp ; run apply_rv_test2.cpp ; +run mem_fn_cdecl_ref_test.cpp ; +run mem_fn_stdcall_ref_test.cpp ; +run mem_fn_fastcall_ref_test.cpp ; diff --git a/test/mem_fn_cdecl_ref_test.cpp b/test/mem_fn_cdecl_ref_test.cpp new file mode 100644 index 00000000..76582bee --- /dev/null +++ b/test/mem_fn_cdecl_ref_test.cpp @@ -0,0 +1,61 @@ +#include + +#ifndef BOOST_MSVC + +int main() +{ +} + +#else + +// +// mem_fn_cdecl_ref_test.cpp - reference_wrapper, cdecl +// +// Copyright 2009, 2024 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 +// + +#define BOOST_MEM_FN_ENABLE_CDECL + +#include +#include +#include + +struct X +{ + int __cdecl f0() { return 1; } + int __cdecl g0() const { return -1; } + + int __cdecl f1( int x1 ) { return x1; } + int __cdecl g1( int x1 ) const { return -x1; } + + int __cdecl f2( int x1, int x2 ) { return x1+x2; } + int __cdecl g2( int x1, int x2 ) const { return -x1-x2; } + + int __cdecl f3( int x1, int x2, int x3 ) { return x1+x2+x3; } + int __cdecl g3( int x1, int x2, int x3 ) const { return -x1-x2-x3; } +}; + +int main() +{ + X x; + + BOOST_TEST_EQ( boost::mem_fn( &X::f0 )( boost::ref( x ) ), 1 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g0 )( boost::cref( x ) ), -1 ); + + BOOST_TEST_EQ( boost::mem_fn( &X::f1 )( boost::ref( x ), 1 ), 1 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g1 )( boost::cref( x ), 1 ), -1 ); + + BOOST_TEST_EQ( boost::mem_fn( &X::f2 )( boost::ref( x ), 1, 2 ), 1+2 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g2 )( boost::cref( x ), 1, 2 ), -1-2 ); + + BOOST_TEST_EQ( boost::mem_fn( &X::f3 )( boost::ref( x ), 1, 2, 3 ), 1+2+3 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g3 )( boost::cref( x ), 1, 2, 3 ), -1-2-3 ); + + return boost::report_errors(); +} + +#endif \ No newline at end of file diff --git a/test/mem_fn_fastcall_ref_test.cpp b/test/mem_fn_fastcall_ref_test.cpp new file mode 100644 index 00000000..9b20baab --- /dev/null +++ b/test/mem_fn_fastcall_ref_test.cpp @@ -0,0 +1,61 @@ +#include + +#ifndef BOOST_MSVC + +int main() +{ +} + +#else + +// +// mem_fn_fastcall_ref_test.cpp - reference_wrapper, fastcall +// +// Copyright 2009, 2024 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 +// + +#define BOOST_MEM_FN_ENABLE_FASTCALL + +#include +#include +#include + +struct X +{ + int __fastcall f0() { return 1; } + int __fastcall g0() const { return -1; } + + int __fastcall f1( int x1 ) { return x1; } + int __fastcall g1( int x1 ) const { return -x1; } + + int __fastcall f2( int x1, int x2 ) { return x1+x2; } + int __fastcall g2( int x1, int x2 ) const { return -x1-x2; } + + int __fastcall f3( int x1, int x2, int x3 ) { return x1+x2+x3; } + int __fastcall g3( int x1, int x2, int x3 ) const { return -x1-x2-x3; } +}; + +int main() +{ + X x; + + BOOST_TEST_EQ( boost::mem_fn( &X::f0 )( boost::ref( x ) ), 1 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g0 )( boost::cref( x ) ), -1 ); + + BOOST_TEST_EQ( boost::mem_fn( &X::f1 )( boost::ref( x ), 1 ), 1 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g1 )( boost::cref( x ), 1 ), -1 ); + + BOOST_TEST_EQ( boost::mem_fn( &X::f2 )( boost::ref( x ), 1, 2 ), 1+2 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g2 )( boost::cref( x ), 1, 2 ), -1-2 ); + + BOOST_TEST_EQ( boost::mem_fn( &X::f3 )( boost::ref( x ), 1, 2, 3 ), 1+2+3 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g3 )( boost::cref( x ), 1, 2, 3 ), -1-2-3 ); + + return boost::report_errors(); +} + +#endif \ No newline at end of file diff --git a/test/mem_fn_ref_test.cpp b/test/mem_fn_ref_test.cpp index 08382b8d..9e0b49e5 100644 --- a/test/mem_fn_ref_test.cpp +++ b/test/mem_fn_ref_test.cpp @@ -1,7 +1,7 @@ // // mem_fn_ref_test.cpp - reference_wrapper // -// Copyright (c) 2009 Peter Dimov +// Copyright 2009, 2024 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at @@ -14,23 +14,34 @@ struct X { - int f() - { - return 1; - } - - int g() const - { - return 2; - } + int f0() { return 1; } + int g0() const { return -1; } + + int f1( int x1 ) { return x1; } + int g1( int x1 ) const { return -x1; } + + int f2( int x1, int x2 ) { return x1+x2; } + int g2( int x1, int x2 ) const { return -x1-x2; } + + int f3( int x1, int x2, int x3 ) { return x1+x2+x3; } + int g3( int x1, int x2, int x3 ) const { return -x1-x2-x3; } }; int main() { X x; - BOOST_TEST( boost::mem_fn( &X::f )( boost::ref( x ) ) == 1 ); - BOOST_TEST( boost::mem_fn( &X::g )( boost::cref( x ) ) == 2 ); + BOOST_TEST_EQ( boost::mem_fn( &X::f0 )( boost::ref( x ) ), 1 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g0 )( boost::cref( x ) ), -1 ); + + BOOST_TEST_EQ( boost::mem_fn( &X::f1 )( boost::ref( x ), 1 ), 1 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g1 )( boost::cref( x ), 1 ), -1 ); + + BOOST_TEST_EQ( boost::mem_fn( &X::f2 )( boost::ref( x ), 1, 2 ), 1+2 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g2 )( boost::cref( x ), 1, 2 ), -1-2 ); + + BOOST_TEST_EQ( boost::mem_fn( &X::f3 )( boost::ref( x ), 1, 2, 3 ), 1+2+3 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g3 )( boost::cref( x ), 1, 2, 3 ), -1-2-3 ); return boost::report_errors(); } diff --git a/test/mem_fn_stdcall_ref_test.cpp b/test/mem_fn_stdcall_ref_test.cpp new file mode 100644 index 00000000..cc93d55d --- /dev/null +++ b/test/mem_fn_stdcall_ref_test.cpp @@ -0,0 +1,61 @@ +#include + +#ifndef BOOST_MSVC + +int main() +{ +} + +#else + +// +// mem_fn_stdcall_ref_test.cpp - reference_wrapper, stdcall +// +// Copyright 2009, 2024 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 +// + +#define BOOST_MEM_FN_ENABLE_STDCALL + +#include +#include +#include + +struct X +{ + int __stdcall f0() { return 1; } + int __stdcall g0() const { return -1; } + + int __stdcall f1( int x1 ) { return x1; } + int __stdcall g1( int x1 ) const { return -x1; } + + int __stdcall f2( int x1, int x2 ) { return x1+x2; } + int __stdcall g2( int x1, int x2 ) const { return -x1-x2; } + + int __stdcall f3( int x1, int x2, int x3 ) { return x1+x2+x3; } + int __stdcall g3( int x1, int x2, int x3 ) const { return -x1-x2-x3; } +}; + +int main() +{ + X x; + + BOOST_TEST_EQ( boost::mem_fn( &X::f0 )( boost::ref( x ) ), 1 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g0 )( boost::cref( x ) ), -1 ); + + BOOST_TEST_EQ( boost::mem_fn( &X::f1 )( boost::ref( x ), 1 ), 1 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g1 )( boost::cref( x ), 1 ), -1 ); + + BOOST_TEST_EQ( boost::mem_fn( &X::f2 )( boost::ref( x ), 1, 2 ), 1+2 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g2 )( boost::cref( x ), 1, 2 ), -1-2 ); + + BOOST_TEST_EQ( boost::mem_fn( &X::f3 )( boost::ref( x ), 1, 2, 3 ), 1+2+3 ); + BOOST_TEST_EQ( boost::mem_fn( &X::g3 )( boost::cref( x ), 1, 2, 3 ), -1-2-3 ); + + return boost::report_errors(); +} + +#endif \ No newline at end of file