Improvements to rtc::Bind
BUG=webrtc:4690 Support for rtc::scoped_ptr as return type. Support for up to 6 input parameters. R=pthatcher@webrtc.org, solenberg@webrtc.org Review URL: https://codereview.webrtc.org/1226153003 . Cr-Commit-Position: refs/heads/master@{#9569}
This commit is contained in:
@ -578,6 +578,142 @@ Bind(FP_T(function),
|
||||
function, p1, p2, p3, p4, p5);
|
||||
}
|
||||
|
||||
#undef FP_T
|
||||
template <class ObjectT,
|
||||
class MethodT,
|
||||
class R,
|
||||
class P1,
|
||||
class P2,
|
||||
class P3,
|
||||
class P4,
|
||||
class P5,
|
||||
class P6>
|
||||
class MethodFunctor6 {
|
||||
public:
|
||||
MethodFunctor6(MethodT method,
|
||||
ObjectT* object,
|
||||
P1 p1,
|
||||
P2 p2,
|
||||
P3 p3,
|
||||
P4 p4,
|
||||
P5 p5,
|
||||
P6 p6)
|
||||
: method_(method),
|
||||
object_(object),
|
||||
p1_(p1),
|
||||
p2_(p2),
|
||||
p3_(p3),
|
||||
p4_(p4),
|
||||
p5_(p5),
|
||||
p6_(p6) {}
|
||||
R operator()() const {
|
||||
return (object_->*method_)(p1_, p2_, p3_, p4_, p5_, p6_);
|
||||
}
|
||||
|
||||
private:
|
||||
MethodT method_;
|
||||
ObjectT* object_;
|
||||
P1 p1_;
|
||||
P2 p2_;
|
||||
P3 p3_;
|
||||
P4 p4_;
|
||||
P5 p5_;
|
||||
P6 p6_;
|
||||
};
|
||||
|
||||
template <class FunctorT,
|
||||
class R,
|
||||
class P1,
|
||||
class P2,
|
||||
class P3,
|
||||
class P4,
|
||||
class P5,
|
||||
class P6>
|
||||
class Functor6 {
|
||||
public:
|
||||
Functor6(const FunctorT& functor, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
|
||||
: functor_(functor),
|
||||
p1_(p1),
|
||||
p2_(p2),
|
||||
p3_(p3),
|
||||
p4_(p4),
|
||||
p5_(p5),
|
||||
p6_(p6) {}
|
||||
R operator()() const { return functor_(p1_, p2_, p3_, p4_, p5_, p6_); }
|
||||
|
||||
private:
|
||||
FunctorT functor_;
|
||||
P1 p1_;
|
||||
P2 p2_;
|
||||
P3 p3_;
|
||||
P4 p4_;
|
||||
P5 p5_;
|
||||
P6 p6_;
|
||||
};
|
||||
|
||||
#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6)
|
||||
|
||||
template <class ObjectT,
|
||||
class R,
|
||||
class P1,
|
||||
class P2,
|
||||
class P3,
|
||||
class P4,
|
||||
class P5,
|
||||
class P6>
|
||||
MethodFunctor6<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6> Bind(
|
||||
FP_T(method),
|
||||
ObjectT* object,
|
||||
typename detail::identity<P1>::type p1,
|
||||
typename detail::identity<P2>::type p2,
|
||||
typename detail::identity<P3>::type p3,
|
||||
typename detail::identity<P4>::type p4,
|
||||
typename detail::identity<P5>::type p5,
|
||||
typename detail::identity<P6>::type p6) {
|
||||
return MethodFunctor6<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>(
|
||||
method, object, p1, p2, p3, p4, p5, p6);
|
||||
}
|
||||
|
||||
#undef FP_T
|
||||
#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6) const
|
||||
|
||||
template <class ObjectT,
|
||||
class R,
|
||||
class P1,
|
||||
class P2,
|
||||
class P3,
|
||||
class P4,
|
||||
class P5,
|
||||
class P6>
|
||||
MethodFunctor6<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6> Bind(
|
||||
FP_T(method),
|
||||
const ObjectT* object,
|
||||
typename detail::identity<P1>::type p1,
|
||||
typename detail::identity<P2>::type p2,
|
||||
typename detail::identity<P3>::type p3,
|
||||
typename detail::identity<P4>::type p4,
|
||||
typename detail::identity<P5>::type p5,
|
||||
typename detail::identity<P6>::type p6) {
|
||||
return MethodFunctor6<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>(
|
||||
method, object, p1, p2, p3, p4, p5, p6);
|
||||
}
|
||||
|
||||
#undef FP_T
|
||||
#define FP_T(x) R (*x)(P1, P2, P3, P4, P5, P6)
|
||||
|
||||
template <class R, class P1, class P2, class P3, class P4, class P5, class P6>
|
||||
Functor6<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6> Bind(
|
||||
FP_T(function),
|
||||
typename detail::identity<P1>::type p1,
|
||||
typename detail::identity<P2>::type p2,
|
||||
typename detail::identity<P3>::type p3,
|
||||
typename detail::identity<P4>::type p4,
|
||||
typename detail::identity<P5>::type p5,
|
||||
typename detail::identity<P5>::type p6) {
|
||||
return Functor6<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>(function, p1, p2, p3,
|
||||
p4, p5, p6);
|
||||
}
|
||||
|
||||
#undef FP_T
|
||||
|
||||
} // namespace rtc
|
||||
|
@ -12,6 +12,7 @@
|
||||
#define WEBRTC_BASE_MESSAGEHANDLER_H_
|
||||
|
||||
#include "webrtc/base/constructormagic.h"
|
||||
#include "webrtc/base/scoped_ptr.h"
|
||||
|
||||
namespace rtc {
|
||||
|
||||
@ -47,6 +48,20 @@ class FunctorMessageHandler : public MessageHandler {
|
||||
ReturnT result_;
|
||||
};
|
||||
|
||||
// Specialization for rtc::scoped_ptr<ReturnT>.
|
||||
template <class ReturnT, class FunctorT>
|
||||
class FunctorMessageHandler<class rtc::scoped_ptr<ReturnT>, FunctorT>
|
||||
: public MessageHandler {
|
||||
public:
|
||||
explicit FunctorMessageHandler(const FunctorT& functor) : functor_(functor) {}
|
||||
virtual void OnMessage(Message* msg) { result_ = functor_().Pass(); }
|
||||
rtc::scoped_ptr<ReturnT> result() { return result_.Pass(); }
|
||||
|
||||
private:
|
||||
FunctorT functor_;
|
||||
rtc::scoped_ptr<ReturnT> result_;
|
||||
};
|
||||
|
||||
// Specialization for ReturnT of void.
|
||||
template <class FunctorT>
|
||||
class FunctorMessageHandler<void, FunctorT> : public MessageHandler {
|
||||
@ -62,7 +77,6 @@ class FunctorMessageHandler<void, FunctorT> : public MessageHandler {
|
||||
FunctorT functor_;
|
||||
};
|
||||
|
||||
|
||||
} // namespace rtc
|
||||
|
||||
#endif // WEBRTC_BASE_MESSAGEHANDLER_H_
|
||||
|
Reference in New Issue
Block a user