From f7dbd8ca43825e6451fc7e0214219d60c9505649 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Tue, 14 Apr 2015 11:36:35 -0400 Subject: [PATCH] Bug 1146349 - Allow NS_NewRunnableMethodWithArgs to take up to 8 arguments. r=froydnj --- xpcom/glue/nsThreadUtils.h | 119 ++++++++++++++++++++++++++++++++++++- 1 file changed, 117 insertions(+), 2 deletions(-) diff --git a/xpcom/glue/nsThreadUtils.h b/xpcom/glue/nsThreadUtils.h index 6a0ee2769157..c4655d1699af 100644 --- a/xpcom/glue/nsThreadUtils.h +++ b/xpcom/glue/nsThreadUtils.h @@ -564,8 +564,8 @@ struct ParameterStorage // struct used to store arguments and later apply them to a method. template struct nsRunnableMethodArguments; -// Specializations for 0-4 arguments, add more as required. -// TODO Use tuple instead; And/or use lambdas. +// Specializations for 0-8 arguments, add more as required. +// TODO Use tuple instead; And/or use lambdas (see bug 1152753) template <> struct nsRunnableMethodArguments<> { @@ -639,6 +639,121 @@ struct nsRunnableMethodArguments m2.PassAsParameter(), m3.PassAsParameter()); } }; +template +struct nsRunnableMethodArguments +{ + typename ::detail::ParameterStorage::Type m0; + typename ::detail::ParameterStorage::Type m1; + typename ::detail::ParameterStorage::Type m2; + typename ::detail::ParameterStorage::Type m3; + typename ::detail::ParameterStorage::Type m4; + template + nsRunnableMethodArguments(A0&& a0, A1&& a1, A2&& a2, A3&& a3, A4&& a4) + : m0(mozilla::Forward(a0)) + , m1(mozilla::Forward(a1)) + , m2(mozilla::Forward(a2)) + , m3(mozilla::Forward(a3)) + , m4(mozilla::Forward(a4)) + {} + template void apply(C* o, M m) + { + ((*o).*m)(m0.PassAsParameter(), m1.PassAsParameter(), + m2.PassAsParameter(), m3.PassAsParameter(), + m4.PassAsParameter()); + } +}; +template +struct nsRunnableMethodArguments +{ + typename ::detail::ParameterStorage::Type m0; + typename ::detail::ParameterStorage::Type m1; + typename ::detail::ParameterStorage::Type m2; + typename ::detail::ParameterStorage::Type m3; + typename ::detail::ParameterStorage::Type m4; + typename ::detail::ParameterStorage::Type m5; + template + nsRunnableMethodArguments(A0&& a0, A1&& a1, A2&& a2, A3&& a3, A4&& a4, + A5&& a5) + : m0(mozilla::Forward(a0)) + , m1(mozilla::Forward(a1)) + , m2(mozilla::Forward(a2)) + , m3(mozilla::Forward(a3)) + , m4(mozilla::Forward(a4)) + , m5(mozilla::Forward(a5)) + {} + template void apply(C* o, M m) + { + ((*o).*m)(m0.PassAsParameter(), m1.PassAsParameter(), + m2.PassAsParameter(), m3.PassAsParameter(), + m4.PassAsParameter(), m5.PassAsParameter()); + } +}; +template +struct nsRunnableMethodArguments +{ + typename ::detail::ParameterStorage::Type m0; + typename ::detail::ParameterStorage::Type m1; + typename ::detail::ParameterStorage::Type m2; + typename ::detail::ParameterStorage::Type m3; + typename ::detail::ParameterStorage::Type m4; + typename ::detail::ParameterStorage::Type m5; + typename ::detail::ParameterStorage::Type m6; + template + nsRunnableMethodArguments(A0&& a0, A1&& a1, A2&& a2, A3&& a3, A4&& a4, + A5&& a5, A6&& a6) + : m0(mozilla::Forward(a0)) + , m1(mozilla::Forward(a1)) + , m2(mozilla::Forward(a2)) + , m3(mozilla::Forward(a3)) + , m4(mozilla::Forward(a4)) + , m5(mozilla::Forward(a5)) + , m6(mozilla::Forward(a6)) + {} + template void apply(C* o, M m) + { + ((*o).*m)(m0.PassAsParameter(), m1.PassAsParameter(), + m2.PassAsParameter(), m3.PassAsParameter(), + m4.PassAsParameter(), m5.PassAsParameter(), + m6.PassAsParameter()); + } +}; +template +struct nsRunnableMethodArguments +{ + typename ::detail::ParameterStorage::Type m0; + typename ::detail::ParameterStorage::Type m1; + typename ::detail::ParameterStorage::Type m2; + typename ::detail::ParameterStorage::Type m3; + typename ::detail::ParameterStorage::Type m4; + typename ::detail::ParameterStorage::Type m5; + typename ::detail::ParameterStorage::Type m6; + typename ::detail::ParameterStorage::Type m7; + template + nsRunnableMethodArguments(A0&& a0, A1&& a1, A2&& a2, A3&& a3, A4&& a4, + A5&& a5, A6&& a6, A7&& a7) + : m0(mozilla::Forward(a0)) + , m1(mozilla::Forward(a1)) + , m2(mozilla::Forward(a2)) + , m3(mozilla::Forward(a3)) + , m4(mozilla::Forward(a4)) + , m5(mozilla::Forward(a5)) + , m6(mozilla::Forward(a6)) + , m7(mozilla::Forward(a7)) + {} + template void apply(C* o, M m) + { + ((*o).*m)(m0.PassAsParameter(), m1.PassAsParameter(), + m2.PassAsParameter(), m3.PassAsParameter(), + m4.PassAsParameter(), m5.PassAsParameter(), + m6.PassAsParameter(), m7.PassAsParameter()); + } +}; template class nsRunnableMethodImpl