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()45 int 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