From 45b0bc4bec5d0b701dbe5ae98542473ef3eaa4e4 Mon Sep 17 00:00:00 2001
From: vjpai <vpai@google.com>
Date: Fri, 27 Feb 2015 16:54:17 -0800
Subject: [PATCH] Use typedefs to avoid triply-nested function templates

---
 test/cpp/qps/client_async.cc | 19 +++++++++++++------
 test/cpp/qps/server_async.cc | 29 +++++++++++++----------------
 2 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/test/cpp/qps/client_async.cc b/test/cpp/qps/client_async.cc
index 9ea9cfe8b9..0bd0f176a8 100644
--- a/test/cpp/qps/client_async.cc
+++ b/test/cpp/qps/client_async.cc
@@ -105,17 +105,24 @@ class ClientRpcContext {
   }
   virtual void report_stats(gpr_histogram *hist) = 0;
 };
+
+template <class RequestType, class ResponseType>
+using StartMethod =  std::function<
+  std::unique_ptr<grpc::ClientAsyncResponseReader
+		  <ResponseType>>(TestService::Stub *, grpc::ClientContext *,
+				  const RequestType &, void *)> ;
+
+template <class ResponseType> using DoneMethod =
+  std::function<void(grpc::Status, ResponseType *)>;
+  
 template <class RequestType, class ResponseType>
 class ClientRpcContextUnaryImpl : public ClientRpcContext {
  public:
   ClientRpcContextUnaryImpl(
       TestService::Stub *stub,
       const RequestType &req,
-      std::function<
-          std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>(
-	      TestService::Stub *, grpc::ClientContext *, const RequestType &,
-	      void *)> start_req,
-      std::function<void(grpc::Status, ResponseType *)> on_done)
+      StartMethod<RequestType,ResponseType> start_req,
+      DoneMethod<ResponseType> on_done)
       : context_(),
 	stub_(stub),
         req_(req),
@@ -150,7 +157,7 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
   RequestType req_;
   ResponseType response_;
   bool (ClientRpcContextUnaryImpl::*next_state_)();
-  std::function<void(grpc::Status, ResponseType *)> callback_;
+  DoneMethod<ResponseType> callback_;
   grpc::Status status_;
   double start_;
   std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>
diff --git a/test/cpp/qps/server_async.cc b/test/cpp/qps/server_async.cc
index c797d8af96..3d6379b73f 100644
--- a/test/cpp/qps/server_async.cc
+++ b/test/cpp/qps/server_async.cc
@@ -183,15 +183,19 @@ class AsyncQpsServerTest {
     return reinterpret_cast<ServerRpcContext *>(tag);
   }
 
+  template<class RequestType, class ResponseType>
+  using RequestMethod = std::function<void(ServerContext *, RequestType *,
+                           grpc::ServerAsyncResponseWriter<ResponseType> *,
+					   void *)>;
+  template<class RequestType, class ResponseType> using InvokeMethod =
+    std::function<grpc::Status(const RequestType *, ResponseType *)>;
+    
   template <class RequestType, class ResponseType>
   class ServerRpcContextUnaryImpl : public ServerRpcContext {
    public:
     ServerRpcContextUnaryImpl(
-        std::function<void(ServerContext *, RequestType *,
-                           grpc::ServerAsyncResponseWriter<ResponseType> *,
-                           void *)> request_method,
-        std::function<grpc::Status(const RequestType *, ResponseType *)>
-            invoke_method)
+        RequestMethod<RequestType,ResponseType> request_method,
+        InvokeMethod<RequestType,ResponseType> invoke_method)
         : next_state_(&ServerRpcContextUnaryImpl::invoker),
           request_method_(request_method),
           invoke_method_(invoke_method),
@@ -229,11 +233,8 @@ class AsyncQpsServerTest {
     ServerContext srv_ctx_;
     RequestType req_;
     bool (ServerRpcContextUnaryImpl::*next_state_)();
-    std::function<void(ServerContext *, RequestType *,
-                       grpc::ServerAsyncResponseWriter<ResponseType> *, void *)>
-        request_method_;
-    std::function<grpc::Status(const RequestType *, ResponseType *)>
-        invoke_method_;
+    RequestMethod<RequestType,ResponseType> request_method_;
+    InvokeMethod<RequestType,ResponseType> invoke_method_;
     grpc::ServerAsyncResponseWriter<ResponseType> response_writer_;
   };
 
@@ -261,12 +262,8 @@ class AsyncQpsServerTest {
   CompletionQueue srv_cq_;
   TestService::AsyncService async_service_;
   std::unique_ptr<Server> server_;
-  std::function<void(ServerContext *, SimpleRequest *,
-                     grpc::ServerAsyncResponseWriter<SimpleResponse> *, void *)>
-      request_unary_;
-  std::function<void(ServerContext *, StatsRequest *,
-                     grpc::ServerAsyncResponseWriter<ServerStats> *, void *)>
-      request_stats_;
+  RequestMethod<SimpleRequest, SimpleResponse> request_unary_;
+  RequestMethod<StatsRequest, ServerStats> request_stats_;
   std::forward_list<ServerRpcContext *> contexts_;
 };
 
-- 
GitLab