\n";
- print OUT "\n";
- print OUT "#undef BOOST_FUNCTION_NOT_0_ARGS\n";
- print OUT "#undef BOOST_FUNCTION_NOT_0_PARMS\n";
- print OUT "#undef BOOST_FUNCTION_ARGS\n";
- print OUT "#undef BOOST_FUNCTION_PARMS\n";
- print OUT "#undef BOOST_FUNCTION_TEMPLATE_ARGS\n";
- print OUT "#undef BOOST_FUNCTION_TEMPLATE_PARMS\n";
- print OUT "#undef BOOST_FUNCTION_NUM_ARGS\n";
- print OUT "\n";
- print OUT "#endif // BOOST_FUNCTION_FUNCTION" . $numArgs . "_HEADER\n";
- close OUT;
-}
diff --git a/index.html b/index.html
deleted file mode 100644
index 1d298bc..0000000
--- a/index.html
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
- Boost.Function
-
-
-
-
-
-
- The header <boost/function.hpp> includes a family of class templates that are function object wrappers. The notion is similar to a generalized callback. It shares features with function pointers in that both define a call interface (e.g., a function taking two integer arguments and returning a floating-point value) through which some implementation can be called, and the implementation that is invoked may change throughout the course of the program.
-
-
Generally, any place in which a function pointer would be used to defer a call or make a callback, Boost.Function can be used instead to allow the user greater flexibility in the implementation of the target. Targets can be any 'compatible' function object (or function pointer), meaning that the arguments to the interface designated by Boost.Function can be converted to the arguments of the target function object.
-
-
-
-Compatibility Note
- Boost.Function has been partially redesigned to minimize the interface and make it cleaner. Several seldom- or never-used features of the older Boost.Function have been deprecated and will be removed in the near future. Here is a list of features that have been deprecated, the likely impact of the deprecations, and how to adjust your code:
-
- - The
boost::function
class template syntax has
- changed. The old syntax, e.g., boost::function<int, float,
- double, std::string>
, has been changed to a more natural
- syntax boost::function<int (float, double,
- std::string)>
, where all return and argument types are
- encoded in a single function type parameter. Any other template
- parameters (e.g., the Allocator
) follow this single
- parameter.
-
- The resolution to this change depends on the
- abilities of your compiler: if your compiler supports template
- partial specialization and can parse function types (most do), modify
- your code to use the newer
- syntax (preferable) or directly use one of the
- functionN
classes whose syntax has not
- changed. If your compiler does not support template partial
- specialization or function types, you must take the latter option and
- use the numbered Boost.Function classes. This option merely requires
- changing types such as boost::function<void, int, int>
- to boost::function2<void, int, int>
(adding the number of
- function arguments to the end of the class name).
-
-
Support for the old syntax with the
- boost::function
class template will persist for a short
- while, but will eventually be removed so that we can provide better
- error messages and link compatibility.
-
- - The invocation
- policy template parameter (
Policy
) has been deprecated
- and will be removed. There is no direct equivalent to this rarely
- used feature. - The mixin template parameter
- (
Mixin
) has been deprecated and will be removed. There
- is not direct equivalent to this rarely used feature. - The
-
set
methods have been deprecated and will be
- removed. Use the assignment operator instead.
-
-
- To aid in porting to the new syntax and removing the use of deprecated features, define the preprocessor macro BOOST_FUNCTION_NO_DEPRECATED
. This macro makes all deprecated features unavailable. A program compiled with BOOST_FUNCTION_NO_DEPRECATED
will likely be prepared when the deprecated features are removed.
-
-
-Boost.Function has several advantages over function pointers, namely:
-
-
- - Boost.Function allows arbitrary compatible function objects to be targets (instead of requiring an exact function signature).
- - Boost.Function may be used with argument-binding and other function object construction libraries.
- - Boost.Function has predictible debug behavior when an empty function object is called.
- - Boost.Function can be adapted to perform operations before and after each call, allowing, for instance, synchronization primitives to be made part of the function type.
-
-
-And, of course, function pointers have several advantages over Boost.Function:
-
-
- - Function pointers are smaller (the size of one pointer instead of three)
- - Function pointers are faster (Boost.Function may require two calls through function pointers)
- - Function pointers are backward-compatible with C libraries.
- - More readable error messages.
-
-
-
- The above two lists were adapted from comments made by Darin Adler.
-
-
-Function object wrapper size
- Function object wrappers will be the size of two function pointers plus one function pointer or data pointer (whichever is larger). On common 32-bit platforms, this amounts to 12 bytes per wrapper. Additionally, the function object target will be allocated on the heap.
-
-
Copying efficiency
- Copying function object wrappers may require allocating memory for a copy of the function object target. The default allocator may be replaced with a faster custom allocator or one may choose to allow the function object wrappers to only store function object targets by reference (using ref
) if the cost of this cloning becomes prohibitive.
-
-
Invocation efficiency
- With a properly inlining compiler, an invocation of a function object requires one call through a function pointer. If the call is to a free function pointer, an additional call must be made to that function pointer (unless the compiler has very powerful interprocedural analysis).
-
-
- The function object wrappers have been designed to be as portable as possible, and to support many compilers even when they do not support the C++ standard well. The following compilers have passed all of the test cases included with boost::function
.
-
- - GCC 2.95.3
- - GCC 3.0
- - SGI MIPSpro 7.3.0
- - Borland C++ 5.5.1
- - Comeau C++ 4.2.45.2
- - Metrowerks Codewarrior 6.1
-
-
- The following compilers work with boost::function
, but have some problems:
-
- - Microsoft Visual C++ 6.0 (service pack 5): allocators not supported, some problems with
boost::function
class template (numbered variants seem to work)
- - Intel C++ 5.0: allocators not supported
-
-
- If your compiler is not listed, there is a small set of tests to stress the capabilities of the boost::function
library. A standards-compliant compiler should compile the code without any modifications, but if you find you run into problems please submit a bug report.
-
-
-Combatting virtual function bloat
- The use of virtual functions tends to cause 'code bloat' on many compilers. When a class contains a virtual function, it is necessary to emit an additional function that classifies the type of the object. It has been our experience that these auxiliary functions increase the size of the executable significantly when many boost::function
objects are used.
-
-
In Boost.Function, an alternative but equivalent approach was taken using free functions instead of virtual functions. The Boost.Function object essentially holds two pointers to make a valid target call: a void pointer to the function object it contains and a void pointer to an "invoker" that can call the function object, given the function pointer. This invoker function performs the argument and return value conversions Boost.Function provides. A third pointer points to a free function called the "manager", which handles the cloning and destruction of function objects. The scheme is typesafe because the only functions that actually handle the function object, the invoker and the manager, are instantiated given the type of the function object, so they can safely cast the incoming void pointer (the function object pointer) to the appropriate type.
-
-
- Many people were involved in the construction of this library. William Kempf, Jesse Jones and Karl Nelson were all extremely helpful in isolating an interface and scope for the library. John Maddock managed the formal review, and many reviewers gave excellent comments on interface, implementation, and documentation.
-
-
- Doug Gregor
-
-
diff --git a/test/allocator_test.cpp b/test/allocator_test.cpp
deleted file mode 100644
index cab749f..0000000
--- a/test/allocator_test.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-// Boost.Function library
-
-// Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
-//
-// Permission to copy, use, sell and distribute this software is granted
-// provided this copyright notice appears in all copies.
-// Permission to modify the code and to distribute modified code is granted
-// provided this copyright notice appears in all copies, and a notice
-// that the code was modified is included with the copyright notice.
-//
-// This software is provided "as is" without express or implied warranty,
-// and with no claim as to its suitability for any purpose.
-
-// For more information, see http://www.boost.org
-
-#define BOOST_INCLUDE_MAIN
-#include
-#include
-#include
-#include
-
-using namespace std;
-using namespace boost;
-
-static int alloc_count = 0;
-static int dealloc_count = 0;
-
-template
-struct counting_allocator : public std::allocator
-{
- template
- struct rebind
- {
- typedef counting_allocator other;
- };
-
-
- T* allocate(std::size_t n)
- {
- alloc_count++;
- return std::allocator::allocate(n);
- }
-
- void deallocate(T* p, std::size_t n)
- {
- dealloc_count++;
- std::allocator::deallocate(p, n);
- }
-};
-
-static int do_minus(int x, int y) { return x-y; }
-
-struct DoNothing
-{
- void operator()() const {}
-};
-
-static void do_nothing() {}
-
-int
-test_main(int, char*[])
-{
- function::allocator< counting_allocator >::type f;
- f = plus();
- f.clear();
- BOOST_TEST(alloc_count == 1);
- BOOST_TEST(dealloc_count == 1);
-
- alloc_count = 0;
- dealloc_count = 0;
- f = &do_minus;
- f.clear();
-
- function::allocator< counting_allocator >::type fv;
- alloc_count = 0;
- dealloc_count = 0;
- fv = DoNothing();
- fv.clear();
- BOOST_TEST(alloc_count == 1);
- BOOST_TEST(dealloc_count == 1);
-
- alloc_count = 0;
- dealloc_count = 0;
- fv = &do_nothing;
- fv.clear();
-
- return 0;
-}
diff --git a/test/deprecated_syntax_test.cpp b/test/deprecated_syntax_test.cpp
deleted file mode 100644
index 31c5152..0000000
--- a/test/deprecated_syntax_test.cpp
+++ /dev/null
@@ -1,645 +0,0 @@
-// Boost.Function library
-
-// Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
-//
-// Permission to copy, use, sell and distribute this software is granted
-// provided this copyright notice appears in all copies.
-// Permission to modify the code and to distribute modified code is granted
-// provided this copyright notice appears in all copies, and a notice
-// that the code was modified is included with the copyright notice.
-//
-// This software is provided "as is" without express or implied warranty,
-// and with no claim as to its suitability for any purpose.
-
-// For more information, see http://www.boost.org
-
-#define BOOST_INCLUDE_MAIN
-#include
-#include
-#include
-#include
-#include
-
-using namespace boost;
-using std::string;
-using std::negate;
-
-int global_int;
-
-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; }
-};
-
-struct add_to_obj
-{
- add_to_obj(int v) : value(v) {}
-
- int operator()(int x) const { return value + x; }
-
- int value;
-};
-
-static void
-test_zero_args()
-{
- typedef function func_void_type;
-
- write_five_obj five;
- write_three_obj three;
-
- // Default construction
- func_void_type v1;
- BOOST_TEST(v1.empty());
-
- // Assignment to an empty function
- v1 = five;
- BOOST_TEST(!v1.empty());
-
- // Invocation of a function
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v1.clear();
- BOOST_TEST(v1.empty());
-
- // Assignment to an empty function
- v1 = three;
- BOOST_TEST(!v1.empty());
-
- // Invocation and self-assignment
- global_int = 0;
- v1 = v1;
- v1();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v1 = five;
-
- // Invocation and self-assignment
- global_int = 0;
- v1 = (v1);
- v1();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v1.clear();
- BOOST_TEST(v1.empty());
-
- // Assignment to an empty function from a free function
- v1 = BOOST_FUNCTION_TARGET_FIX(&) write_five;
- BOOST_TEST(!v1.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v1 = BOOST_FUNCTION_TARGET_FIX(&) write_three;
- BOOST_TEST(!v1.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v1 = five;
- BOOST_TEST(!v1.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v1 = &write_three;
- BOOST_TEST(!v1.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 3);
-
- // Construction from another function (that is empty)
- v1.clear();
- func_void_type v2(v1);
- BOOST_TEST(!v2? true : false);
-
- // Assignment to an empty function
- v2 = three;
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v2 = (five);
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 5);
-
- v2.clear();
- BOOST_TEST(v2.empty());
-
- // Assignment to an empty function from a free function
- v2 = (BOOST_FUNCTION_TARGET_FIX(&) write_five);
- BOOST_TEST(v2? true : false);
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v2 = BOOST_FUNCTION_TARGET_FIX(&) write_three;
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 3);
-
- // Swapping
- v1 = five;
- swap(v1, v2);
- v2();
- BOOST_TEST(global_int == 5);
- v1();
- BOOST_TEST(global_int == 3);
- swap(v1, v2);
- v1.clear();
-
- // Assignment
- v2 = five;
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v2 = &write_three;
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a function from an empty function
- v2 = v1;
- BOOST_TEST(v2.empty());
-
- // Assignment to a function from a function with a functor
- v1 = three;
- v2 = v1;
- BOOST_TEST(!v1.empty());
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 3);
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 3);
-
- // Assign to a function from a function with a function
- v2 = BOOST_FUNCTION_TARGET_FIX(&) write_five;
- v1 = v2;
- BOOST_TEST(!v1.empty());
- BOOST_TEST(!v2.empty());
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 5);
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 5);
-
- // Construct a function given another function containing a function
- func_void_type v3(v1);
-
- // Invocation of a function
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v3.clear();
- BOOST_TEST(!v3? true : false);
-
- // Assignment to an empty function
- v3 = three;
- BOOST_TEST(!v3.empty());
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v3 = five;
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v3.clear();
- BOOST_TEST(v3.empty());
-
- // Assignment to an empty function from a free function
- v3 = &write_five;
- BOOST_TEST(!v3.empty());
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v3 = &write_three;
- BOOST_TEST(!v3.empty());
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v3 = five;
- BOOST_TEST(!v3.empty());
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 5);
-
- // Construction of a function from a function containing a functor
- func_void_type v4(v3);
-
- // Invocation of a function
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v4.clear();
- BOOST_TEST(v4.empty());
-
- // Assignment to an empty function
- v4 = three;
- BOOST_TEST(!v4.empty());
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v4 = five;
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v4.clear();
- BOOST_TEST(v4.empty());
-
- // Assignment to an empty function from a free function
- v4 = &write_five;
- BOOST_TEST(!v4.empty());
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v4 = &write_three;
- BOOST_TEST(!v4.empty());
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v4 = five;
- BOOST_TEST(!v4.empty());
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 5);
-
- // Construction of a function from a functor
- func_void_type v5(five);
-
- // Invocation of a function
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v5.clear();
- BOOST_TEST(v5.empty());
-
- // Assignment to an empty function
- v5 = three;
- BOOST_TEST(!v5.empty());
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v5 = five;
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v5.clear();
- BOOST_TEST(v5.empty());
-
- // Assignment to an empty function from a free function
- v5 = &write_five;
- BOOST_TEST(!v5.empty());
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v5 = &write_three;
- BOOST_TEST(!v5.empty());
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v5 = five;
- BOOST_TEST(!v5.empty());
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 5);
-
- // Construction of a function from a function
- func_void_type v6(&write_five);
-
- // Invocation of a function
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v6.clear();
- BOOST_TEST(v6.empty());
-
- // Assignment to an empty function
- v6 = three;
- BOOST_TEST(!v6.empty());
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v6 = five;
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v6.clear();
- BOOST_TEST(v6.empty());
-
- // Assignment to an empty function from a free function
- v6 = &write_five;
- BOOST_TEST(!v6.empty());
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v6 = &write_three;
- BOOST_TEST(!v6.empty());
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v6 = five;
- BOOST_TEST(!v6.empty());
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 5);
-
- // Const vs. non-const
- write_const_1_nonconst_2 one_or_two;
- const function v7(one_or_two);
- function v8(one_or_two);
-
- global_int = 0;
- v7();
- BOOST_TEST(global_int == 2);
-
- global_int = 0;
- v8();
- BOOST_TEST(global_int == 2);
-
- // Test return values
- typedef function func_int_type;
- generate_five_obj gen_five;
- generate_three_obj gen_three;
-
- func_int_type i0(gen_five);
-
- BOOST_TEST(i0() == 5);
- i0 = gen_three;
- BOOST_TEST(i0() == 3);
- i0 = &generate_five;
- BOOST_TEST(i0() == 5);
- i0 = &generate_three;
- BOOST_TEST(i0() == 3);
- BOOST_TEST(i0? true : false);
- i0.clear();
- BOOST_TEST(!i0? true : false);
-
- // Test return values with compatible types
- typedef function func_long_type;
- func_long_type i1(gen_five);
-
- BOOST_TEST(i1() == 5);
- i1 = gen_three;
- BOOST_TEST(i1() == 3);
- i1 = &generate_five;
- BOOST_TEST(i1() == 5);
- i1 = &generate_three;
- BOOST_TEST(i1() == 3);
- BOOST_TEST(i1? true : false);
- i1.clear();
- BOOST_TEST(!i1? true : false);
-}
-
-static void
-test_one_arg()
-{
- negate neg;
-
- function f1(neg);
- BOOST_TEST(f1(5) == -5);
-
- function id(&identity_str);
- BOOST_TEST(id("str") == "str");
-
- function id2(&identity_str);
- BOOST_TEST(id2("foo") == "foo");
-
- add_to_obj add_to(5);
- function f2(add_to);
- BOOST_TEST(f2(3) == 8);
-
- const function cf2(add_to);
- BOOST_TEST(cf2(3) == 8);
-}
-
-static void
-test_two_args()
-{
- function cat(&string_cat);
- BOOST_TEST(cat("str", "ing") == "string");
-
- function sum(&sum_ints);
- BOOST_TEST(sum(2, 3) == 5);
-}
-
-static void
-test_emptiness()
-{
- function f1;
- BOOST_TEST(f1.empty());
-
- function f2;
- f2 = f1;
- BOOST_TEST(f2.empty());
-
- function f3;
- f3 = f2;
- BOOST_TEST(f3.empty());
-}
-
-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()
-{
- boost::function f1(&X::twice);
-
- X one(1);
- X five(5);
-
- BOOST_TEST(f1(&one) == 2);
- BOOST_TEST(f1(&five) == 10);
-
- boost::function f1_2;
- f1_2 = &X::twice;
-
- BOOST_TEST(f1_2(&one) == 2);
- BOOST_TEST(f1_2(&five) == 10);
-
- boost::function f2(&X::plus);
- BOOST_TEST(f2(one, 3) == 4);
- BOOST_TEST(f2(five, 4) == 9);
-}
-
-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&)
- {
- throw std::runtime_error("But this CAN'T throw");
- }
-
- add_with_throw_on_copy& operator=(const add_with_throw_on_copy&)
- {
- throw std::runtime_error("But this CAN'T throw");
- }
-};
-
-static void
-test_ref()
-{
- add_with_throw_on_copy atc;
- try {
- boost::function f(ref(atc));
- BOOST_TEST(f(1, 3) == 4);
- }
- catch(std::runtime_error e) {
- BOOST_ERROR("Nonthrowing constructor threw an exception");
- }
-}
-
-int test_main(int, char* [])
-{
- test_zero_args();
- test_one_arg();
- test_two_args();
- test_emptiness();
- test_member_functions();
- test_ref();
-
- return 0;
-}
diff --git a/test/function_n_test.cpp b/test/function_n_test.cpp
deleted file mode 100644
index ac01f0e..0000000
--- a/test/function_n_test.cpp
+++ /dev/null
@@ -1,645 +0,0 @@
-// Boost.Function library
-
-// Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
-//
-// Permission to copy, use, sell and distribute this software is granted
-// provided this copyright notice appears in all copies.
-// Permission to modify the code and to distribute modified code is granted
-// provided this copyright notice appears in all copies, and a notice
-// that the code was modified is included with the copyright notice.
-//
-// This software is provided "as is" without express or implied warranty,
-// and with no claim as to its suitability for any purpose.
-
-// For more information, see http://www.boost.org
-
-#define BOOST_INCLUDE_MAIN
-#include
-#include
-#include
-#include
-#include
-
-using namespace boost;
-using std::string;
-using std::negate;
-
-int global_int;
-
-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; }
-};
-
-struct add_to_obj
-{
- add_to_obj(int v) : value(v) {}
-
- int operator()(int x) const { return value + x; }
-
- int value;
-};
-
-static void
-test_zero_args()
-{
- typedef function0 func_void_type;
-
- write_five_obj five;
- write_three_obj three;
-
- // Default construction
- func_void_type v1;
- BOOST_TEST(v1.empty());
-
- // Assignment to an empty function
- v1 = five;
- BOOST_TEST(!v1.empty());
-
- // Invocation of a function
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v1.clear();
- BOOST_TEST(v1.empty());
-
- // Assignment to an empty function
- v1 = three;
- BOOST_TEST(!v1.empty());
-
- // Invocation and self-assignment
- global_int = 0;
- v1 = v1;
- v1();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v1 = five;
-
- // Invocation and self-assignment
- global_int = 0;
- v1 = (v1);
- v1();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v1.clear();
- BOOST_TEST(v1.empty());
-
- // Assignment to an empty function from a free function
- v1 = write_five;
- BOOST_TEST(!v1.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v1 = &write_three;
- BOOST_TEST(!v1.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v1 = five;
- BOOST_TEST(!v1.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v1 = write_three;
- BOOST_TEST(!v1.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 3);
-
- // Construction from another function (that is empty)
- v1.clear();
- func_void_type v2(v1);
- BOOST_TEST(!v2? true : false);
-
- // Assignment to an empty function
- v2 = three;
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v2 = (five);
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 5);
-
- v2.clear();
- BOOST_TEST(v2.empty());
-
- // Assignment to an empty function from a free function
- v2 = (&write_five);
- BOOST_TEST(v2? true : false);
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v2 = &write_three;
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 3);
-
- // Swapping
- v1 = five;
- swap(v1, v2);
- v2();
- BOOST_TEST(global_int == 5);
- v1();
- BOOST_TEST(global_int == 3);
- swap(v1, v2);
- v1.clear();
-
- // Assignment
- v2 = five;
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v2 = &write_three;
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a function from an empty function
- v2 = v1;
- BOOST_TEST(v2.empty());
-
- // Assignment to a function from a function with a functor
- v1 = three;
- v2 = v1;
- BOOST_TEST(!v1.empty());
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 3);
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 3);
-
- // Assign to a function from a function with a function
- v2 = &write_five;
- v1 = v2;
- BOOST_TEST(!v1.empty());
- BOOST_TEST(!v2.empty());
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 5);
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 5);
-
- // Construct a function given another function containing a function
- func_void_type v3(v1);
-
- // Invocation of a function
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v3.clear();
- BOOST_TEST(!v3? true : false);
-
- // Assignment to an empty function
- v3 = three;
- BOOST_TEST(!v3.empty());
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v3 = five;
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v3.clear();
- BOOST_TEST(v3.empty());
-
- // Assignment to an empty function from a free function
- v3 = &write_five;
- BOOST_TEST(!v3.empty());
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v3 = &write_three;
- BOOST_TEST(!v3.empty());
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v3 = five;
- BOOST_TEST(!v3.empty());
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 5);
-
- // Construction of a function from a function containing a functor
- func_void_type v4(v3);
-
- // Invocation of a function
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v4.clear();
- BOOST_TEST(v4.empty());
-
- // Assignment to an empty function
- v4 = three;
- BOOST_TEST(!v4.empty());
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v4 = five;
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v4.clear();
- BOOST_TEST(v4.empty());
-
- // Assignment to an empty function from a free function
- v4 = &write_five;
- BOOST_TEST(!v4.empty());
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v4 = &write_three;
- BOOST_TEST(!v4.empty());
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v4 = five;
- BOOST_TEST(!v4.empty());
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 5);
-
- // Construction of a function from a functor
- func_void_type v5(five);
-
- // Invocation of a function
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v5.clear();
- BOOST_TEST(v5.empty());
-
- // Assignment to an empty function
- v5 = three;
- BOOST_TEST(!v5.empty());
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v5 = five;
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v5.clear();
- BOOST_TEST(v5.empty());
-
- // Assignment to an empty function from a free function
- v5 = &write_five;
- BOOST_TEST(!v5.empty());
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v5 = &write_three;
- BOOST_TEST(!v5.empty());
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v5 = five;
- BOOST_TEST(!v5.empty());
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 5);
-
- // Construction of a function from a function
- func_void_type v6(&write_five);
-
- // Invocation of a function
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v6.clear();
- BOOST_TEST(v6.empty());
-
- // Assignment to an empty function
- v6 = three;
- BOOST_TEST(!v6.empty());
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v6 = five;
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v6.clear();
- BOOST_TEST(v6.empty());
-
- // Assignment to an empty function from a free function
- v6 = &write_five;
- BOOST_TEST(!v6.empty());
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v6 = &write_three;
- BOOST_TEST(!v6.empty());
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v6 = five;
- BOOST_TEST(!v6.empty());
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 5);
-
- // Const vs. non-const
- write_const_1_nonconst_2 one_or_two;
- const function0 v7(one_or_two);
- function v8(one_or_two);
-
- global_int = 0;
- v7();
- BOOST_TEST(global_int == 2);
-
- global_int = 0;
- v8();
- BOOST_TEST(global_int == 2);
-
- // Test return values
- typedef function0 func_int_type;
- generate_five_obj gen_five;
- generate_three_obj gen_three;
-
- func_int_type i0(gen_five);
-
- BOOST_TEST(i0() == 5);
- i0 = gen_three;
- BOOST_TEST(i0() == 3);
- i0 = &generate_five;
- BOOST_TEST(i0() == 5);
- i0 = &generate_three;
- BOOST_TEST(i0() == 3);
- BOOST_TEST(i0? true : false);
- i0.clear();
- BOOST_TEST(!i0? true : false);
-
- // Test return values with compatible types
- typedef function0 func_long_type;
- func_long_type i1(gen_five);
-
- BOOST_TEST(i1() == 5);
- i1 = gen_three;
- BOOST_TEST(i1() == 3);
- i1 = &generate_five;
- BOOST_TEST(i1() == 5);
- i1 = &generate_three;
- BOOST_TEST(i1() == 3);
- BOOST_TEST(i1? true : false);
- i1.clear();
- BOOST_TEST(!i1? true : false);
-}
-
-static void
-test_one_arg()
-{
- negate neg;
-
- function1 f1(neg);
- BOOST_TEST(f1(5) == -5);
-
- function1 id(&identity_str);
- BOOST_TEST(id("str") == "str");
-
- function1 id2(&identity_str);
- BOOST_TEST(id2("foo") == "foo");
-
- add_to_obj add_to(5);
- function1 f2(add_to);
- BOOST_TEST(f2(3) == 8);
-
- const function1 cf2(add_to);
- BOOST_TEST(cf2(3) == 8);
-}
-
-static void
-test_two_args()
-{
- function2 cat(&string_cat);
- BOOST_TEST(cat("str", "ing") == "string");
-
- function2 sum(&sum_ints);
- BOOST_TEST(sum(2, 3) == 5);
-}
-
-static void
-test_emptiness()
-{
- function0 f1;
- BOOST_TEST(f1.empty());
-
- function0 f2;
- f2 = f1;
- BOOST_TEST(f2.empty());
-
- function0 f3;
- f3 = f2;
- BOOST_TEST(f3.empty());
-}
-
-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()
-{
-
- boost::function1 f1(&X::twice);
-
- X one(1);
- X five(5);
-
- BOOST_TEST(f1(&one) == 2);
- BOOST_TEST(f1(&five) == 10);
-
- boost::function1 f1_2;
- f1_2 = &X::twice;
-
- BOOST_TEST(f1_2(&one) == 2);
- BOOST_TEST(f1_2(&five) == 10);
-
- boost::function2 f2(&X::plus);
- BOOST_TEST(f2(one, 3) == 4);
- BOOST_TEST(f2(five, 4) == 9);
-}
-
-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&)
- {
- throw std::runtime_error("But this CAN'T throw");
- }
-
- add_with_throw_on_copy& operator=(const add_with_throw_on_copy&)
- {
- throw std::runtime_error("But this CAN'T throw");
- }
-};
-
-static void
-test_ref()
-{
- add_with_throw_on_copy atc;
- try {
- boost::function2 f(ref(atc));
- BOOST_TEST(f(1, 3) == 4);
- }
- catch(std::runtime_error e) {
- BOOST_ERROR("Nonthrowing constructor threw an exception");
- }
-}
-
-int test_main(int, char* [])
-{
- test_zero_args();
- test_one_arg();
- test_two_args();
- test_emptiness();
- test_member_functions();
- test_ref();
- return 0;
-}
diff --git a/test/function_test.cpp b/test/function_test.cpp
deleted file mode 100644
index 50a072f..0000000
--- a/test/function_test.cpp
+++ /dev/null
@@ -1,710 +0,0 @@
-// Boost.Function library
-
-// Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
-//
-// Permission to copy, use, sell and distribute this software is granted
-// provided this copyright notice appears in all copies.
-// Permission to modify the code and to distribute modified code is granted
-// provided this copyright notice appears in all copies, and a notice
-// that the code was modified is included with the copyright notice.
-//
-// This software is provided "as is" without express or implied warranty,
-// and with no claim as to its suitability for any purpose.
-
-// For more information, see http://www.boost.org
-
-#define BOOST_INCLUDE_MAIN
-#define BOOST_FUNCTION_NO_DEPRECATED
-#include
-#include
-#include
-#include
-#include
-
-using namespace boost;
-using namespace std;
-
-int global_int;
-
-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; }
-};
-
-struct add_to_obj
-{
- add_to_obj(int v) : value(v) {}
-
- int operator()(int x) const { return value + x; }
-
- int value;
-};
-
-static void
-test_zero_args()
-{
- typedef function func_void_type;
-
- write_five_obj five;
- write_three_obj three;
-
- // Default construction
- func_void_type v1;
- BOOST_TEST(v1.empty());
-
- // Assignment to an empty function
- v1 = five;
- BOOST_TEST(!v1.empty());
-
- // Invocation of a function
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v1.clear();
- BOOST_TEST(v1.empty());
-
- // Assignment to an empty function
- v1 = three;
- BOOST_TEST(!v1.empty());
-
- // Invocation and self-assignment
- global_int = 0;
- v1 = v1;
- v1();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v1 = five;
-
- // Invocation and self-assignment
- global_int = 0;
- v1 = (v1);
- v1();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v1.clear();
- BOOST_TEST(v1.empty());
-
- // Assignment to an empty function from a free function
- v1 = BOOST_FUNCTION_TARGET_FIX(&) write_five;
- BOOST_TEST(!v1.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v1 = BOOST_FUNCTION_TARGET_FIX(&) write_three;
- BOOST_TEST(!v1.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v1 = five;
- BOOST_TEST(!v1.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v1 = &write_three;
- BOOST_TEST(!v1.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 3);
-
- // Construction from another function (that is empty)
- v1.clear();
- func_void_type v2(v1);
- BOOST_TEST(!v2? true : false);
-
- // Assignment to an empty function
- v2 = three;
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v2 = (five);
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 5);
-
- v2.clear();
- BOOST_TEST(v2.empty());
-
- // Assignment to an empty function from a free function
- v2 = (BOOST_FUNCTION_TARGET_FIX(&) write_five);
- BOOST_TEST(v2? true : false);
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v2 = BOOST_FUNCTION_TARGET_FIX(&) write_three;
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 3);
-
- // Swapping
- v1 = five;
- swap(v1, v2);
- v2();
- BOOST_TEST(global_int == 5);
- v1();
- BOOST_TEST(global_int == 3);
- swap(v1, v2);
- v1.clear();
-
- // Assignment
- v2 = five;
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v2 = &write_three;
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a function from an empty function
- v2 = v1;
- BOOST_TEST(v2.empty());
-
- // Assignment to a function from a function with a functor
- v1 = three;
- v2 = v1;
- BOOST_TEST(!v1.empty());
- BOOST_TEST(!v2.empty());
-
- // Invocation
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 3);
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 3);
-
- // Assign to a function from a function with a function
- v2 = BOOST_FUNCTION_TARGET_FIX(&) write_five;
- v1 = v2;
- BOOST_TEST(!v1.empty());
- BOOST_TEST(!v2.empty());
- global_int = 0;
- v1();
- BOOST_TEST(global_int == 5);
- global_int = 0;
- v2();
- BOOST_TEST(global_int == 5);
-
- // Construct a function given another function containing a function
- func_void_type v3(v1);
-
- // Invocation of a function
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v3.clear();
- BOOST_TEST(!v3? true : false);
-
- // Assignment to an empty function
- v3 = three;
- BOOST_TEST(!v3.empty());
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v3 = five;
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v3.clear();
- BOOST_TEST(v3.empty());
-
- // Assignment to an empty function from a free function
- v3 = &write_five;
- BOOST_TEST(!v3.empty());
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v3 = &write_three;
- BOOST_TEST(!v3.empty());
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v3 = five;
- BOOST_TEST(!v3.empty());
-
- // Invocation
- global_int = 0;
- v3();
- BOOST_TEST(global_int == 5);
-
- // Construction of a function from a function containing a functor
- func_void_type v4(v3);
-
- // Invocation of a function
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v4.clear();
- BOOST_TEST(v4.empty());
-
- // Assignment to an empty function
- v4 = three;
- BOOST_TEST(!v4.empty());
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v4 = five;
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v4.clear();
- BOOST_TEST(v4.empty());
-
- // Assignment to an empty function from a free function
- v4 = &write_five;
- BOOST_TEST(!v4.empty());
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v4 = &write_three;
- BOOST_TEST(!v4.empty());
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v4 = five;
- BOOST_TEST(!v4.empty());
-
- // Invocation
- global_int = 0;
- v4();
- BOOST_TEST(global_int == 5);
-
- // Construction of a function from a functor
- func_void_type v5(five);
-
- // Invocation of a function
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v5.clear();
- BOOST_TEST(v5.empty());
-
- // Assignment to an empty function
- v5 = three;
- BOOST_TEST(!v5.empty());
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v5 = five;
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v5.clear();
- BOOST_TEST(v5.empty());
-
- // Assignment to an empty function from a free function
- v5 = &write_five;
- BOOST_TEST(!v5.empty());
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v5 = &write_three;
- BOOST_TEST(!v5.empty());
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v5 = five;
- BOOST_TEST(!v5.empty());
-
- // Invocation
- global_int = 0;
- v5();
- BOOST_TEST(global_int == 5);
-
- // Construction of a function from a function
- func_void_type v6(&write_five);
-
- // Invocation of a function
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 5);
-
- // clear() method
- v6.clear();
- BOOST_TEST(v6.empty());
-
- // Assignment to an empty function
- v6 = three;
- BOOST_TEST(!v6.empty());
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 3);
-
- // Assignment to a non-empty function
- v6 = five;
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 5);
-
- // clear()
- v6.clear();
- BOOST_TEST(v6.empty());
-
- // Assignment to an empty function from a free function
- v6 = &write_five;
- BOOST_TEST(!v6.empty());
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 5);
-
- // Assignment to a non-empty function from a free function
- v6 = &write_three;
- BOOST_TEST(!v6.empty());
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 3);
-
- // Assignment
- v6 = five;
- BOOST_TEST(!v6.empty());
-
- // Invocation
- global_int = 0;
- v6();
- BOOST_TEST(global_int == 5);
-
- // Const vs. non-const
- write_const_1_nonconst_2 one_or_two;
- const function v7(one_or_two);
- function v8(one_or_two);
-
- global_int = 0;
- v7();
- BOOST_TEST(global_int == 2);
-
- global_int = 0;
- v8();
- BOOST_TEST(global_int == 2);
-
- // Test return values
- typedef function func_int_type;
- generate_five_obj gen_five;
- generate_three_obj gen_three;
-
- func_int_type i0(gen_five);
-
- BOOST_TEST(i0() == 5);
- i0 = gen_three;
- BOOST_TEST(i0() == 3);
- i0 = &generate_five;
- BOOST_TEST(i0() == 5);
- i0 = &generate_three;
- BOOST_TEST(i0() == 3);
- BOOST_TEST(i0? true : false);
- i0.clear();
- BOOST_TEST(!i0? true : false);
-
- // Test return values with compatible types
- typedef function func_long_type;
- func_long_type i1(gen_five);
-
- BOOST_TEST(i1() == 5);
- i1 = gen_three;
- BOOST_TEST(i1() == 3);
- i1 = &generate_five;
- BOOST_TEST(i1() == 5);
- i1 = &generate_three;
- BOOST_TEST(i1() == 3);
- BOOST_TEST(i1? true : false);
- i1.clear();
- BOOST_TEST(!i1? true : false);
-}
-
-static void
-test_one_arg()
-{
- negate neg;
-
- function f1(neg);
- BOOST_TEST(f1(5) == -5);
-
- function id(&identity_str);
- BOOST_TEST(id("str") == "str");
-
- function id2(&identity_str);
- BOOST_TEST(id2("foo") == "foo");
-
- add_to_obj add_to(5);
- function f2(add_to);
- BOOST_TEST(f2(3) == 8);
-
- const function cf2(add_to);
- BOOST_TEST(cf2(3) == 8);
-}
-
-static void
-test_two_args()
-{
- function cat(&string_cat);
- BOOST_TEST(cat("str", "ing") == "string");
-
- function sum(&sum_ints);
- BOOST_TEST(sum(2, 3) == 5);
-}
-
-static void
-test_emptiness()
-{
- function f1;
- BOOST_TEST(f1.empty());
-
- function f2;
- f2 = f1;
- BOOST_TEST(f2.empty());
-
- function f3;
- f3 = f2;
- BOOST_TEST(f3.empty());
-}
-
-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()
-{
- boost::function f1(&X::twice);
-
- X one(1);
- X five(5);
-
- BOOST_TEST(f1(&one) == 2);
- BOOST_TEST(f1(&five) == 10);
-
- boost::function f1_2;
- f1_2 = &X::twice;
-
- BOOST_TEST(f1_2(&one) == 2);
- BOOST_TEST(f1_2(&five) == 10);
-
- boost::function f2(&X::plus);
- BOOST_TEST(f2(one, 3) == 4);
- BOOST_TEST(f2(five, 4) == 9);
-}
-
-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&)
- {
- throw runtime_error("But this CAN'T throw");
- }
-
- add_with_throw_on_copy& operator=(const add_with_throw_on_copy&)
- {
- throw runtime_error("But this CAN'T throw");
- }
-};
-
-static void
-test_ref()
-{
- add_with_throw_on_copy atc;
- try {
- boost::function f(ref(atc));
- BOOST_TEST(f(1, 3) == 4);
- }
- catch(runtime_error e) {
- BOOST_ERROR("Nonthrowing constructor threw an exception");
- }
-}
-
-static int alloc_count = 0;
-static int dealloc_count = 0;
-
-template
-struct counting_allocator : public allocator