forked from boostorg/function
Improve the performance of Boost.Function's swap. Thanks to Niels Dekker for the original patch. Fixes #1910
[SVN r48615]
This commit is contained in:
@@ -58,6 +58,7 @@ import testing ;
|
||||
|
||||
[ run libs/function/test/contains2_test.cpp : : : : ]
|
||||
|
||||
[ run libs/function/test/nothrow_swap.cpp : : : : ]
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
#include <boost/test/minimal.hpp>
|
||||
#include <boost/function.hpp>
|
||||
|
||||
struct tried_to_copy { };
|
||||
|
||||
struct MaybeThrowOnCopy {
|
||||
MaybeThrowOnCopy(int value = 0) : value(value) { }
|
||||
|
||||
MaybeThrowOnCopy(const MaybeThrowOnCopy& other) : value(other.value) {
|
||||
if (throwOnCopy)
|
||||
throw tried_to_copy();
|
||||
}
|
||||
|
||||
MaybeThrowOnCopy& operator=(const MaybeThrowOnCopy& other) {
|
||||
if (throwOnCopy)
|
||||
throw tried_to_copy();
|
||||
value = other.value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
int operator()() { return value; }
|
||||
|
||||
int value;
|
||||
|
||||
// Make sure that this function object doesn't trigger the
|
||||
// small-object optimization in Function.
|
||||
float padding[100];
|
||||
|
||||
static bool throwOnCopy;
|
||||
};
|
||||
|
||||
bool MaybeThrowOnCopy::throwOnCopy = false;
|
||||
|
||||
int test_main(int, char* [])
|
||||
{
|
||||
boost::function0<int> f;
|
||||
boost::function0<int> g;
|
||||
|
||||
MaybeThrowOnCopy::throwOnCopy = false;
|
||||
f = MaybeThrowOnCopy(1);
|
||||
g = MaybeThrowOnCopy(2);
|
||||
BOOST_CHECK(f() == 1);
|
||||
BOOST_CHECK(g() == 2);
|
||||
|
||||
MaybeThrowOnCopy::throwOnCopy = true;
|
||||
f.swap(g);
|
||||
BOOST_CHECK(f() == 2);
|
||||
BOOST_CHECK(g() == 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user