Variadic templates for RPCs
[invirt/third/libt4.git] / rpc / rpc.h
index 723121c..f7245ad 100644 (file)
--- a/rpc/rpc.h
+++ b/rpc/rpc.h
@@ -111,144 +111,40 @@ class rpcc : public chanmgr {
                template<class R>
                        int call_m(unsigned int proc, marshall &req, R & r, TO to);
 
-               template<class R>
-                       int call(unsigned int proc, R & r, TO to = to_max); 
-               template<class R, class A1>
-                       int call(unsigned int proc, const A1 & a1, R & r, TO to = to_max); 
-               template<class R, class A1, class A2>
-                       int call(unsigned int proc, const A1 & a1, const A2 & a2, R & r, 
-                                       TO to = to_max); 
-               template<class R, class A1, class A2, class A3>
-                       int call(unsigned int proc, const A1 & a1, const A2 & a2, const A3 & a3, 
-                                       R & r, TO to = to_max); 
-               template<class R, class A1, class A2, class A3, class A4>
-                       int call(unsigned int proc, const A1 & a1, const A2 & a2, const A3 & a3, 
-                                       const A4 & a4, R & r, TO to = to_max);
-               template<class R, class A1, class A2, class A3, class A4, class A5>
-                       int call(unsigned int proc, const A1 & a1, const A2 & a2, const A3 & a3, 
-                                       const A4 & a4, const A5 & a5, R & r, TO to = to_max); 
-               template<class R, class A1, class A2, class A3, class A4, class A5,
-                       class A6>
-                               int call(unsigned int proc, const A1 & a1, const A2 & a2, const A3 & a3, 
-                                               const A4 & a4, const A5 & a5, const A6 & a6,
-                                               R & r, TO to = to_max); 
-               template<class R, class A1, class A2, class A3, class A4, class A5, 
-                       class A6, class A7>
-                               int call(unsigned int proc, const A1 & a1, const A2 & a2, const A3 & a3, 
-                                               const A4 & a4, const A5 & a5, const A6 &a6, const A7 &a7,
-                                               R & r, TO to = to_max); 
+               template<class R, typename ...Args>
+                       inline int call(unsigned int proc, R & r, const Args&... args);
 
+               template<class R, typename ...Args>
+                       inline int call_timeout(unsigned int proc, TO to, R & r, const Args&... args);
 };
 
 template<class R> int 
 rpcc::call_m(unsigned int proc, marshall &req, R & r, TO to) 
 {
-       unmarshall u;
-       int intret = call1(proc, req, u, to);
-       if (intret < 0) return intret;
-       u >> r;
-       if(u.okdone() != true) {
-                fprintf(stderr, "rpcc::call_m: failed to unmarshall the reply."
-                       "You are probably calling RPC 0x%x with wrong return "
-                       "type.\n", proc);
-                VERIFY(0);
-               return rpc_const::unmarshal_reply_failure;
-        }
-       return intret;
-}
-
-template<class R> int
-rpcc::call(unsigned int proc, R & r, TO to) 
-{
-       marshall m;
-       return call_m(proc, m, r, to);
-}
-
-template<class R, class A1> int
-rpcc::call(unsigned int proc, const A1 & a1, R & r, TO to) 
-{
-       marshall m;
-       m << a1;
-       return call_m(proc, m, r, to);
-}
-
-template<class R, class A1, class A2> int
-rpcc::call(unsigned int proc, const A1 & a1, const A2 & a2,
-               R & r, TO to) 
-{
-       marshall m;
-       m << a1;
-       m << a2;
-       return call_m(proc, m, r, to);
-}
-
-template<class R, class A1, class A2, class A3> int
-rpcc::call(unsigned int proc, const A1 & a1, const A2 & a2,
-               const A3 & a3, R & r, TO to) 
-{
-       marshall m;
-       m << a1;
-       m << a2;
-       m << a3;
-       return call_m(proc, m, r, to);
+    unmarshall u;
+    int intret = call1(proc, req, u, to);
+    if (intret < 0) return intret;
+    u >> r;
+    if (u.okdone() != true) {
+        fprintf(stderr, "rpcc::call_m: failed to unmarshall the reply."
+                "You are probably calling RPC 0x%x with wrong return "
+                "type.\n", proc);
+        VERIFY(0);
+        return rpc_const::unmarshal_reply_failure;
+    }
+    return intret;
 }
 
-template<class R, class A1, class A2, class A3, class A4> int
-rpcc::call(unsigned int proc, const A1 & a1, const A2 & a2,
-               const A3 & a3, const A4 & a4, R & r, TO to) 
+template<class R, typename... Args> inline int
+rpcc::call(unsigned int proc, R & r, const Args&... args)
 {
-       marshall m;
-       m << a1;
-       m << a2;
-       m << a3;
-       m << a4;
-       return call_m(proc, m, r, to);
-}
-
-template<class R, class A1, class A2, class A3, class A4, class A5> int
-rpcc::call(unsigned int proc, const A1 & a1, const A2 & a2,
-               const A3 & a3, const A4 & a4, const A5 & a5, R & r, TO to) 
-{
-       marshall m;
-       m << a1;
-       m << a2;
-       m << a3;
-       m << a4;
-       m << a5;
-       return call_m(proc, m, r, to);
-}
-
-template<class R, class A1, class A2, class A3, class A4, class A5,
-       class A6> int
-rpcc::call(unsigned int proc, const A1 & a1, const A2 & a2,
-               const A3 & a3, const A4 & a4, const A5 & a5, 
-               const A6 & a6, R & r, TO to) 
-{
-       marshall m;
-       m << a1;
-       m << a2;
-       m << a3;
-       m << a4;
-       m << a5;
-       m << a6;
-       return call_m(proc, m, r, to);
+    return call_timeout(proc, rpcc::to_max, r, args...);
 }
 
-template<class R, class A1, class A2, class A3, class A4, class A5,
-       class A6, class A7> int
-rpcc::call(unsigned int proc, const A1 & a1, const A2 & a2,
-               const A3 & a3, const A4 & a4, const A5 & a5, 
-               const A6 & a6, const A7 & a7,
-               R & r, TO to) 
+template<class R, typename... Args> inline int
+rpcc::call_timeout(unsigned int proc, const rpcc::TO to, R & r, const Args&... args)
 {
-       marshall m;
-       m << a1;
-       m << a2;
-       m << a3;
-       m << a4;
-       m << a5;
-       m << a6;
-       m << a7;
+       marshall m{args...};
        return call_m(proc, m, r, to);
 }