forked from boostorg/bind
Support for ref() as a first argument, allowing noncopyable function objects.
[SVN r14115]
This commit is contained in:
@@ -59,6 +59,11 @@ template<class F> struct result_traits<unspecified, F>
|
|||||||
typedef typename F::result_type type;
|
typedef typename F::result_type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class F> struct result_traits< unspecified, reference_wrapper<F> >
|
||||||
|
{
|
||||||
|
typedef typename F::result_type type;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// bind_t forward declaration for listN
|
// bind_t forward declaration for listN
|
||||||
@@ -85,6 +90,23 @@ private:
|
|||||||
|
|
||||||
template<class T> class type {};
|
template<class T> class type {};
|
||||||
|
|
||||||
|
// unwrap
|
||||||
|
|
||||||
|
template<class F> inline F & unwrap(F & f, long)
|
||||||
|
{
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class F> inline F & unwrap(reference_wrapper<F> & f, int)
|
||||||
|
{
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class F> inline F & unwrap(reference_wrapper<F> const & f, int)
|
||||||
|
{
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
// listN
|
// listN
|
||||||
|
|
||||||
#ifdef BOOST_NO_VOID_RETURNS
|
#ifdef BOOST_NO_VOID_RETURNS
|
||||||
@@ -120,7 +142,7 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F f, A &) const
|
template<class R, class F, class A> R operator()(type<R>, F f, A &) const
|
||||||
{
|
{
|
||||||
return f();
|
return unwrap(f, 0)();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V &) const
|
template<class V> void accept(V &) const
|
||||||
@@ -160,7 +182,7 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
||||||
{
|
{
|
||||||
return f(a[a1_]);
|
return unwrap(f, 0)(a[a1_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V & v) const
|
template<class V> void accept(V & v) const
|
||||||
@@ -208,7 +230,7 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
||||||
{
|
{
|
||||||
return f(a[a1_], a[a2_]);
|
return unwrap(f, 0)(a[a1_], a[a2_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class V> void accept(V & v) const
|
template<class V> void accept(V & v) const
|
||||||
@@ -260,7 +282,7 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
||||||
{
|
{
|
||||||
return f(a[a1_], a[a2_], a[a3_]);
|
return 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
|
||||||
@@ -316,7 +338,7 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
||||||
{
|
{
|
||||||
return f(a[a1_], a[a2_], a[a3_], a[a4_]);
|
return 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
|
||||||
@@ -376,7 +398,7 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
||||||
{
|
{
|
||||||
return f(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]);
|
return 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
|
||||||
@@ -440,7 +462,7 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
||||||
{
|
{
|
||||||
return f(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]);
|
return 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
|
||||||
@@ -508,7 +530,7 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
||||||
{
|
{
|
||||||
return f(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]);
|
return 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
|
||||||
@@ -580,7 +602,7 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
||||||
{
|
{
|
||||||
return f(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]);
|
return 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
|
||||||
@@ -656,7 +678,7 @@ public:
|
|||||||
|
|
||||||
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
template<class R, class F, class A> R operator()(type<R>, F f, A & a) const
|
||||||
{
|
{
|
||||||
return f(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]);
|
return 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
|
||||||
@@ -703,7 +725,7 @@ template <class R> struct evaluator0
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static R eval(L const&, F f, A &)
|
static R eval(L const&, F f, A &)
|
||||||
{
|
{
|
||||||
return f();
|
return unwrap(f, 0)();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -712,7 +734,7 @@ template <> struct evaluator0<void>
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static void eval(L const&, F f, A &)
|
static void eval(L const&, F f, A &)
|
||||||
{
|
{
|
||||||
f();
|
unwrap(f, 0)();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -721,7 +743,7 @@ template <class R> struct evaluator1
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static R eval(L const& l, F f, A & a)
|
static R eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
return f(a[l.a1_]);
|
return unwrap(f, 0)(a[l.a1_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -730,7 +752,7 @@ template <> struct evaluator1<void>
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static void eval(L const& l, F f, A & a)
|
static void eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
f(a[l.a1_]);
|
unwrap(f, 0)(a[l.a1_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -739,7 +761,7 @@ template <class R> struct evaluator2
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static R eval(L const& l, F f, A & a)
|
static R eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
return f(a[l.a1_], a[l.a2_]);
|
return unwrap(f, 0)(a[l.a1_], a[l.a2_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -748,7 +770,7 @@ template <> struct evaluator2<void>
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static void eval(L const& l, F f, A & a)
|
static void eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
f(a[l.a1_], a[l.a2_]);
|
unwrap(f, 0)(a[l.a1_], a[l.a2_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -757,7 +779,7 @@ template <class R> struct evaluator3
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static R eval(L const& l, F f, A & a)
|
static R eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
return f(a[l.a1_], a[l.a2_], a[l.a3_]);
|
return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -766,7 +788,7 @@ template <> struct evaluator3<void>
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static void eval(L const& l, F f, A & a)
|
static void eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
f(a[l.a1_], a[l.a2_], a[l.a3_]);
|
unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -775,7 +797,7 @@ template <class R> struct evaluator4
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static R eval(L const& l, F f, A & a)
|
static R eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
return f(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_]);
|
return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -784,7 +806,7 @@ template <> struct evaluator4<void>
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static void eval(L const& l, F f, A & a)
|
static void eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
f(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_]);
|
unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -793,7 +815,7 @@ template <class R> struct evaluator5
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static R eval(L const& l, F f, A & a)
|
static R eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
return f(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_]);
|
return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -802,7 +824,7 @@ template <> struct evaluator5<void>
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static void eval(L const& l, F f, A & a)
|
static void eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
f(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_]);
|
unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -811,7 +833,7 @@ template <class R> struct evaluator6
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static R eval(L const& l, F f, A & a)
|
static R eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
return f(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_]);
|
return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -820,7 +842,7 @@ template <> struct evaluator6<void>
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static void eval(L const& l, F f, A & a)
|
static void eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
f(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_]);
|
unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -829,7 +851,7 @@ template <class R> struct evaluator7
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static R eval(L const& l, F f, A & a)
|
static R eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
return f(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_]);
|
return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -838,7 +860,7 @@ template <> struct evaluator7<void>
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static void eval(L const& l, F f, A & a)
|
static void eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
f(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_]);
|
unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -847,7 +869,7 @@ template <class R> struct evaluator8
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static R eval(L const& l, F f, A & a)
|
static R eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
return f(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_], a[l.a8_]);
|
return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_], a[l.a8_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -856,7 +878,7 @@ template <> struct evaluator8<void>
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static void eval(L const& l, F f, A & a)
|
static void eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
f(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_], a[l.a8_]);
|
unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_], a[l.a8_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -865,7 +887,7 @@ template <class R> struct evaluator9
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static R eval(L const& l, F f, A & a)
|
static R eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
return f(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_], a[l.a8_], a[l.a9_]);
|
return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_], a[l.a8_], a[l.a9_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -874,7 +896,7 @@ template <> struct evaluator9<void>
|
|||||||
template<class L, class F, class A>
|
template<class L, class F, class A>
|
||||||
static void eval(L const& l, F f, A & a)
|
static void eval(L const& l, F f, A & a)
|
||||||
{
|
{
|
||||||
f(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_], a[l.a8_], a[l.a9_]);
|
unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_], a[l.a8_], a[l.a9_]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user