Changeset 161745 in webkit
- Timestamp:
- Jan 10, 2014 10:33:45 PM (10 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r161744 r161745 1 2014-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 1 13 2014-01-10 Anders Carlsson <andersca@apple.com> 2 14 -
trunk/Source/WebKit2/Platform/IPC/HandleMessage.h
r161358 r161745 5 5 #include "MessageDecoder.h" 6 6 #include "MessageEncoder.h" 7 #include <wtf/StdLibExtras.h> 7 8 8 9 namespace IPC { 9 10 10 11 // Dispatch functions with no reply arguments. 11 template<typename C, typename MF> 12 void callMemberFunction(std::tuple<>&&, C* object, MF function) 12 13 template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex> 14 void callMemberFunctionImpl(C* object, MF function, ArgsTuple&& args, std::index_sequence<ArgsIndex...>) 13 15 { 14 (object->*function)( );16 (object->*function)(std::get<ArgsIndex>(args)...); 15 17 } 16 18 17 template<typename C, typename MF, typename P1>18 void callMemberFunction( std::tuple<P1>&& args, C* object, MF function)19 template<typename C, typename MF, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>> 20 void callMemberFunction(ArgsTuple&& args, C* object, MF function) 19 21 { 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()); 69 23 } 70 24 71 25 // Dispatch functions with reply arguments. 72 26 73 template <typename C, typename MF>74 void callMemberFunction (std::tuple<>&&, std::tuple<>&, C* object, MF function)27 template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex, typename ReplyArgsTuple, size_t... ReplyArgsIndex> 28 void callMemberFunctionImpl(C* object, MF function, ArgsTuple&& args, ReplyArgsTuple& replyArgs, std::index_sequence<ArgsIndex...>, std::index_sequence<ReplyArgsIndex...>) 75 29 { 76 (object->*function)( );30 (object->*function)(std::get<ArgsIndex>(std::forward<ArgsTuple>(args))..., std::get<ReplyArgsIndex>(replyArgs)...); 77 31 } 78 32 79 template <typename C, typename MF, typename R1>80 void callMemberFunction( std::tuple<>&&, std::tuple<R1>& replyArgs, C* object, MF function)33 template <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>> 34 void callMemberFunction(ArgsTuple&& args, ReplyArgsTuple& replyArgs, C* object, MF function) 81 35 { 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()); 221 37 } 222 38 223 39 // 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 41 template <typename C, typename MF, typename R, typename ArgsTuple, size_t... ArgsIndex> 42 void callMemberFunctionImpl(C* object, MF function, PassRefPtr<R> delayedReply, ArgsTuple&& args, std::index_sequence<ArgsIndex...>) 226 43 { 227 (object->*function)( delayedReply);44 (object->*function)(std::get<ArgsIndex>(args)..., delayedReply); 228 45 } 229 46 230 template<typename C, typename MF, typename P1, typename R>231 void callMemberFunction( std::tuple<P1>&& args, PassRefPtr<R> delayedReply, C* object, MF function)47 template<typename C, typename MF, typename R, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>> 48 void callMemberFunction(ArgsTuple&& args, PassRefPtr<R> delayedReply, C* object, MF function) 232 49 { 233 (object->*function)(std::get<0>(args), delayedReply);50 callMemberFunctionImpl(object, function, delayedReply, std::forward<ArgsTuple>(args), ArgsIndicies()); 234 51 } 235 52 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 55 template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex> 56 void callMemberFunctionImpl(C* object, MF function, Connection* connection, ArgsTuple&& args, std::index_sequence<ArgsIndex...>) 238 57 { 239 (object->*function)( std::get<0>(args), std::get<1>(args), delayedReply);58 (object->*function)(connection, std::get<ArgsIndex>(args)...); 240 59 } 241 60 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)61 template<typename C, typename MF, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>> 62 void callMemberFunction(Connection* connection, ArgsTuple&& args, C* object, MF function) 244 63 { 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()); 246 65 } 247 66 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 69 template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex, typename ReplyArgsTuple, size_t... ReplyArgsIndex> 70 void callMemberFunctionImpl(C* object, MF function, Connection* connection, ArgsTuple&& args, ReplyArgsTuple& replyArgs, std::index_sequence<ArgsIndex...>, std::index_sequence<ReplyArgsIndex...>) 251 71 { 252 (object->*function)(connection );72 (object->*function)(connection, std::get<ArgsIndex>(std::forward<ArgsTuple>(args))..., std::get<ReplyArgsIndex>(replyArgs)...); 253 73 } 254 74 255 template <typename C, typename MF, typename P1>256 void callMemberFunction(Connection* connection, std::tuple<P1>&& args, C* object, MF function)75 template <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>> 76 void callMemberFunction(Connection* connection, ArgsTuple&& args, ReplyArgsTuple& replyArgs, C* object, MF function) 257 77 { 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()); 301 79 } 302 80 303 81 // Variadic dispatch functions. 304 82 305 template <typename C, typename MF>306 void callMemberFunction (std::tuple<>&&, MessageDecoder& decoder, C* object, MF function)83 template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex> 84 void callMemberFunctionImpl(C* object, MF function, MessageDecoder& decoder, ArgsTuple&& args, std::index_sequence<ArgsIndex...>) 307 85 { 308 (object->*function)( decoder);86 (object->*function)(std::get<ArgsIndex>(args)..., decoder); 309 87 } 310 88 311 template<typename C, typename MF, typename P1>312 void callMemberFunction( std::tuple<P1>&& args, MessageDecoder& decoder, C* object, MF function)89 template<typename C, typename MF, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>> 90 void callMemberFunction(ArgsTuple&& args, MessageDecoder& decoder, C* object, MF function) 313 91 { 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()); 351 93 } 352 94 353 95 // Variadic dispatch functions with non-variadic reply arguments. 354 96 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)97 template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex, typename ReplyArgsTuple, size_t... ReplyArgsIndex> 98 void callMemberFunctionImpl(C* object, MF function, MessageDecoder& decoder, ArgsTuple&& args, ReplyArgsTuple& replyArgs, std::index_sequence<ArgsIndex...>, std::index_sequence<ReplyArgsIndex...>) 357 99 { 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)...); 359 101 } 360 102 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)103 template <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>> 104 void callMemberFunction(ArgsTuple&& args, MessageDecoder& decoder, ReplyArgsTuple& replyArgs, C* object, MF function) 363 105 { 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()); 377 107 } 378 108 379 109 // Main dispatch functions 110 380 111 template<typename T, typename C, typename MF> 381 112 void handleMessage(MessageDecoder& decoder, C* object, MF function)
Note: See TracChangeset
for help on using the changeset viewer.