1 // Boost.Function library 2 3 // Copyright Douglas Gregor 2008. Use, modification and 4 // distribution is subject to the Boost Software License, Version 5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt) 7 8 // For more information, see http://www.boost.org 9 10 #include <boost/function.hpp> 11 #include <boost/core/lightweight_test.hpp> 12 13 #define BOOST_CHECK BOOST_TEST 14 15 struct tried_to_copy { }; 16 17 struct MaybeThrowOnCopy { MaybeThrowOnCopyMaybeThrowOnCopy18 MaybeThrowOnCopy(int value = 0) : value(value) { } 19 MaybeThrowOnCopyMaybeThrowOnCopy20 MaybeThrowOnCopy(const MaybeThrowOnCopy& other) : value(other.value) { 21 if (throwOnCopy) 22 throw tried_to_copy(); 23 } 24 operator =MaybeThrowOnCopy25 MaybeThrowOnCopy& operator=(const MaybeThrowOnCopy& other) { 26 if (throwOnCopy) 27 throw tried_to_copy(); 28 value = other.value; 29 return *this; 30 } 31 operator ()MaybeThrowOnCopy32 int operator()() { return value; } 33 34 int value; 35 36 // Make sure that this function object doesn't trigger the 37 // small-object optimization in Function. 38 float padding[100]; 39 40 static bool throwOnCopy; 41 }; 42 43 bool MaybeThrowOnCopy::throwOnCopy = false; 44 main()45int main() 46 { 47 boost::function0<int> f; 48 boost::function0<int> g; 49 50 MaybeThrowOnCopy::throwOnCopy = false; 51 f = MaybeThrowOnCopy(1); 52 g = MaybeThrowOnCopy(2); 53 BOOST_CHECK(f() == 1); 54 BOOST_CHECK(g() == 2); 55 56 MaybeThrowOnCopy::throwOnCopy = true; 57 f.swap(g); 58 BOOST_CHECK(f() == 2); 59 BOOST_CHECK(g() == 1); 60 61 return boost::report_errors(); 62 } 63