[Orc] Add overloads of RPC::handle and RPC::expect that take member functions as
[oota-llvm.git] / include / llvm / ExecutionEngine / Orc / RPCUtils.h
index a2f0edb73346bd4dc766a95c13df25a6603505f1..0bd5cbc0cdde0e59c44513f5f44058c5f9e7dd05 100644 (file)
@@ -69,6 +69,20 @@ protected:
     }
   };
 
+  template <typename ClassT, typename... ArgTs> class MemberFnWrapper {
+  public:
+    typedef std::error_code (ClassT::*MethodT)(ArgTs...);
+    MemberFnWrapper(ClassT &Instance, MethodT Method)
+        : Instance(Instance), Method(Method) {}
+    std::error_code operator()(ArgTs &... Args) {
+      return (Instance.*Method)(Args...);
+    }
+
+  private:
+    ClassT &Instance;
+    MethodT Method;
+  };
+
   template <typename... ArgTs> class ReadArgs {
   public:
     std::error_code operator()() { return std::error_code(); }
@@ -193,6 +207,15 @@ public:
     return HandlerHelper<ChannelT, Proc>::handle(C, Handler);
   }
 
+  /// Helper version of 'handle' for calling member functions.
+  template <typename Proc, typename ClassT, typename... ArgTs>
+  static std::error_code
+  handle(ChannelT &C, ClassT &Instance,
+         std::error_code (ClassT::*HandlerMethod)(ArgTs...)) {
+    return handle<Proc>(
+        C, MemberFnWrapper<ClassT, ArgTs...>(Instance, HandlerMethod));
+  }
+
   /// Deserialize a ProcedureIdT from C and verify it matches the id for Proc.
   /// If the id does match, deserialize the arguments and call the handler
   /// (similarly to handle).
@@ -208,6 +231,15 @@ public:
     return handle<Proc>(C, Handler);
   }
 
+  /// Helper version of expect for calling member functions.
+  template <typename Proc, typename ClassT, typename... ArgTs>
+  static std::error_code
+  expect(ChannelT &C, ClassT &Instance,
+         std::error_code (ClassT::*HandlerMethod)(ArgTs...)) {
+    return expect<Proc>(
+        C, MemberFnWrapper<ClassT, ArgTs...>(Instance, HandlerMethod));
+  }
+
   /// Helper for handling setter procedures - this method returns a functor that
   /// sets the variables referred to by Args... to values deserialized from the
   /// channel.