forked from boostorg/bind
Function objects with overloaded operator& are now supported.
[SVN r31506]
This commit is contained in:
@@ -113,38 +113,23 @@ template<class T> class type {};
|
|||||||
|
|
||||||
// unwrap
|
// unwrap
|
||||||
|
|
||||||
template<class F> inline F & unwrap(F * f, long)
|
template<class F> struct unwrapper
|
||||||
{
|
{
|
||||||
return *f;
|
static inline F & unwrap( F & f, long )
|
||||||
}
|
{
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
template<class F> inline F & unwrap(reference_wrapper<F> * f, int)
|
template<class F2> static inline F2 & unwrap( reference_wrapper<F2> const & f, int )
|
||||||
{
|
{
|
||||||
return f->get();
|
return f->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F> inline F & unwrap(reference_wrapper<F> const * f, int)
|
template<class R, class T> static inline _mfi::dm<R, T> unwrap( R T::* pm, int )
|
||||||
{
|
{
|
||||||
return f->get();
|
return _mfi::dm<R, T>( pm );
|
||||||
}
|
}
|
||||||
|
};
|
||||||
#if !( defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, <= 0x3004) )
|
|
||||||
|
|
||||||
template<class R, class T> inline _mfi::dm<R, T> unwrap(R T::* * pm, int)
|
|
||||||
{
|
|
||||||
return _mfi::dm<R, T>(*pm);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
|
|
||||||
// IBM/VisualAge 6.0 is not able to handle this overload.
|
|
||||||
template<class R, class T> inline _mfi::dm<R, T> unwrap(R T::* const * pm, int)
|
|
||||||
{
|
|
||||||
return _mfi::dm<R, T>(*pm);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// listN
|
// listN
|
||||||
|
|
||||||
@@ -166,22 +151,22 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F & f, A &, long)
|
template<class R, class F, class A> R operator()(type<R>, F & f, A &, long)
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)();
|
return unwrapper<F>::unwrap(f, 0)();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F const & f, A &, long) const
|
template<class R, class F, class A> R operator()(type<R>, F const & f, A &, long) const
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)();
|
return unwrapper<F const>::unwrap(f, 0)();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F & f, A &, int)
|
template<class F, class A> void operator()(type<void>, F & f, A &, int)
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)();
|
unwrapper<F>::unwrap(f, 0)();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F const & f, A &, int) const
|
template<class F, class A> void operator()(type<void>, F const & f, A &, int) const
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)();
|
unwrapper<F const>::unwrap(f, 0)();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V &) const
|
template<class V> void accept(V &) const
|
||||||
@@ -216,22 +201,22 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)(a[a1_]);
|
return unwrapper<F>::unwrap(f, 0)(a[a1_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)(a[a1_]);
|
return unwrapper<F const>::unwrap(f, 0)(a[a1_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_]);
|
unwrapper<F>::unwrap(f, 0)(a[a1_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_]);
|
unwrapper<F const>::unwrap(f, 0)(a[a1_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V & v) const
|
template<class V> void accept(V & v) const
|
||||||
@@ -273,22 +258,22 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)(a[a1_], a[a2_]);
|
return unwrapper<F>::unwrap(f, 0)(a[a1_], a[a2_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)(a[a1_], a[a2_]);
|
return unwrapper<F const>::unwrap(f, 0)(a[a1_], a[a2_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_], a[a2_]);
|
unwrapper<F>::unwrap(f, 0)(a[a1_], a[a2_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_], a[a2_]);
|
unwrapper<F const>::unwrap(f, 0)(a[a1_], a[a2_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V & v) const
|
template<class V> void accept(V & v) const
|
||||||
@@ -334,22 +319,22 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]);
|
return unwrapper<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]);
|
return unwrapper<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]);
|
unwrapper<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]);
|
unwrapper<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V & v) const
|
template<class V> void accept(V & v) const
|
||||||
@@ -399,22 +384,22 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]);
|
return unwrapper<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]);
|
return unwrapper<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]);
|
unwrapper<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]);
|
unwrapper<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V & v) const
|
template<class V> void accept(V & v) const
|
||||||
@@ -470,22 +455,22 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]);
|
return unwrapper<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]);
|
return unwrapper<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]);
|
unwrapper<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]);
|
unwrapper<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V & v) const
|
template<class V> void accept(V & v) const
|
||||||
@@ -545,22 +530,22 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
||||||
{
|
{
|
||||||
return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]);
|
return unwrapper<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
template<class R, class F, class A> R operator()(type<R>, 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<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]);
|
unwrapper<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]);
|
unwrapper<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V & v) const
|
template<class V> void accept(V & v) const
|
||||||
@@ -624,22 +609,22 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
template<class R, class F, class A> R operator()(type<R>, 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<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
template<class R, class F, class A> R operator()(type<R>, 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<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
||||||
{
|
{
|
||||||
unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]);
|
unwrapper<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
template<class F, class A> void operator()(type<void>, 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<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V & v) const
|
template<class V> void accept(V & v) const
|
||||||
@@ -708,22 +693,22 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
template<class R, class F, class A> R operator()(type<R>, 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<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
template<class R, class F, class A> R operator()(type<R>, 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<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
template<class F, class A> void operator()(type<void>, 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<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
template<class F, class A> void operator()(type<void>, 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<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V & v) const
|
template<class V> void accept(V & v) const
|
||||||
@@ -796,22 +781,22 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
|
template<class R, class F, class A> R operator()(type<R>, 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<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
|
template<class R, class F, class A> R operator()(type<R>, 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<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F & f, A & a, int)
|
template<class F, class A> void operator()(type<void>, 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<F>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
|
template<class F, class A> void operator()(type<void>, 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<F const>::unwrap(f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V & v) const
|
template<class V> void accept(V & v) const
|
||||||
|
Reference in New Issue
Block a user