#ifndef HandleMessage_h #define HandleMessage_h #include "Arguments.h" namespace CoreIPC { // Dispatch functions with no reply arguments. template void callMemberFunction(const Arguments0&, C* object, MF function) { (object->*function)(); } template void callMemberFunction(const Arguments1& args, C* object, MF function) { (object->*function)(args.argument1); } template void callMemberFunction(const Arguments2& args, C* object, MF function) { (object->*function)(args.argument1, args.argument2); } template void callMemberFunction(const Arguments3& args, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3); } template void callMemberFunction(const Arguments4& args, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4); } template void callMemberFunction(const Arguments5& args, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5); } template void callMemberFunction(const Arguments6& args, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6); } template void callMemberFunction(const Arguments7& args, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6, args.argument7); } // Dispatch functions with reply arguments. template void callMemberFunction(const Arguments0&, Arguments0&, C* object, MF function) { (object->*function)(); } template void callMemberFunction(const Arguments0&, Arguments1& replyArgs, C* object, MF function) { (object->*function)(replyArgs.argument1); } template void callMemberFunction(const Arguments0&, Arguments2& replyArgs, C* object, MF function) { (object->*function)(replyArgs.argument1, replyArgs.argument2); } template void callMemberFunction(const Arguments1& args, Arguments0&, C* object, MF function) { (object->*function)(args.argument1); } template void callMemberFunction(const Arguments1& args, Arguments1& replyArgs, C* object, MF function) { (object->*function)(args.argument1, replyArgs.argument1); } template void callMemberFunction(const Arguments1& args, Arguments2& replyArgs, C* object, MF function) { (object->*function)(args.argument1, replyArgs.argument1, replyArgs.argument2); } template void callMemberFunction(const Arguments1& args, Arguments3& replyArgs, C* object, MF function) { (object->*function)(args.argument1, replyArgs.argument1, replyArgs.argument2, replyArgs.argument3); } template void callMemberFunction(const Arguments2& args, Arguments0&, C* object, MF function) { (object->*function)(args.argument1, args.argument2); } template void callMemberFunction(const Arguments1& args, Arguments4& replyArgs, C* object, MF function) { (object->*function)(args.argument1, replyArgs.argument1, replyArgs.argument2, replyArgs.argument3, replyArgs.argument4); } template void callMemberFunction(const Arguments2& args, Arguments1& replyArgs, C* object, MF function) { (object->*function)(args.argument1, args.argument2, replyArgs.argument1); } template void callMemberFunction(const Arguments2& args, Arguments2& replyArgs, C* object, MF function) { (object->*function)(args.argument1, args.argument2, replyArgs.argument1, replyArgs.argument2); } template void callMemberFunction(const Arguments3& args, Arguments1& replyArgs, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, replyArgs.argument1); } template void callMemberFunction(const Arguments3& args, Arguments2& replyArgs, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, replyArgs.argument1, replyArgs.argument2); } template void callMemberFunction(const Arguments4& args, Arguments1& replyArgs, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, replyArgs.argument1); } template void callMemberFunction(const Arguments7& args, Arguments1& replyArgs, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6, args.argument7, replyArgs.argument1); } template void callMemberFunction(const Arguments4& args, Arguments2& replyArgs, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, replyArgs.argument1, replyArgs.argument2); } template void callMemberFunction(const Arguments5& args, Arguments2& replyArgs, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, replyArgs.argument1, replyArgs.argument2); } template void callMemberFunction(const Arguments4& args, Arguments3& replyArgs, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, replyArgs.argument1, replyArgs.argument2, replyArgs.argument3); } // Variadic dispatch functions. template void callMemberFunction(const Arguments0&, ArgumentDecoder* argumentDecoder, C* object, MF function) { (object->*function)(argumentDecoder); } template void callMemberFunction(const Arguments1& args, ArgumentDecoder* argumentDecoder, C* object, MF function) { (object->*function)(args.argument1, argumentDecoder); } template void callMemberFunction(const Arguments2& args, ArgumentDecoder* argumentDecoder, C* object, MF function) { (object->*function)(args.argument1, args.argument2, argumentDecoder); } template void callMemberFunction(const Arguments3& args, ArgumentDecoder* argumentDecoder, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, argumentDecoder); } template void callMemberFunction(const Arguments4& args, ArgumentDecoder* argumentDecoder, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, argumentDecoder); } template void callMemberFunction(const Arguments5& args, ArgumentDecoder* argumentDecoder, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, argumentDecoder); } template void callMemberFunction(const Arguments6& args, ArgumentDecoder* argumentDecoder, C* object, MF function) { (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6, argumentDecoder); } // Main dispatch functions template void handleMessage(ArgumentDecoder* argumentDecoder, C* object, MF function) { typename T::DecodeType::ValueType arguments; if (!argumentDecoder->decode(arguments)) return; callMemberFunction(arguments, object, function); } template void handleMessage(ArgumentDecoder* argumentDecoder, ArgumentEncoder* replyEncoder, C* object, MF function) { typename T::DecodeType::ValueType arguments; if (!argumentDecoder->decode(arguments)) return; typename T::Reply::ValueType replyArguments; callMemberFunction(arguments, replyArguments, object, function); replyEncoder->encode(replyArguments); } template void handleMessageVariadic(ArgumentDecoder* argumentDecoder, C* object, MF function) { typename T::DecodeType::ValueType arguments; if (!argumentDecoder->decode(arguments)) return; callMemberFunction(arguments, argumentDecoder, object, function); } } // namespace CoreIPC #endif // HandleMessage_h