2001-06-22 14:13:03 +00:00
|
|
|
// Boost.Function library
|
|
|
|
|
2004-07-25 02:59:30 +00:00
|
|
|
// Copyright Douglas Gregor 2001-2003. Use, modification and
|
2003-10-01 04:10:37 +00:00
|
|
|
// distribution is subject to 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)
|
2001-06-22 14:13:03 +00:00
|
|
|
|
|
|
|
// For more information, see http://www.boost.org
|
|
|
|
|
2002-11-09 16:02:47 +00:00
|
|
|
#include <boost/test/minimal.hpp>
|
2001-06-21 17:01:43 +00:00
|
|
|
#include <boost/function.hpp>
|
|
|
|
#include <functional>
|
|
|
|
#include <string>
|
2002-11-04 18:19:01 +00:00
|
|
|
#include <utility>
|
2001-06-21 17:01:43 +00:00
|
|
|
|
Merge various function changes from trunk.
Merged revisions 49571,50064,51743,51745,53722,54616-54619 via svnmerge from
https://svn.boost.org/svn/boost/trunk
........
r49571 | noel_belcourt | 2008-11-03 18:37:49 +0000 (Mon, 03 Nov 2008) | 9 lines
Both Sun and Pgi on Linux correctly put typeinfo into the std
namespace, but function_base keys off the
BOOST_NO_EXCEPTION_STD_NAMESPACE macro instead of the
BOOST_NO_STD_TYPEINFO macro. The attached patch changes
function_base to use the typeinfo macro. Because eVC 4.2 doesn't
put typeinfo into the std namespace, I need to define
BOOST_NO_STD_TYPEINFO only for this eVC version.
........
r50064 | johnmaddock | 2008-12-02 10:10:46 +0000 (Tue, 02 Dec 2008) | 1 line
Fix -Wundef warning and suspect usage of BOOST_STRICT_CONFIG.
........
r51743 | dgregor | 2009-03-13 05:23:53 +0000 (Fri, 13 Mar 2009) | 11 lines
Implement an optimization that David Abrahams and myself came up with,
where Boost.Function uses a bit in the vtable pointer to indicate when
the target function object has a trivial copy constructor, trivial
destructor, and fits within the small object buffer. In this case, we
just copy the bits of the function object rather than performing an
indirect call to the manager.
This results in a 60% speedup on a micro-benchmark that copies and
calls such function objects repeatedly.
........
r51745 | dgregor | 2009-03-13 05:49:02 +0000 (Fri, 13 Mar 2009) | 7 lines
Make Boost.Function compile under BOOST_NO_EXCEPTIONS.
Fixes #2499
Fixes #2494
Fixes #2469
Fixes #2466
........
r53722 | vladimir_prus | 2009-06-07 16:44:50 +0100 (Sun, 07 Jun 2009) | 4 lines
Make Boost.Function compile with disabled exceptions.
Closes #2900. Patch from Gabi Davar.
........
r54616 | danieljames | 2009-07-03 23:20:26 +0100 (Fri, 03 Jul 2009) | 3 lines
When copying boost::ref, copy even when the referenced function is empty. Fixes #2642
Patch by Steven Watanabe
........
r54617 | danieljames | 2009-07-03 23:20:52 +0100 (Fri, 03 Jul 2009) | 6 lines
Add 'and later versions' to support info for GCC and Visual C++. Fixes #2847.
I didn't explicitly specify the versions since no one's updating this
list and it's highly unlikely that a future version will break this. The
same could probably be done for the other compilers but I don't know
them very well so I'm leaving them alone.
........
r54618 | danieljames | 2009-07-03 23:21:40 +0100 (Fri, 03 Jul 2009) | 4 lines
Fix Boost.Function unit tests for C++0x. Fixes #3012
Based on a patch from Richard Webb. Changed a bit so that it also
works for the Visual C++ 10 beta.
........
r54619 | danieljames | 2009-07-03 23:22:03 +0100 (Fri, 03 Jul 2009) | 3 lines
Work around Visual C++ copy constructor bug. Fixes #2929.
Based on the patch by Steven Watanabe.
........
[SVN r54824]
2009-07-08 23:23:52 +00:00
|
|
|
using boost::function;
|
|
|
|
using std::string;
|
2001-06-21 17:01:43 +00:00
|
|
|
|
2001-07-22 05:03:43 +00:00
|
|
|
int global_int;
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
struct write_five_obj { void operator()() const { global_int = 5; } };
|
|
|
|
struct write_three_obj { int operator()() const { global_int = 3; return 7; }};
|
|
|
|
static void write_five() { global_int = 5; }
|
|
|
|
static void write_three() { global_int = 3; }
|
|
|
|
struct generate_five_obj { int operator()() const { return 5; } };
|
|
|
|
struct generate_three_obj { int operator()() const { return 3; } };
|
|
|
|
static int generate_five() { return 5; }
|
|
|
|
static int generate_three() { return 3; }
|
|
|
|
static string identity_str(const string& s) { return s; }
|
|
|
|
static string string_cat(const string& s1, const string& s2) { return s1+s2; }
|
|
|
|
static int sum_ints(int x, int y) { return x+y; }
|
|
|
|
|
|
|
|
struct write_const_1_nonconst_2
|
|
|
|
{
|
|
|
|
void operator()() { global_int = 2; }
|
|
|
|
void operator()() const { global_int = 1; }
|
|
|
|
};
|
|
|
|
|
2001-10-08 13:33:14 +00:00
|
|
|
struct add_to_obj
|
|
|
|
{
|
|
|
|
add_to_obj(int v) : value(v) {}
|
|
|
|
|
|
|
|
int operator()(int x) const { return value + x; }
|
|
|
|
|
|
|
|
int value;
|
|
|
|
};
|
|
|
|
|
2001-06-21 17:01:43 +00:00
|
|
|
static void
|
|
|
|
test_zero_args()
|
|
|
|
{
|
2002-08-05 06:13:32 +00:00
|
|
|
typedef function<void ()> func_void_type;
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
write_five_obj five;
|
|
|
|
write_three_obj three;
|
|
|
|
|
|
|
|
// Default construction
|
|
|
|
func_void_type v1;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v1.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
2002-10-08 02:32:38 +00:00
|
|
|
// Assignment to an empty function
|
2001-06-21 17:01:43 +00:00
|
|
|
v1 = five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v1 != 0);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation of a function
|
|
|
|
global_int = 0;
|
|
|
|
v1();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// clear() method
|
|
|
|
v1.clear();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v1 == 0);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to an empty function
|
|
|
|
v1 = three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v1.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
2001-06-26 13:41:10 +00:00
|
|
|
// Invocation and self-assignment
|
2001-06-21 17:01:43 +00:00
|
|
|
global_int = 0;
|
2001-06-26 13:41:10 +00:00
|
|
|
v1 = v1;
|
2001-06-21 17:01:43 +00:00
|
|
|
v1();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function
|
|
|
|
v1 = five;
|
|
|
|
|
2001-06-26 13:41:10 +00:00
|
|
|
// Invocation and self-assignment
|
2001-06-21 17:01:43 +00:00
|
|
|
global_int = 0;
|
2002-07-19 20:45:36 +00:00
|
|
|
v1 = (v1);
|
2001-06-21 17:01:43 +00:00
|
|
|
v1();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
2002-10-08 02:32:38 +00:00
|
|
|
// clear
|
2002-11-09 16:02:47 +00:00
|
|
|
v1 = 0;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(0 == v1);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to an empty function from a free function
|
2001-12-24 17:11:11 +00:00
|
|
|
v1 = BOOST_FUNCTION_TARGET_FIX(&) write_five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(0 != v1);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v1();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function from a free function
|
2001-12-24 17:11:11 +00:00
|
|
|
v1 = BOOST_FUNCTION_TARGET_FIX(&) write_three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v1.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v1();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment
|
|
|
|
v1 = five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v1.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v1();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function from a free function
|
|
|
|
v1 = &write_three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v1.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v1();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Construction from another function (that is empty)
|
|
|
|
v1.clear();
|
2001-06-29 19:35:40 +00:00
|
|
|
func_void_type v2(v1);
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v2? true : false);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to an empty function
|
|
|
|
v2 = three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v2.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v2();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function
|
2002-07-19 20:45:36 +00:00
|
|
|
v2 = (five);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v2();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
v2.clear();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v2.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to an empty function from a free function
|
2002-07-19 20:45:36 +00:00
|
|
|
v2 = (BOOST_FUNCTION_TARGET_FIX(&) write_five);
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v2? true : false);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v2();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function from a free function
|
2001-12-24 17:11:11 +00:00
|
|
|
v2 = BOOST_FUNCTION_TARGET_FIX(&) write_three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v2.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v2();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Swapping
|
|
|
|
v1 = five;
|
|
|
|
swap(v1, v2);
|
|
|
|
v2();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
v1();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
swap(v1, v2);
|
|
|
|
v1.clear();
|
|
|
|
|
|
|
|
// Assignment
|
|
|
|
v2 = five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v2.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v2();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function from a free function
|
|
|
|
v2 = &write_three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v2.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v2();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a function from an empty function
|
|
|
|
v2 = v1;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v2.empty());
|
2002-10-08 02:32:38 +00:00
|
|
|
|
2001-06-21 17:01:43 +00:00
|
|
|
// Assignment to a function from a function with a functor
|
|
|
|
v1 = three;
|
|
|
|
v2 = v1;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v1.empty());
|
|
|
|
BOOST_CHECK(!v2.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v1();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
global_int = 0;
|
|
|
|
v2();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assign to a function from a function with a function
|
2001-12-24 17:11:11 +00:00
|
|
|
v2 = BOOST_FUNCTION_TARGET_FIX(&) write_five;
|
2001-06-21 17:01:43 +00:00
|
|
|
v1 = v2;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v1.empty());
|
|
|
|
BOOST_CHECK(!v2.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
global_int = 0;
|
|
|
|
v1();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
global_int = 0;
|
|
|
|
v2();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Construct a function given another function containing a function
|
2001-06-29 19:35:40 +00:00
|
|
|
func_void_type v3(v1);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation of a function
|
|
|
|
global_int = 0;
|
|
|
|
v3();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2002-10-08 02:32:38 +00:00
|
|
|
|
2001-06-21 17:01:43 +00:00
|
|
|
// clear() method
|
|
|
|
v3.clear();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v3? true : false);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to an empty function
|
|
|
|
v3 = three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v3.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v3();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function
|
|
|
|
v3 = five;
|
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v3();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// clear()
|
|
|
|
v3.clear();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v3.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to an empty function from a free function
|
|
|
|
v3 = &write_five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v3.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v3();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function from a free function
|
|
|
|
v3 = &write_three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v3.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v3();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment
|
|
|
|
v3 = five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v3.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v3();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Construction of a function from a function containing a functor
|
|
|
|
func_void_type v4(v3);
|
|
|
|
|
|
|
|
// Invocation of a function
|
|
|
|
global_int = 0;
|
|
|
|
v4();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2002-10-08 02:32:38 +00:00
|
|
|
|
2001-06-21 17:01:43 +00:00
|
|
|
// clear() method
|
|
|
|
v4.clear();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v4.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to an empty function
|
|
|
|
v4 = three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v4.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v4();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function
|
|
|
|
v4 = five;
|
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v4();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// clear()
|
|
|
|
v4.clear();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v4.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to an empty function from a free function
|
|
|
|
v4 = &write_five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v4.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v4();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function from a free function
|
|
|
|
v4 = &write_three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v4.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v4();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment
|
|
|
|
v4 = five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v4.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v4();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Construction of a function from a functor
|
|
|
|
func_void_type v5(five);
|
|
|
|
|
|
|
|
// Invocation of a function
|
|
|
|
global_int = 0;
|
|
|
|
v5();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2002-10-08 02:32:38 +00:00
|
|
|
|
2001-06-21 17:01:43 +00:00
|
|
|
// clear() method
|
|
|
|
v5.clear();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v5.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to an empty function
|
|
|
|
v5 = three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v5.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v5();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function
|
|
|
|
v5 = five;
|
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v5();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// clear()
|
|
|
|
v5.clear();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v5.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to an empty function from a free function
|
|
|
|
v5 = &write_five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v5.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v5();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function from a free function
|
|
|
|
v5 = &write_three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v5.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v5();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment
|
|
|
|
v5 = five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v5.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v5();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Construction of a function from a function
|
|
|
|
func_void_type v6(&write_five);
|
|
|
|
|
|
|
|
// Invocation of a function
|
|
|
|
global_int = 0;
|
|
|
|
v6();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// clear() method
|
|
|
|
v6.clear();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v6.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to an empty function
|
|
|
|
v6 = three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v6.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v6();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function
|
|
|
|
v6 = five;
|
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v6();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// clear()
|
|
|
|
v6.clear();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v6.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to an empty function from a free function
|
|
|
|
v6 = &write_five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v6.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v6();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment to a non-empty function from a free function
|
|
|
|
v6 = &write_three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v6.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v6();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Assignment
|
|
|
|
v6 = five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!v6.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Invocation
|
|
|
|
global_int = 0;
|
|
|
|
v6();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Const vs. non-const
|
|
|
|
write_const_1_nonconst_2 one_or_two;
|
2002-08-05 06:13:32 +00:00
|
|
|
const function<void ()> v7(one_or_two);
|
|
|
|
function<void ()> v8(one_or_two);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
global_int = 0;
|
|
|
|
v7();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 2);
|
2002-10-08 02:32:38 +00:00
|
|
|
|
2001-06-21 17:01:43 +00:00
|
|
|
global_int = 0;
|
|
|
|
v8();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(global_int == 2);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
2002-11-09 16:02:47 +00:00
|
|
|
// Test construction from 0 and comparison to 0
|
|
|
|
func_void_type v9(0);
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(v9 == 0);
|
|
|
|
BOOST_CHECK(0 == v9);
|
2002-11-09 16:02:47 +00:00
|
|
|
|
2001-06-21 17:01:43 +00:00
|
|
|
// Test return values
|
2002-08-05 06:13:32 +00:00
|
|
|
typedef function<int ()> func_int_type;
|
2001-06-21 17:01:43 +00:00
|
|
|
generate_five_obj gen_five;
|
|
|
|
generate_three_obj gen_three;
|
|
|
|
|
|
|
|
func_int_type i0(gen_five);
|
|
|
|
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(i0() == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
i0 = gen_three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(i0() == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
i0 = &generate_five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(i0() == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
i0 = &generate_three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(i0() == 3);
|
|
|
|
BOOST_CHECK(i0? true : false);
|
2001-06-21 17:01:43 +00:00
|
|
|
i0.clear();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!i0? true : false);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
|
|
|
// Test return values with compatible types
|
2002-08-05 06:13:32 +00:00
|
|
|
typedef function<long ()> func_long_type;
|
2001-06-21 17:01:43 +00:00
|
|
|
func_long_type i1(gen_five);
|
|
|
|
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(i1() == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
i1 = gen_three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(i1() == 3);
|
2001-06-21 17:01:43 +00:00
|
|
|
i1 = &generate_five;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(i1() == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
i1 = &generate_three;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(i1() == 3);
|
|
|
|
BOOST_CHECK(i1? true : false);
|
2001-06-21 17:01:43 +00:00
|
|
|
i1.clear();
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(!i1? true : false);
|
2001-06-21 17:01:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
test_one_arg()
|
|
|
|
{
|
Merge various function changes from trunk.
Merged revisions 49571,50064,51743,51745,53722,54616-54619 via svnmerge from
https://svn.boost.org/svn/boost/trunk
........
r49571 | noel_belcourt | 2008-11-03 18:37:49 +0000 (Mon, 03 Nov 2008) | 9 lines
Both Sun and Pgi on Linux correctly put typeinfo into the std
namespace, but function_base keys off the
BOOST_NO_EXCEPTION_STD_NAMESPACE macro instead of the
BOOST_NO_STD_TYPEINFO macro. The attached patch changes
function_base to use the typeinfo macro. Because eVC 4.2 doesn't
put typeinfo into the std namespace, I need to define
BOOST_NO_STD_TYPEINFO only for this eVC version.
........
r50064 | johnmaddock | 2008-12-02 10:10:46 +0000 (Tue, 02 Dec 2008) | 1 line
Fix -Wundef warning and suspect usage of BOOST_STRICT_CONFIG.
........
r51743 | dgregor | 2009-03-13 05:23:53 +0000 (Fri, 13 Mar 2009) | 11 lines
Implement an optimization that David Abrahams and myself came up with,
where Boost.Function uses a bit in the vtable pointer to indicate when
the target function object has a trivial copy constructor, trivial
destructor, and fits within the small object buffer. In this case, we
just copy the bits of the function object rather than performing an
indirect call to the manager.
This results in a 60% speedup on a micro-benchmark that copies and
calls such function objects repeatedly.
........
r51745 | dgregor | 2009-03-13 05:49:02 +0000 (Fri, 13 Mar 2009) | 7 lines
Make Boost.Function compile under BOOST_NO_EXCEPTIONS.
Fixes #2499
Fixes #2494
Fixes #2469
Fixes #2466
........
r53722 | vladimir_prus | 2009-06-07 16:44:50 +0100 (Sun, 07 Jun 2009) | 4 lines
Make Boost.Function compile with disabled exceptions.
Closes #2900. Patch from Gabi Davar.
........
r54616 | danieljames | 2009-07-03 23:20:26 +0100 (Fri, 03 Jul 2009) | 3 lines
When copying boost::ref, copy even when the referenced function is empty. Fixes #2642
Patch by Steven Watanabe
........
r54617 | danieljames | 2009-07-03 23:20:52 +0100 (Fri, 03 Jul 2009) | 6 lines
Add 'and later versions' to support info for GCC and Visual C++. Fixes #2847.
I didn't explicitly specify the versions since no one's updating this
list and it's highly unlikely that a future version will break this. The
same could probably be done for the other compilers but I don't know
them very well so I'm leaving them alone.
........
r54618 | danieljames | 2009-07-03 23:21:40 +0100 (Fri, 03 Jul 2009) | 4 lines
Fix Boost.Function unit tests for C++0x. Fixes #3012
Based on a patch from Richard Webb. Changed a bit so that it also
works for the Visual C++ 10 beta.
........
r54619 | danieljames | 2009-07-03 23:22:03 +0100 (Fri, 03 Jul 2009) | 3 lines
Work around Visual C++ copy constructor bug. Fixes #2929.
Based on the patch by Steven Watanabe.
........
[SVN r54824]
2009-07-08 23:23:52 +00:00
|
|
|
std::negate<int> neg;
|
2001-06-21 17:01:43 +00:00
|
|
|
|
2002-08-05 06:13:32 +00:00
|
|
|
function<int (int)> f1(neg);
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(f1(5) == -5);
|
2001-06-21 17:01:43 +00:00
|
|
|
|
2002-08-05 06:13:32 +00:00
|
|
|
function<string (string)> id(&identity_str);
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(id("str") == "str");
|
2001-06-21 17:01:43 +00:00
|
|
|
|
2002-08-05 06:13:32 +00:00
|
|
|
function<string (const char*)> id2(&identity_str);
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(id2("foo") == "foo");
|
2001-10-08 13:33:14 +00:00
|
|
|
|
|
|
|
add_to_obj add_to(5);
|
2002-08-05 06:13:32 +00:00
|
|
|
function<int (int)> f2(add_to);
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(f2(3) == 8);
|
2001-10-08 13:33:14 +00:00
|
|
|
|
2002-08-05 06:13:32 +00:00
|
|
|
const function<int (int)> cf2(add_to);
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(cf2(3) == 8);
|
2001-06-21 17:01:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
test_two_args()
|
|
|
|
{
|
2002-08-05 06:13:32 +00:00
|
|
|
function<string (const string&, const string&)> cat(&string_cat);
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(cat("str", "ing") == "string");
|
2001-06-21 17:01:43 +00:00
|
|
|
|
2002-08-05 06:13:32 +00:00
|
|
|
function<int (short, short)> sum(&sum_ints);
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(sum(2, 3) == 5);
|
2001-06-21 17:01:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
test_emptiness()
|
|
|
|
{
|
2002-08-05 06:13:32 +00:00
|
|
|
function<float ()> f1;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(f1.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
2002-08-05 06:13:32 +00:00
|
|
|
function<float ()> f2;
|
2001-06-21 17:01:43 +00:00
|
|
|
f2 = f1;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(f2.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
|
2002-08-05 06:13:32 +00:00
|
|
|
function<double ()> f3;
|
2001-06-29 19:35:40 +00:00
|
|
|
f3 = f2;
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(f3.empty());
|
2001-06-21 17:01:43 +00:00
|
|
|
}
|
|
|
|
|
2001-10-16 19:24:04 +00:00
|
|
|
struct X {
|
|
|
|
X(int v) : value(v) {}
|
|
|
|
|
|
|
|
int twice() const { return 2*value; }
|
|
|
|
int plus(int v) { return value + v; }
|
|
|
|
|
|
|
|
int value;
|
|
|
|
};
|
|
|
|
|
|
|
|
static void
|
|
|
|
test_member_functions()
|
|
|
|
{
|
2002-08-05 06:13:32 +00:00
|
|
|
boost::function<int (X*)> f1(&X::twice);
|
2002-10-08 02:32:38 +00:00
|
|
|
|
2001-10-16 19:24:04 +00:00
|
|
|
X one(1);
|
|
|
|
X five(5);
|
|
|
|
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(f1(&one) == 2);
|
|
|
|
BOOST_CHECK(f1(&five) == 10);
|
2001-10-16 19:24:04 +00:00
|
|
|
|
2002-08-05 06:13:32 +00:00
|
|
|
boost::function<int (X*)> f1_2;
|
2001-10-16 19:24:04 +00:00
|
|
|
f1_2 = &X::twice;
|
|
|
|
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(f1_2(&one) == 2);
|
|
|
|
BOOST_CHECK(f1_2(&five) == 10);
|
2001-10-16 19:24:04 +00:00
|
|
|
|
2002-08-05 06:13:32 +00:00
|
|
|
boost::function<int (X&, int)> f2(&X::plus);
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(f2(one, 3) == 4);
|
|
|
|
BOOST_CHECK(f2(five, 4) == 9);
|
2001-10-16 19:24:04 +00:00
|
|
|
}
|
|
|
|
|
2001-12-03 16:25:00 +00:00
|
|
|
struct add_with_throw_on_copy {
|
|
|
|
int operator()(int x, int y) const { return x+y; }
|
|
|
|
|
|
|
|
add_with_throw_on_copy() {}
|
|
|
|
|
|
|
|
add_with_throw_on_copy(const add_with_throw_on_copy&)
|
|
|
|
{
|
Merge various function changes from trunk.
Merged revisions 49571,50064,51743,51745,53722,54616-54619 via svnmerge from
https://svn.boost.org/svn/boost/trunk
........
r49571 | noel_belcourt | 2008-11-03 18:37:49 +0000 (Mon, 03 Nov 2008) | 9 lines
Both Sun and Pgi on Linux correctly put typeinfo into the std
namespace, but function_base keys off the
BOOST_NO_EXCEPTION_STD_NAMESPACE macro instead of the
BOOST_NO_STD_TYPEINFO macro. The attached patch changes
function_base to use the typeinfo macro. Because eVC 4.2 doesn't
put typeinfo into the std namespace, I need to define
BOOST_NO_STD_TYPEINFO only for this eVC version.
........
r50064 | johnmaddock | 2008-12-02 10:10:46 +0000 (Tue, 02 Dec 2008) | 1 line
Fix -Wundef warning and suspect usage of BOOST_STRICT_CONFIG.
........
r51743 | dgregor | 2009-03-13 05:23:53 +0000 (Fri, 13 Mar 2009) | 11 lines
Implement an optimization that David Abrahams and myself came up with,
where Boost.Function uses a bit in the vtable pointer to indicate when
the target function object has a trivial copy constructor, trivial
destructor, and fits within the small object buffer. In this case, we
just copy the bits of the function object rather than performing an
indirect call to the manager.
This results in a 60% speedup on a micro-benchmark that copies and
calls such function objects repeatedly.
........
r51745 | dgregor | 2009-03-13 05:49:02 +0000 (Fri, 13 Mar 2009) | 7 lines
Make Boost.Function compile under BOOST_NO_EXCEPTIONS.
Fixes #2499
Fixes #2494
Fixes #2469
Fixes #2466
........
r53722 | vladimir_prus | 2009-06-07 16:44:50 +0100 (Sun, 07 Jun 2009) | 4 lines
Make Boost.Function compile with disabled exceptions.
Closes #2900. Patch from Gabi Davar.
........
r54616 | danieljames | 2009-07-03 23:20:26 +0100 (Fri, 03 Jul 2009) | 3 lines
When copying boost::ref, copy even when the referenced function is empty. Fixes #2642
Patch by Steven Watanabe
........
r54617 | danieljames | 2009-07-03 23:20:52 +0100 (Fri, 03 Jul 2009) | 6 lines
Add 'and later versions' to support info for GCC and Visual C++. Fixes #2847.
I didn't explicitly specify the versions since no one's updating this
list and it's highly unlikely that a future version will break this. The
same could probably be done for the other compilers but I don't know
them very well so I'm leaving them alone.
........
r54618 | danieljames | 2009-07-03 23:21:40 +0100 (Fri, 03 Jul 2009) | 4 lines
Fix Boost.Function unit tests for C++0x. Fixes #3012
Based on a patch from Richard Webb. Changed a bit so that it also
works for the Visual C++ 10 beta.
........
r54619 | danieljames | 2009-07-03 23:22:03 +0100 (Fri, 03 Jul 2009) | 3 lines
Work around Visual C++ copy constructor bug. Fixes #2929.
Based on the patch by Steven Watanabe.
........
[SVN r54824]
2009-07-08 23:23:52 +00:00
|
|
|
throw std::runtime_error("But this CAN'T throw");
|
2001-12-03 16:25:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
add_with_throw_on_copy& operator=(const add_with_throw_on_copy&)
|
|
|
|
{
|
Merge various function changes from trunk.
Merged revisions 49571,50064,51743,51745,53722,54616-54619 via svnmerge from
https://svn.boost.org/svn/boost/trunk
........
r49571 | noel_belcourt | 2008-11-03 18:37:49 +0000 (Mon, 03 Nov 2008) | 9 lines
Both Sun and Pgi on Linux correctly put typeinfo into the std
namespace, but function_base keys off the
BOOST_NO_EXCEPTION_STD_NAMESPACE macro instead of the
BOOST_NO_STD_TYPEINFO macro. The attached patch changes
function_base to use the typeinfo macro. Because eVC 4.2 doesn't
put typeinfo into the std namespace, I need to define
BOOST_NO_STD_TYPEINFO only for this eVC version.
........
r50064 | johnmaddock | 2008-12-02 10:10:46 +0000 (Tue, 02 Dec 2008) | 1 line
Fix -Wundef warning and suspect usage of BOOST_STRICT_CONFIG.
........
r51743 | dgregor | 2009-03-13 05:23:53 +0000 (Fri, 13 Mar 2009) | 11 lines
Implement an optimization that David Abrahams and myself came up with,
where Boost.Function uses a bit in the vtable pointer to indicate when
the target function object has a trivial copy constructor, trivial
destructor, and fits within the small object buffer. In this case, we
just copy the bits of the function object rather than performing an
indirect call to the manager.
This results in a 60% speedup on a micro-benchmark that copies and
calls such function objects repeatedly.
........
r51745 | dgregor | 2009-03-13 05:49:02 +0000 (Fri, 13 Mar 2009) | 7 lines
Make Boost.Function compile under BOOST_NO_EXCEPTIONS.
Fixes #2499
Fixes #2494
Fixes #2469
Fixes #2466
........
r53722 | vladimir_prus | 2009-06-07 16:44:50 +0100 (Sun, 07 Jun 2009) | 4 lines
Make Boost.Function compile with disabled exceptions.
Closes #2900. Patch from Gabi Davar.
........
r54616 | danieljames | 2009-07-03 23:20:26 +0100 (Fri, 03 Jul 2009) | 3 lines
When copying boost::ref, copy even when the referenced function is empty. Fixes #2642
Patch by Steven Watanabe
........
r54617 | danieljames | 2009-07-03 23:20:52 +0100 (Fri, 03 Jul 2009) | 6 lines
Add 'and later versions' to support info for GCC and Visual C++. Fixes #2847.
I didn't explicitly specify the versions since no one's updating this
list and it's highly unlikely that a future version will break this. The
same could probably be done for the other compilers but I don't know
them very well so I'm leaving them alone.
........
r54618 | danieljames | 2009-07-03 23:21:40 +0100 (Fri, 03 Jul 2009) | 4 lines
Fix Boost.Function unit tests for C++0x. Fixes #3012
Based on a patch from Richard Webb. Changed a bit so that it also
works for the Visual C++ 10 beta.
........
r54619 | danieljames | 2009-07-03 23:22:03 +0100 (Fri, 03 Jul 2009) | 3 lines
Work around Visual C++ copy constructor bug. Fixes #2929.
Based on the patch by Steven Watanabe.
........
[SVN r54824]
2009-07-08 23:23:52 +00:00
|
|
|
throw std::runtime_error("But this CAN'T throw");
|
2001-12-03 16:25:00 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
static void
|
|
|
|
test_ref()
|
|
|
|
{
|
|
|
|
add_with_throw_on_copy atc;
|
|
|
|
try {
|
Merge various function changes from trunk.
Merged revisions 49571,50064,51743,51745,53722,54616-54619 via svnmerge from
https://svn.boost.org/svn/boost/trunk
........
r49571 | noel_belcourt | 2008-11-03 18:37:49 +0000 (Mon, 03 Nov 2008) | 9 lines
Both Sun and Pgi on Linux correctly put typeinfo into the std
namespace, but function_base keys off the
BOOST_NO_EXCEPTION_STD_NAMESPACE macro instead of the
BOOST_NO_STD_TYPEINFO macro. The attached patch changes
function_base to use the typeinfo macro. Because eVC 4.2 doesn't
put typeinfo into the std namespace, I need to define
BOOST_NO_STD_TYPEINFO only for this eVC version.
........
r50064 | johnmaddock | 2008-12-02 10:10:46 +0000 (Tue, 02 Dec 2008) | 1 line
Fix -Wundef warning and suspect usage of BOOST_STRICT_CONFIG.
........
r51743 | dgregor | 2009-03-13 05:23:53 +0000 (Fri, 13 Mar 2009) | 11 lines
Implement an optimization that David Abrahams and myself came up with,
where Boost.Function uses a bit in the vtable pointer to indicate when
the target function object has a trivial copy constructor, trivial
destructor, and fits within the small object buffer. In this case, we
just copy the bits of the function object rather than performing an
indirect call to the manager.
This results in a 60% speedup on a micro-benchmark that copies and
calls such function objects repeatedly.
........
r51745 | dgregor | 2009-03-13 05:49:02 +0000 (Fri, 13 Mar 2009) | 7 lines
Make Boost.Function compile under BOOST_NO_EXCEPTIONS.
Fixes #2499
Fixes #2494
Fixes #2469
Fixes #2466
........
r53722 | vladimir_prus | 2009-06-07 16:44:50 +0100 (Sun, 07 Jun 2009) | 4 lines
Make Boost.Function compile with disabled exceptions.
Closes #2900. Patch from Gabi Davar.
........
r54616 | danieljames | 2009-07-03 23:20:26 +0100 (Fri, 03 Jul 2009) | 3 lines
When copying boost::ref, copy even when the referenced function is empty. Fixes #2642
Patch by Steven Watanabe
........
r54617 | danieljames | 2009-07-03 23:20:52 +0100 (Fri, 03 Jul 2009) | 6 lines
Add 'and later versions' to support info for GCC and Visual C++. Fixes #2847.
I didn't explicitly specify the versions since no one's updating this
list and it's highly unlikely that a future version will break this. The
same could probably be done for the other compilers but I don't know
them very well so I'm leaving them alone.
........
r54618 | danieljames | 2009-07-03 23:21:40 +0100 (Fri, 03 Jul 2009) | 4 lines
Fix Boost.Function unit tests for C++0x. Fixes #3012
Based on a patch from Richard Webb. Changed a bit so that it also
works for the Visual C++ 10 beta.
........
r54619 | danieljames | 2009-07-03 23:22:03 +0100 (Fri, 03 Jul 2009) | 3 lines
Work around Visual C++ copy constructor bug. Fixes #2929.
Based on the patch by Steven Watanabe.
........
[SVN r54824]
2009-07-08 23:23:52 +00:00
|
|
|
boost::function<int (int, int)> f(boost::ref(atc));
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(f(1, 3) == 4);
|
2001-12-03 16:25:00 +00:00
|
|
|
}
|
2018-10-19 01:46:27 +03:00
|
|
|
catch(std::runtime_error const&) {
|
2001-12-03 16:25:00 +00:00
|
|
|
BOOST_ERROR("Nonthrowing constructor threw an exception");
|
|
|
|
}
|
2001-12-05 22:39:33 +00:00
|
|
|
}
|
2001-12-03 16:25:00 +00:00
|
|
|
|
2017-12-17 02:18:11 +02:00
|
|
|
#if BOOST_WORKAROUND(BOOST_GCC, >= 70000 && BOOST_GCC < 80000) && __cplusplus >= 201700
|
|
|
|
|
|
|
|
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81311
|
|
|
|
#pragma message("Skipping test_empty_ref on g++ 7 -std=c++17")
|
|
|
|
|
|
|
|
static void test_empty_ref()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
Merge various function changes from trunk.
Merged revisions 49571,50064,51743,51745,53722,54616-54619 via svnmerge from
https://svn.boost.org/svn/boost/trunk
........
r49571 | noel_belcourt | 2008-11-03 18:37:49 +0000 (Mon, 03 Nov 2008) | 9 lines
Both Sun and Pgi on Linux correctly put typeinfo into the std
namespace, but function_base keys off the
BOOST_NO_EXCEPTION_STD_NAMESPACE macro instead of the
BOOST_NO_STD_TYPEINFO macro. The attached patch changes
function_base to use the typeinfo macro. Because eVC 4.2 doesn't
put typeinfo into the std namespace, I need to define
BOOST_NO_STD_TYPEINFO only for this eVC version.
........
r50064 | johnmaddock | 2008-12-02 10:10:46 +0000 (Tue, 02 Dec 2008) | 1 line
Fix -Wundef warning and suspect usage of BOOST_STRICT_CONFIG.
........
r51743 | dgregor | 2009-03-13 05:23:53 +0000 (Fri, 13 Mar 2009) | 11 lines
Implement an optimization that David Abrahams and myself came up with,
where Boost.Function uses a bit in the vtable pointer to indicate when
the target function object has a trivial copy constructor, trivial
destructor, and fits within the small object buffer. In this case, we
just copy the bits of the function object rather than performing an
indirect call to the manager.
This results in a 60% speedup on a micro-benchmark that copies and
calls such function objects repeatedly.
........
r51745 | dgregor | 2009-03-13 05:49:02 +0000 (Fri, 13 Mar 2009) | 7 lines
Make Boost.Function compile under BOOST_NO_EXCEPTIONS.
Fixes #2499
Fixes #2494
Fixes #2469
Fixes #2466
........
r53722 | vladimir_prus | 2009-06-07 16:44:50 +0100 (Sun, 07 Jun 2009) | 4 lines
Make Boost.Function compile with disabled exceptions.
Closes #2900. Patch from Gabi Davar.
........
r54616 | danieljames | 2009-07-03 23:20:26 +0100 (Fri, 03 Jul 2009) | 3 lines
When copying boost::ref, copy even when the referenced function is empty. Fixes #2642
Patch by Steven Watanabe
........
r54617 | danieljames | 2009-07-03 23:20:52 +0100 (Fri, 03 Jul 2009) | 6 lines
Add 'and later versions' to support info for GCC and Visual C++. Fixes #2847.
I didn't explicitly specify the versions since no one's updating this
list and it's highly unlikely that a future version will break this. The
same could probably be done for the other compilers but I don't know
them very well so I'm leaving them alone.
........
r54618 | danieljames | 2009-07-03 23:21:40 +0100 (Fri, 03 Jul 2009) | 4 lines
Fix Boost.Function unit tests for C++0x. Fixes #3012
Based on a patch from Richard Webb. Changed a bit so that it also
works for the Visual C++ 10 beta.
........
r54619 | danieljames | 2009-07-03 23:22:03 +0100 (Fri, 03 Jul 2009) | 3 lines
Work around Visual C++ copy constructor bug. Fixes #2929.
Based on the patch by Steven Watanabe.
........
[SVN r54824]
2009-07-08 23:23:52 +00:00
|
|
|
static void dummy() {}
|
|
|
|
|
|
|
|
static void test_empty_ref()
|
|
|
|
{
|
|
|
|
boost::function<void()> f1;
|
|
|
|
boost::function<void()> f2(boost::ref(f1));
|
|
|
|
|
|
|
|
try {
|
|
|
|
f2();
|
|
|
|
BOOST_ERROR("Exception didn't throw for reference to empty function.");
|
|
|
|
}
|
2018-10-19 01:46:27 +03:00
|
|
|
catch(std::runtime_error const&) {}
|
Merge various function changes from trunk.
Merged revisions 49571,50064,51743,51745,53722,54616-54619 via svnmerge from
https://svn.boost.org/svn/boost/trunk
........
r49571 | noel_belcourt | 2008-11-03 18:37:49 +0000 (Mon, 03 Nov 2008) | 9 lines
Both Sun and Pgi on Linux correctly put typeinfo into the std
namespace, but function_base keys off the
BOOST_NO_EXCEPTION_STD_NAMESPACE macro instead of the
BOOST_NO_STD_TYPEINFO macro. The attached patch changes
function_base to use the typeinfo macro. Because eVC 4.2 doesn't
put typeinfo into the std namespace, I need to define
BOOST_NO_STD_TYPEINFO only for this eVC version.
........
r50064 | johnmaddock | 2008-12-02 10:10:46 +0000 (Tue, 02 Dec 2008) | 1 line
Fix -Wundef warning and suspect usage of BOOST_STRICT_CONFIG.
........
r51743 | dgregor | 2009-03-13 05:23:53 +0000 (Fri, 13 Mar 2009) | 11 lines
Implement an optimization that David Abrahams and myself came up with,
where Boost.Function uses a bit in the vtable pointer to indicate when
the target function object has a trivial copy constructor, trivial
destructor, and fits within the small object buffer. In this case, we
just copy the bits of the function object rather than performing an
indirect call to the manager.
This results in a 60% speedup on a micro-benchmark that copies and
calls such function objects repeatedly.
........
r51745 | dgregor | 2009-03-13 05:49:02 +0000 (Fri, 13 Mar 2009) | 7 lines
Make Boost.Function compile under BOOST_NO_EXCEPTIONS.
Fixes #2499
Fixes #2494
Fixes #2469
Fixes #2466
........
r53722 | vladimir_prus | 2009-06-07 16:44:50 +0100 (Sun, 07 Jun 2009) | 4 lines
Make Boost.Function compile with disabled exceptions.
Closes #2900. Patch from Gabi Davar.
........
r54616 | danieljames | 2009-07-03 23:20:26 +0100 (Fri, 03 Jul 2009) | 3 lines
When copying boost::ref, copy even when the referenced function is empty. Fixes #2642
Patch by Steven Watanabe
........
r54617 | danieljames | 2009-07-03 23:20:52 +0100 (Fri, 03 Jul 2009) | 6 lines
Add 'and later versions' to support info for GCC and Visual C++. Fixes #2847.
I didn't explicitly specify the versions since no one's updating this
list and it's highly unlikely that a future version will break this. The
same could probably be done for the other compilers but I don't know
them very well so I'm leaving them alone.
........
r54618 | danieljames | 2009-07-03 23:21:40 +0100 (Fri, 03 Jul 2009) | 4 lines
Fix Boost.Function unit tests for C++0x. Fixes #3012
Based on a patch from Richard Webb. Changed a bit so that it also
works for the Visual C++ 10 beta.
........
r54619 | danieljames | 2009-07-03 23:22:03 +0100 (Fri, 03 Jul 2009) | 3 lines
Work around Visual C++ copy constructor bug. Fixes #2929.
Based on the patch by Steven Watanabe.
........
[SVN r54824]
2009-07-08 23:23:52 +00:00
|
|
|
|
|
|
|
f1 = dummy;
|
|
|
|
|
|
|
|
try {
|
|
|
|
f2();
|
|
|
|
}
|
2018-10-19 01:46:27 +03:00
|
|
|
catch(std::runtime_error const&) {
|
Merge various function changes from trunk.
Merged revisions 49571,50064,51743,51745,53722,54616-54619 via svnmerge from
https://svn.boost.org/svn/boost/trunk
........
r49571 | noel_belcourt | 2008-11-03 18:37:49 +0000 (Mon, 03 Nov 2008) | 9 lines
Both Sun and Pgi on Linux correctly put typeinfo into the std
namespace, but function_base keys off the
BOOST_NO_EXCEPTION_STD_NAMESPACE macro instead of the
BOOST_NO_STD_TYPEINFO macro. The attached patch changes
function_base to use the typeinfo macro. Because eVC 4.2 doesn't
put typeinfo into the std namespace, I need to define
BOOST_NO_STD_TYPEINFO only for this eVC version.
........
r50064 | johnmaddock | 2008-12-02 10:10:46 +0000 (Tue, 02 Dec 2008) | 1 line
Fix -Wundef warning and suspect usage of BOOST_STRICT_CONFIG.
........
r51743 | dgregor | 2009-03-13 05:23:53 +0000 (Fri, 13 Mar 2009) | 11 lines
Implement an optimization that David Abrahams and myself came up with,
where Boost.Function uses a bit in the vtable pointer to indicate when
the target function object has a trivial copy constructor, trivial
destructor, and fits within the small object buffer. In this case, we
just copy the bits of the function object rather than performing an
indirect call to the manager.
This results in a 60% speedup on a micro-benchmark that copies and
calls such function objects repeatedly.
........
r51745 | dgregor | 2009-03-13 05:49:02 +0000 (Fri, 13 Mar 2009) | 7 lines
Make Boost.Function compile under BOOST_NO_EXCEPTIONS.
Fixes #2499
Fixes #2494
Fixes #2469
Fixes #2466
........
r53722 | vladimir_prus | 2009-06-07 16:44:50 +0100 (Sun, 07 Jun 2009) | 4 lines
Make Boost.Function compile with disabled exceptions.
Closes #2900. Patch from Gabi Davar.
........
r54616 | danieljames | 2009-07-03 23:20:26 +0100 (Fri, 03 Jul 2009) | 3 lines
When copying boost::ref, copy even when the referenced function is empty. Fixes #2642
Patch by Steven Watanabe
........
r54617 | danieljames | 2009-07-03 23:20:52 +0100 (Fri, 03 Jul 2009) | 6 lines
Add 'and later versions' to support info for GCC and Visual C++. Fixes #2847.
I didn't explicitly specify the versions since no one's updating this
list and it's highly unlikely that a future version will break this. The
same could probably be done for the other compilers but I don't know
them very well so I'm leaving them alone.
........
r54618 | danieljames | 2009-07-03 23:21:40 +0100 (Fri, 03 Jul 2009) | 4 lines
Fix Boost.Function unit tests for C++0x. Fixes #3012
Based on a patch from Richard Webb. Changed a bit so that it also
works for the Visual C++ 10 beta.
........
r54619 | danieljames | 2009-07-03 23:22:03 +0100 (Fri, 03 Jul 2009) | 3 lines
Work around Visual C++ copy constructor bug. Fixes #2929.
Based on the patch by Steven Watanabe.
........
[SVN r54824]
2009-07-08 23:23:52 +00:00
|
|
|
BOOST_ERROR("Error calling referenced function.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-17 02:18:11 +02:00
|
|
|
#endif
|
|
|
|
|
Merge various function changes from trunk.
Merged revisions 49571,50064,51743,51745,53722,54616-54619 via svnmerge from
https://svn.boost.org/svn/boost/trunk
........
r49571 | noel_belcourt | 2008-11-03 18:37:49 +0000 (Mon, 03 Nov 2008) | 9 lines
Both Sun and Pgi on Linux correctly put typeinfo into the std
namespace, but function_base keys off the
BOOST_NO_EXCEPTION_STD_NAMESPACE macro instead of the
BOOST_NO_STD_TYPEINFO macro. The attached patch changes
function_base to use the typeinfo macro. Because eVC 4.2 doesn't
put typeinfo into the std namespace, I need to define
BOOST_NO_STD_TYPEINFO only for this eVC version.
........
r50064 | johnmaddock | 2008-12-02 10:10:46 +0000 (Tue, 02 Dec 2008) | 1 line
Fix -Wundef warning and suspect usage of BOOST_STRICT_CONFIG.
........
r51743 | dgregor | 2009-03-13 05:23:53 +0000 (Fri, 13 Mar 2009) | 11 lines
Implement an optimization that David Abrahams and myself came up with,
where Boost.Function uses a bit in the vtable pointer to indicate when
the target function object has a trivial copy constructor, trivial
destructor, and fits within the small object buffer. In this case, we
just copy the bits of the function object rather than performing an
indirect call to the manager.
This results in a 60% speedup on a micro-benchmark that copies and
calls such function objects repeatedly.
........
r51745 | dgregor | 2009-03-13 05:49:02 +0000 (Fri, 13 Mar 2009) | 7 lines
Make Boost.Function compile under BOOST_NO_EXCEPTIONS.
Fixes #2499
Fixes #2494
Fixes #2469
Fixes #2466
........
r53722 | vladimir_prus | 2009-06-07 16:44:50 +0100 (Sun, 07 Jun 2009) | 4 lines
Make Boost.Function compile with disabled exceptions.
Closes #2900. Patch from Gabi Davar.
........
r54616 | danieljames | 2009-07-03 23:20:26 +0100 (Fri, 03 Jul 2009) | 3 lines
When copying boost::ref, copy even when the referenced function is empty. Fixes #2642
Patch by Steven Watanabe
........
r54617 | danieljames | 2009-07-03 23:20:52 +0100 (Fri, 03 Jul 2009) | 6 lines
Add 'and later versions' to support info for GCC and Visual C++. Fixes #2847.
I didn't explicitly specify the versions since no one's updating this
list and it's highly unlikely that a future version will break this. The
same could probably be done for the other compilers but I don't know
them very well so I'm leaving them alone.
........
r54618 | danieljames | 2009-07-03 23:21:40 +0100 (Fri, 03 Jul 2009) | 4 lines
Fix Boost.Function unit tests for C++0x. Fixes #3012
Based on a patch from Richard Webb. Changed a bit so that it also
works for the Visual C++ 10 beta.
........
r54619 | danieljames | 2009-07-03 23:22:03 +0100 (Fri, 03 Jul 2009) | 3 lines
Work around Visual C++ copy constructor bug. Fixes #2929.
Based on the patch by Steven Watanabe.
........
[SVN r54824]
2009-07-08 23:23:52 +00:00
|
|
|
|
2002-11-04 18:19:01 +00:00
|
|
|
static void test_exception()
|
|
|
|
{
|
|
|
|
boost::function<int (int, int)> f;
|
|
|
|
try {
|
|
|
|
f(5, 4);
|
2005-02-03 11:09:28 +00:00
|
|
|
BOOST_CHECK(false);
|
2002-11-04 18:19:01 +00:00
|
|
|
}
|
2018-10-19 01:46:27 +03:00
|
|
|
catch(boost::bad_function_call const&) {
|
2002-11-04 18:19:01 +00:00
|
|
|
// okay
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef boost::function< void * (void * reader) > reader_type;
|
|
|
|
typedef std::pair<int, reader_type> mapped_type;
|
|
|
|
|
|
|
|
static void test_implicit()
|
|
|
|
{
|
|
|
|
mapped_type m;
|
|
|
|
m = mapped_type();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void test_call_obj(boost::function<int (int, int)> f)
|
|
|
|
{
|
2006-02-28 22:56:33 +00:00
|
|
|
BOOST_CHECK(!f.empty());
|
2002-11-04 18:19:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void test_call_cref(const boost::function<int (int, int)>& f)
|
|
|
|
{
|
2006-02-28 22:56:33 +00:00
|
|
|
BOOST_CHECK(!f.empty());
|
2002-11-04 18:19:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void test_call()
|
|
|
|
{
|
|
|
|
test_call_obj(std::plus<int>());
|
|
|
|
test_call_cref(std::plus<int>());
|
|
|
|
}
|
|
|
|
|
2012-09-28 18:14:00 +00:00
|
|
|
struct big_aggregating_structure {
|
|
|
|
int disable_small_objects_optimizations[32];
|
|
|
|
|
|
|
|
big_aggregating_structure()
|
|
|
|
{
|
|
|
|
++ global_int;
|
|
|
|
}
|
|
|
|
|
|
|
|
big_aggregating_structure(const big_aggregating_structure&)
|
|
|
|
{
|
|
|
|
++ global_int;
|
|
|
|
}
|
|
|
|
|
|
|
|
~big_aggregating_structure()
|
|
|
|
{
|
|
|
|
-- global_int;
|
|
|
|
}
|
|
|
|
|
|
|
|
void operator()()
|
|
|
|
{
|
|
|
|
++ global_int;
|
|
|
|
}
|
|
|
|
|
|
|
|
void operator()(int)
|
|
|
|
{
|
|
|
|
++ global_int;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class FunctionT>
|
|
|
|
static void test_move_semantics()
|
|
|
|
{
|
|
|
|
typedef FunctionT f1_type;
|
|
|
|
|
|
|
|
big_aggregating_structure obj;
|
|
|
|
|
|
|
|
f1_type f1 = obj;
|
|
|
|
global_int = 0;
|
|
|
|
f1();
|
|
|
|
|
|
|
|
BOOST_CHECK(!f1.empty());
|
|
|
|
BOOST_CHECK(global_int == 1);
|
|
|
|
|
2012-12-17 17:50:38 +00:00
|
|
|
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
|
2012-09-28 18:14:00 +00:00
|
|
|
// Testing rvalue constructors
|
|
|
|
f1_type f2(static_cast<f1_type&&>(f1));
|
|
|
|
BOOST_CHECK(f1.empty());
|
|
|
|
BOOST_CHECK(!f2.empty());
|
|
|
|
BOOST_CHECK(global_int == 1);
|
|
|
|
f2();
|
|
|
|
BOOST_CHECK(global_int == 2);
|
|
|
|
|
|
|
|
f1_type f3(static_cast<f1_type&&>(f2));
|
|
|
|
BOOST_CHECK(f1.empty());
|
|
|
|
BOOST_CHECK(f2.empty());
|
|
|
|
BOOST_CHECK(!f3.empty());
|
|
|
|
BOOST_CHECK(global_int == 2);
|
|
|
|
f3();
|
|
|
|
BOOST_CHECK(global_int == 3);
|
|
|
|
|
|
|
|
// Testing move assignment
|
|
|
|
f1_type f4;
|
|
|
|
BOOST_CHECK(f4.empty());
|
|
|
|
f4 = static_cast<f1_type&&>(f3);
|
|
|
|
BOOST_CHECK(f1.empty());
|
|
|
|
BOOST_CHECK(f2.empty());
|
|
|
|
BOOST_CHECK(f3.empty());
|
|
|
|
BOOST_CHECK(!f4.empty());
|
|
|
|
BOOST_CHECK(global_int == 3);
|
|
|
|
f4();
|
|
|
|
BOOST_CHECK(global_int == 4);
|
|
|
|
|
|
|
|
// Testing self move assignment
|
|
|
|
f4 = static_cast<f1_type&&>(f4);
|
|
|
|
BOOST_CHECK(!f4.empty());
|
|
|
|
BOOST_CHECK(global_int == 4);
|
|
|
|
|
|
|
|
// Testing, that no memory leaked when assigning to nonempty function
|
|
|
|
f4 = obj;
|
|
|
|
BOOST_CHECK(!f4.empty());
|
|
|
|
BOOST_CHECK(global_int == 4);
|
|
|
|
f1_type f5 = obj;
|
|
|
|
BOOST_CHECK(global_int == 5);
|
|
|
|
f4 = static_cast<f1_type&&>(f5);
|
|
|
|
BOOST_CHECK(global_int == 4);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2001-11-19 20:19:23 +00:00
|
|
|
int test_main(int, char* [])
|
2001-06-21 17:01:43 +00:00
|
|
|
{
|
|
|
|
test_zero_args();
|
|
|
|
test_one_arg();
|
|
|
|
test_two_args();
|
|
|
|
test_emptiness();
|
2001-10-16 19:24:04 +00:00
|
|
|
test_member_functions();
|
2001-12-03 16:25:00 +00:00
|
|
|
test_ref();
|
Merge various function changes from trunk.
Merged revisions 49571,50064,51743,51745,53722,54616-54619 via svnmerge from
https://svn.boost.org/svn/boost/trunk
........
r49571 | noel_belcourt | 2008-11-03 18:37:49 +0000 (Mon, 03 Nov 2008) | 9 lines
Both Sun and Pgi on Linux correctly put typeinfo into the std
namespace, but function_base keys off the
BOOST_NO_EXCEPTION_STD_NAMESPACE macro instead of the
BOOST_NO_STD_TYPEINFO macro. The attached patch changes
function_base to use the typeinfo macro. Because eVC 4.2 doesn't
put typeinfo into the std namespace, I need to define
BOOST_NO_STD_TYPEINFO only for this eVC version.
........
r50064 | johnmaddock | 2008-12-02 10:10:46 +0000 (Tue, 02 Dec 2008) | 1 line
Fix -Wundef warning and suspect usage of BOOST_STRICT_CONFIG.
........
r51743 | dgregor | 2009-03-13 05:23:53 +0000 (Fri, 13 Mar 2009) | 11 lines
Implement an optimization that David Abrahams and myself came up with,
where Boost.Function uses a bit in the vtable pointer to indicate when
the target function object has a trivial copy constructor, trivial
destructor, and fits within the small object buffer. In this case, we
just copy the bits of the function object rather than performing an
indirect call to the manager.
This results in a 60% speedup on a micro-benchmark that copies and
calls such function objects repeatedly.
........
r51745 | dgregor | 2009-03-13 05:49:02 +0000 (Fri, 13 Mar 2009) | 7 lines
Make Boost.Function compile under BOOST_NO_EXCEPTIONS.
Fixes #2499
Fixes #2494
Fixes #2469
Fixes #2466
........
r53722 | vladimir_prus | 2009-06-07 16:44:50 +0100 (Sun, 07 Jun 2009) | 4 lines
Make Boost.Function compile with disabled exceptions.
Closes #2900. Patch from Gabi Davar.
........
r54616 | danieljames | 2009-07-03 23:20:26 +0100 (Fri, 03 Jul 2009) | 3 lines
When copying boost::ref, copy even when the referenced function is empty. Fixes #2642
Patch by Steven Watanabe
........
r54617 | danieljames | 2009-07-03 23:20:52 +0100 (Fri, 03 Jul 2009) | 6 lines
Add 'and later versions' to support info for GCC and Visual C++. Fixes #2847.
I didn't explicitly specify the versions since no one's updating this
list and it's highly unlikely that a future version will break this. The
same could probably be done for the other compilers but I don't know
them very well so I'm leaving them alone.
........
r54618 | danieljames | 2009-07-03 23:21:40 +0100 (Fri, 03 Jul 2009) | 4 lines
Fix Boost.Function unit tests for C++0x. Fixes #3012
Based on a patch from Richard Webb. Changed a bit so that it also
works for the Visual C++ 10 beta.
........
r54619 | danieljames | 2009-07-03 23:22:03 +0100 (Fri, 03 Jul 2009) | 3 lines
Work around Visual C++ copy constructor bug. Fixes #2929.
Based on the patch by Steven Watanabe.
........
[SVN r54824]
2009-07-08 23:23:52 +00:00
|
|
|
test_empty_ref();
|
2002-11-04 18:19:01 +00:00
|
|
|
test_exception();
|
|
|
|
test_implicit();
|
|
|
|
test_call();
|
2012-09-28 18:14:00 +00:00
|
|
|
test_move_semantics<function<void()> >();
|
|
|
|
test_move_semantics<boost::function0<void> >();
|
2001-12-03 16:25:00 +00:00
|
|
|
|
2001-06-21 17:01:43 +00:00
|
|
|
return 0;
|
|
|
|
}
|