From 2d6ccb09a7d1851de424a3477ab304888f423be2 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sun, 30 Oct 2005 21:38:36 +0000 Subject: [PATCH] Function objects with overloaded operator& are now supported. [SVN r31506] --- include/boost/bind.hpp | 123 ++++++++++++++++++----------------------- 1 file changed, 54 insertions(+), 69 deletions(-) diff --git a/include/boost/bind.hpp b/include/boost/bind.hpp index 3eba772..bf4325a 100644 --- a/include/boost/bind.hpp +++ b/include/boost/bind.hpp @@ -113,38 +113,23 @@ template class type {}; // unwrap -template inline F & unwrap(F * f, long) +template struct unwrapper { - return *f; -} + static inline F & unwrap( F & f, long ) + { + return f; + } -template inline F & unwrap(reference_wrapper * f, int) -{ - return f->get(); -} + template static inline F2 & unwrap( reference_wrapper const & f, int ) + { + return f->get(); + } -template inline F & unwrap(reference_wrapper const * f, int) -{ - return f->get(); -} - -#if !( defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, <= 0x3004) ) - -template inline _mfi::dm unwrap(R T::* * pm, int) -{ - return _mfi::dm(*pm); -} - -#if !BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) -// IBM/VisualAge 6.0 is not able to handle this overload. -template inline _mfi::dm unwrap(R T::* const * pm, int) -{ - return _mfi::dm(*pm); -} -#endif - - -#endif + template static inline _mfi::dm unwrap( R T::* pm, int ) + { + return _mfi::dm( pm ); + } +}; // listN @@ -166,22 +151,22 @@ public: template R operator()(type, F & f, A &, long) { - return unwrap(&f, 0)(); + return unwrapper::unwrap(f, 0)(); } template R operator()(type, F const & f, A &, long) const { - return unwrap(&f, 0)(); + return unwrapper::unwrap(f, 0)(); } template void operator()(type, F & f, A &, int) { - unwrap(&f, 0)(); + unwrapper::unwrap(f, 0)(); } template void operator()(type, F const & f, A &, int) const { - unwrap(&f, 0)(); + unwrapper::unwrap(f, 0)(); } template void accept(V &) const @@ -216,22 +201,22 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_]); + return unwrapper::unwrap(f, 0)(a[a1_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_]); + return unwrapper::unwrap(f, 0)(a[a1_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_]); + unwrapper::unwrap(f, 0)(a[a1_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_]); + unwrapper::unwrap(f, 0)(a[a1_]); } template void accept(V & v) const @@ -273,22 +258,22 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_]); } template void accept(V & v) const @@ -334,22 +319,22 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_]); } template void accept(V & v) const @@ -399,22 +384,22 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); } template void accept(V & v) const @@ -470,22 +455,22 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]); } template void accept(V & v) const @@ -545,22 +530,22 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]); } template void accept(V & v) const @@ -624,22 +609,22 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]); } template void accept(V & v) const @@ -708,22 +693,22 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]); } template void accept(V & v) const @@ -796,22 +781,22 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]); + return unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]); + unwrapper::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]); } template void accept(V & v) const