Changeset 161745 in webkit


Ignore:
Timestamp:
Jan 10, 2014 10:33:45 PM (10 years ago)
Author:
weinig@apple.com
Message:

Convert HandleMessage.h to use variadic templates
https://bugs.webkit.org/show_bug.cgi?id=126469

Reviewed by Anders Carlsson.

  • Platform/IPC/HandleMessage.h:

(IPC::callMemberFunctionImpl):
(IPC::callMemberFunction):
Replace massive copy and pasted code with variadic magic.

Location:
trunk/Source/WebKit2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r161744 r161745  
     12014-01-10  Sam Weinig  <sam@webkit.org>
     2
     3        Convert HandleMessage.h to use variadic templates
     4        https://bugs.webkit.org/show_bug.cgi?id=126469
     5
     6        Reviewed by Anders Carlsson.
     7
     8        * Platform/IPC/HandleMessage.h:
     9        (IPC::callMemberFunctionImpl):
     10        (IPC::callMemberFunction):
     11        Replace massive copy and pasted code with variadic magic.
     12
    1132014-01-10  Anders Carlsson  <andersca@apple.com>
    214
  • trunk/Source/WebKit2/Platform/IPC/HandleMessage.h

    r161358 r161745  
    55#include "MessageDecoder.h"
    66#include "MessageEncoder.h"
     7#include <wtf/StdLibExtras.h>
    78
    89namespace IPC {
    910
    1011// Dispatch functions with no reply arguments.
    11 template<typename C, typename MF>
    12 void callMemberFunction(std::tuple<>&&, C* object, MF function)
     12
     13template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex>
     14void callMemberFunctionImpl(C* object, MF function, ArgsTuple&& args, std::index_sequence<ArgsIndex...>)
    1315{
    14     (object->*function)();
     16    (object->*function)(std::get<ArgsIndex>(args)...);
    1517}
    1618
    17 template<typename C, typename MF, typename P1>
    18 void callMemberFunction(std::tuple<P1>&& args, C* object, MF function)
     19template<typename C, typename MF, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>>
     20void callMemberFunction(ArgsTuple&& args, C* object, MF function)
    1921{
    20     (object->*function)(std::get<0>(args));
    21 }
    22 
    23 template<typename C, typename MF, typename P1, typename P2>
    24 void callMemberFunction(std::tuple<P1, P2>&& args, C* object, MF function)
    25 {
    26     (object->*function)(std::get<0>(args), std::get<1>(args));
    27 }
    28 
    29 template<typename C, typename MF, typename P1, typename P2, typename P3>
    30 void callMemberFunction(std::tuple<P1, P2, P3>&& args, C* object, MF function)
    31 {
    32     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args));
    33 }
    34 
    35 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4>
    36 void callMemberFunction(std::tuple<P1, P2, P3, P4>&& args, C* object, MF function)
    37 {
    38     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args));
    39 }
    40 
    41 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5>
    42 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5>&& args, C* object, MF function)
    43 {
    44     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args));
    45 }
    46    
    47 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
    48 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, C* object, MF function)
    49 {
    50     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args));
    51 }
    52 
    53 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
    54 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7>&& args, C* object, MF function)
    55 {
    56     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args));
    57 }
    58 
    59 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8>
    60 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7, P8>&& args, C* object, MF function)
    61 {
    62     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), std::get<7>(args));
    63 }
    64 
    65 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10>
    66 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10>&& args, C* object, MF function)
    67 {
    68     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), std::get<7>(args), std::get<8>(args), std::get<9>(args));
     22    callMemberFunctionImpl(object, function, std::forward<ArgsTuple>(args), ArgsIndicies());
    6923}
    7024
    7125// Dispatch functions with reply arguments.
    7226
    73 template<typename C, typename MF>
    74 void callMemberFunction(std::tuple<>&&, std::tuple<>&, C* object, MF function)
     27template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex, typename ReplyArgsTuple, size_t... ReplyArgsIndex>
     28void callMemberFunctionImpl(C* object, MF function, ArgsTuple&& args, ReplyArgsTuple& replyArgs, std::index_sequence<ArgsIndex...>, std::index_sequence<ReplyArgsIndex...>)
    7529{
    76     (object->*function)();
     30    (object->*function)(std::get<ArgsIndex>(std::forward<ArgsTuple>(args))..., std::get<ReplyArgsIndex>(replyArgs)...);
    7731}
    7832
    79 template<typename C, typename MF, typename R1>
    80 void callMemberFunction(std::tuple<>&&, std::tuple<R1>& replyArgs, C* object, MF function)
     33template <typename C, typename MF, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>, typename ReplyArgsTuple, typename ReplyArgsIndicies = std::make_index_sequence<std::tuple_size<ReplyArgsTuple>::value>>
     34void callMemberFunction(ArgsTuple&& args, ReplyArgsTuple& replyArgs, C* object, MF function)
    8135{
    82     (object->*function)(std::get<0>(replyArgs));
    83 }
    84 
    85 template<typename C, typename MF, typename R1, typename R2>
    86 void callMemberFunction(std::tuple<>&&, std::tuple<R1, R2>& replyArgs, C* object, MF function)
    87 {
    88     (object->*function)(std::get<0>(replyArgs), std::get<1>(replyArgs));
    89 }
    90 
    91 template<typename C, typename MF, typename R1, typename R2, typename R3, typename R4, typename R5, typename R6>
    92 void callMemberFunction(std::tuple<>&&, std::tuple<R1, R2, R3, R4, R5, R6>& replyArgs, C* object, MF function)
    93 {
    94     (object->*function)(std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs), std::get<3>(replyArgs), std::get<4>(replyArgs), std::get<5>(replyArgs));
    95 }
    96 
    97 template<typename C, typename MF, typename P1>
    98 void callMemberFunction(std::tuple<P1>&& args, std::tuple<>&, C* object, MF function)
    99 {
    100     (object->*function)(std::get<0>(args));
    101 }
    102 
    103 template<typename C, typename MF, typename P1, typename R1>
    104 void callMemberFunction(std::tuple<P1>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
    105 {
    106     (object->*function)(std::get<0>(args), std::get<0>(replyArgs));
    107 }
    108 
    109 template<typename C, typename MF, typename P1, typename R1, typename R2>
    110 void callMemberFunction(std::tuple<P1>&& args, std::tuple<R1, R2>& replyArgs, C* object, MF function)
    111 {
    112     (object->*function)(std::get<0>(args), std::get<0>(replyArgs), std::get<1>(replyArgs));
    113 }
    114 
    115 template<typename C, typename MF, typename P1, typename R1, typename R2, typename R3>
    116 void callMemberFunction(std::tuple<P1>&& args, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
    117 {
    118     (object->*function)(std::get<0>(args), std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
    119 }
    120 
    121 template<typename C, typename MF, typename P1, typename P2>
    122 void callMemberFunction(std::tuple<P1, P2>&& args, std::tuple<>&, C* object, MF function)
    123 {
    124     (object->*function)(std::get<0>(args), std::get<1>(args));
    125 }
    126 
    127 template<typename C, typename MF, typename P1, typename R1, typename R2, typename R3, typename R4>
    128 void callMemberFunction(std::tuple<P1>&& args, Arguments4<R1, R2, R3, R4>& replyArgs, C* object, MF function)
    129 {
    130     (object->*function)(std::get<0>(args), std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs), std::get<3>(replyArgs));
    131 }
    132 
    133 template<typename C, typename MF, typename P1, typename P2, typename R1>
    134 void callMemberFunction(std::tuple<P1, P2>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
    135 {
    136     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<0>(replyArgs));
    137 }
    138 
    139 template<typename C, typename MF, typename P1, typename P2, typename R1, typename R2>
    140 void callMemberFunction(std::tuple<P1, P2>&& args, std::tuple<R1, R2>& replyArgs, C* object, MF function)
    141 {
    142     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<0>(replyArgs), std::get<1>(replyArgs));
    143 }
    144 
    145 template<typename C, typename MF, typename P1, typename P2, typename P3, typename R1>
    146 void callMemberFunction(std::tuple<P1, P2, P3>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
    147 {
    148     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<0>(replyArgs));
    149 }
    150 
    151 template<typename C, typename MF, typename P1, typename P2, typename P3, typename R1, typename R2>
    152 void callMemberFunction(std::tuple<P1, P2, P3>&& args, std::tuple<R1, R2>& replyArgs, C* object, MF function)
    153 {
    154     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<0>(replyArgs), std::get<1>(replyArgs));
    155 }
    156 
    157 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename R1>
    158 void callMemberFunction(std::tuple<P1, P2, P3, P4>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
    159 {
    160     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<0>(replyArgs));
    161 }
    162 
    163 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1>
    164 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
    165 {
    166     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<0>(replyArgs));
    167 }
    168 
    169 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename R1>
    170 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
    171 {
    172     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), std::get<0>(replyArgs));
    173 }
    174 
    175 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename R1>
    176 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7, P8>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
    177 {
    178     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), std::get<7>(args), std::get<0>(replyArgs));
    179 }
    180 
    181 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename R1, typename R2>
    182 void callMemberFunction(std::tuple<P1, P2, P3, P4>&& args, std::tuple<R1, R2>& replyArgs, C* object, MF function)
    183 {
    184     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<0>(replyArgs), std::get<1>(replyArgs));
    185 }
    186 
    187 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename R1, typename R2>
    188 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5>&& args, std::tuple<R1, R2>& replyArgs, C* object, MF function)
    189 {
    190     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<0>(replyArgs), std::get<1>(replyArgs));
    191 }
    192 
    193 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename R1, typename R2, typename R3>
    194 void callMemberFunction(std::tuple<P1, P2, P3, P4>&& args, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
    195 {
    196     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
    197 }
    198 
    199 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename R1, typename R2, typename R3>
    200 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5>&& args, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
    201 {
    202     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
    203 }
    204 
    205 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1, typename R2>
    206 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, std::tuple<R1, R2>& replyArgs, C* object, MF function)
    207 {
    208     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<0>(replyArgs), std::get<1>(replyArgs));
    209 }
    210 
    211 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1, typename R2, typename R3>
    212 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
    213 {
    214     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
    215 }
    216 
    217 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1, typename R2, typename R3, typename R4>
    218 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, std::tuple<R1, R2, R3, R4>& replyArgs, C* object, MF function)
    219 {
    220     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs), std::get<3>(replyArgs));
     36    callMemberFunctionImpl(object, function, std::forward<ArgsTuple>(args), replyArgs, ArgsIndicies(), ReplyArgsIndicies());
    22137}
    22238
    22339// Dispatch functions with delayed reply arguments.
    224 template<typename C, typename MF, typename R>
    225 void callMemberFunction(std::tuple<>&&, PassRefPtr<R> delayedReply, C* object, MF function)
     40
     41template <typename C, typename MF, typename R, typename ArgsTuple, size_t... ArgsIndex>
     42void callMemberFunctionImpl(C* object, MF function, PassRefPtr<R> delayedReply, ArgsTuple&& args, std::index_sequence<ArgsIndex...>)
    22643{
    227     (object->*function)(delayedReply);
     44    (object->*function)(std::get<ArgsIndex>(args)..., delayedReply);
    22845}
    22946
    230 template<typename C, typename MF, typename P1, typename R>
    231 void callMemberFunction(std::tuple<P1>&& args, PassRefPtr<R> delayedReply, C* object, MF function)
     47template<typename C, typename MF, typename R, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>>
     48void callMemberFunction(ArgsTuple&& args, PassRefPtr<R> delayedReply, C* object, MF function)
    23249{
    233     (object->*function)(std::get<0>(args), delayedReply);
     50    callMemberFunctionImpl(object, function, delayedReply, std::forward<ArgsTuple>(args), ArgsIndicies());
    23451}
    23552
    236 template<typename C, typename MF, typename P1, typename P2, typename R>
    237 void callMemberFunction(std::tuple<P1, P2>&& args, PassRefPtr<R> delayedReply, C* object, MF function)
     53// Dispatch functions with connection parameter with no reply arguments.
     54
     55template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex>
     56void callMemberFunctionImpl(C* object, MF function, Connection* connection, ArgsTuple&& args, std::index_sequence<ArgsIndex...>)
    23857{
    239     (object->*function)(std::get<0>(args), std::get<1>(args), delayedReply);
     58    (object->*function)(connection, std::get<ArgsIndex>(args)...);
    24059}
    24160
    242 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename R>
    243 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7, P8>&& args, PassRefPtr<R> delayedReply, C* object, MF function)
     61template<typename C, typename MF, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>>
     62void callMemberFunction(Connection* connection, ArgsTuple&& args, C* object, MF function)
    24463{
    245     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), std::get<7>(args), delayedReply);
     64    callMemberFunctionImpl(object, function, connection, std::forward<ArgsTuple>(args), ArgsIndicies());
    24665}
    24766
    248 // Dispatch functions with connection parameter.
    249 template<typename C, typename MF>
    250 void callMemberFunction(Connection* connection, std::tuple<>&&, C* object, MF function)
     67// Dispatch functions with connection parameter with reply arguments.
     68
     69template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex, typename ReplyArgsTuple, size_t... ReplyArgsIndex>
     70void callMemberFunctionImpl(C* object, MF function, Connection* connection, ArgsTuple&& args, ReplyArgsTuple& replyArgs, std::index_sequence<ArgsIndex...>, std::index_sequence<ReplyArgsIndex...>)
    25171{
    252     (object->*function)(connection);
     72    (object->*function)(connection, std::get<ArgsIndex>(std::forward<ArgsTuple>(args))..., std::get<ReplyArgsIndex>(replyArgs)...);
    25373}
    25474
    255 template<typename C, typename MF, typename P1>
    256 void callMemberFunction(Connection* connection, std::tuple<P1>&& args, C* object, MF function)
     75template <typename C, typename MF, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>, typename ReplyArgsTuple, typename ReplyArgsIndicies = std::make_index_sequence<std::tuple_size<ReplyArgsTuple>::value>>
     76void callMemberFunction(Connection* connection, ArgsTuple&& args, ReplyArgsTuple& replyArgs, C* object, MF function)
    25777{
    258     (object->*function)(connection, std::get<0>(args));
    259 }
    260 
    261 template<typename C, typename MF, typename P1, typename P2>
    262 void callMemberFunction(Connection* connection, std::tuple<P1, P2>&& args, C* object, MF function)
    263 {
    264     (object->*function)(connection, std::get<0>(args), std::get<1>(args));
    265 }
    266 
    267 template<typename C, typename MF, typename P1, typename P2, typename P3>
    268 void callMemberFunction(Connection* connection, std::tuple<P1, P2, P3>&& args, C* object, MF function)
    269 {
    270     (object->*function)(connection, std::get<0>(args), std::get<1>(args), std::get<2>(args));
    271 }
    272 
    273 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4>
    274 void callMemberFunction(Connection* connection, std::tuple<P1, P2, P3, P4>&& args, C* object, MF function)
    275 {
    276     (object->*function)(connection, std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args));
    277 }
    278 
    279 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5>
    280 void callMemberFunction(Connection* connection, std::tuple<P1, P2, P3, P4, P5>&& args, C* object, MF function)
    281 {
    282     (object->*function)(connection, std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args));
    283 }
    284 
    285 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
    286 void callMemberFunction(Connection* connection, std::tuple<P1, P2, P3, P4, P5, P6>&& args, C* object, MF function)
    287 {
    288     (object->*function)(connection, std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args));
    289 }
    290 
    291 template<typename C, typename MF, typename P1, typename P2, typename R1>
    292 void callMemberFunction(Connection* connection, std::tuple<P1, P2>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
    293 {
    294     (object->*function)(connection, std::get<0>(args), std::get<1>(args), std::get<0>(replyArgs));
    295 }
    296 
    297 template<typename C, typename MF, typename P1, typename R1>
    298 void callMemberFunction(Connection* connection, std::tuple<P1>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
    299 {
    300     (object->*function)(connection, std::get<0>(args), std::get<0>(replyArgs));
     78    callMemberFunctionImpl(object, function, connection, std::forward<ArgsTuple>(args), replyArgs, ArgsIndicies(), ReplyArgsIndicies());
    30179}
    30280
    30381// Variadic dispatch functions.
    30482
    305 template<typename C, typename MF>
    306 void callMemberFunction(std::tuple<>&&, MessageDecoder& decoder, C* object, MF function)
     83template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex>
     84void callMemberFunctionImpl(C* object, MF function, MessageDecoder& decoder, ArgsTuple&& args, std::index_sequence<ArgsIndex...>)
    30785{
    308     (object->*function)(decoder);
     86    (object->*function)(std::get<ArgsIndex>(args)..., decoder);
    30987}
    31088
    311 template<typename C, typename MF, typename P1>
    312 void callMemberFunction(std::tuple<P1>&& args, MessageDecoder& decoder, C* object, MF function)
     89template<typename C, typename MF, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>>
     90void callMemberFunction(ArgsTuple&& args, MessageDecoder& decoder, C* object, MF function)
    31391{
    314     (object->*function)(std::get<0>(args), decoder);
    315 }
    316 
    317 template<typename C, typename MF, typename P1, typename P2>
    318 void callMemberFunction(std::tuple<P1, P2>&& args, MessageDecoder& decoder, C* object, MF function)
    319 {
    320     (object->*function)(std::get<0>(args), std::get<1>(args), decoder);
    321 }
    322 
    323 template<typename C, typename MF, typename P1, typename P2, typename P3>
    324 void callMemberFunction(std::tuple<P1, P2, P3>&& args, MessageDecoder& decoder, C* object, MF function)
    325 {
    326     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), decoder);
    327 }
    328 
    329 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4>
    330 void callMemberFunction(std::tuple<P1, P2, P3, P4>&& args, MessageDecoder& decoder, C* object, MF function)
    331 {
    332     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), decoder);
    333 }
    334 
    335 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5>
    336 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5>&& args, MessageDecoder& decoder, C* object, MF function)
    337 {
    338     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), decoder);
    339 }
    340    
    341 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
    342 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, MessageDecoder& decoder, C* object, MF function)
    343 {
    344     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), decoder);
    345 }
    346 
    347 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
    348 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7>&& args, MessageDecoder& decoder, C* object, MF function)
    349 {
    350     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), decoder);
     92    callMemberFunctionImpl(object, function, decoder, std::forward<ArgsTuple>(args), ArgsIndicies());
    35193}
    35294
    35395// Variadic dispatch functions with non-variadic reply arguments.
    35496
    355 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename R1, typename R2, typename R3>
    356 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5>&& args, MessageDecoder& decoder, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
     97template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex, typename ReplyArgsTuple, size_t... ReplyArgsIndex>
     98void callMemberFunctionImpl(C* object, MF function, MessageDecoder& decoder, ArgsTuple&& args, ReplyArgsTuple& replyArgs, std::index_sequence<ArgsIndex...>, std::index_sequence<ReplyArgsIndex...>)
    35799{
    358     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), decoder, std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
     100    (object->*function)(std::get<ArgsIndex>(std::forward<ArgsTuple>(args))..., decoder, std::get<ReplyArgsIndex>(replyArgs)...);
    359101}
    360102
    361 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1, typename R2>
    362 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, MessageDecoder& decoder, std::tuple<R1, R2>& replyArgs, C* object, MF function)
     103template <typename C, typename MF, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>, typename ReplyArgsTuple, typename ReplyArgsIndicies = std::make_index_sequence<std::tuple_size<ReplyArgsTuple>::value>>
     104void callMemberFunction(ArgsTuple&& args, MessageDecoder& decoder, ReplyArgsTuple& replyArgs, C* object, MF function)
    363105{
    364     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), decoder, std::get<0>(replyArgs), std::get<1>(replyArgs));
    365 }
    366 
    367 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename R1, typename R2, typename R3>
    368 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7>&& args, MessageDecoder& decoder, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
    369 {
    370     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), decoder, std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
    371 }
    372 
    373 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename R1, typename R2, typename R3>
    374 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7, P8>&& args, MessageDecoder& decoder, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
    375 {
    376     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), std::get<7>(args), decoder, std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
     106    callMemberFunctionImpl(object, function, decoder, std::forward<ArgsTuple>(args), replyArgs, ArgsIndicies(), ReplyArgsIndicies());
    377107}
    378108
    379109// Main dispatch functions
     110
    380111template<typename T, typename C, typename MF>
    381112void handleMessage(MessageDecoder& decoder, C* object, MF function)
Note: See TracChangeset for help on using the changeset viewer.