From ad9d0c472d158d7b4df3250793d475724ac3516a Mon Sep 17 00:00:00 2001
From: Craig Tiller <ctiller@google.com>
Date: Mon, 23 Feb 2015 10:53:01 -0800
Subject: [PATCH] Remove dynamic_cast

---
 include/grpc++/credentials.h           |  8 ++++++++
 src/cpp/client/insecure_credentials.cc |  2 ++
 src/cpp/client/secure_credentials.cc   | 10 +++++++---
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/include/grpc++/credentials.h b/include/grpc++/credentials.h
index b462b450da..26e9b556fe 100644
--- a/include/grpc++/credentials.h
+++ b/include/grpc++/credentials.h
@@ -42,11 +42,19 @@
 namespace grpc {
 class ChannelArguments;
 class ChannelInterface;
+class SecureCredentials;
 
 class Credentials {
  public:
   virtual ~Credentials();
 
+ protected:
+  friend std::unique_ptr<Credentials> ComposeCredentials(
+    const std::unique_ptr<Credentials>& creds1,
+    const std::unique_ptr<Credentials>& creds2);
+
+  virtual SecureCredentials* AsSecureCredentials() = 0;
+
  private:
   friend std::shared_ptr<ChannelInterface> CreateChannel(
       const grpc::string& target, const std::unique_ptr<Credentials>& creds,
diff --git a/src/cpp/client/insecure_credentials.cc b/src/cpp/client/insecure_credentials.cc
index 4f3bba5c8e..8180d1e60e 100644
--- a/src/cpp/client/insecure_credentials.cc
+++ b/src/cpp/client/insecure_credentials.cc
@@ -50,6 +50,8 @@ class InsecureCredentialsImpl final : public Credentials {
     args.SetChannelArgs(&channel_args);
     return std::shared_ptr<ChannelInterface>(new Channel(target, grpc_channel_create(target.c_str(), &channel_args)));
   }
+
+  SecureCredentials* AsSecureCredentials() { return nullptr; }
 };
 }  // namespace
 
diff --git a/src/cpp/client/secure_credentials.cc b/src/cpp/client/secure_credentials.cc
index 367dfe3447..f864380105 100644
--- a/src/cpp/client/secure_credentials.cc
+++ b/src/cpp/client/secure_credentials.cc
@@ -42,7 +42,6 @@
 
 namespace grpc {
 
-namespace {
 class SecureCredentials final : public Credentials {
  public:
   explicit SecureCredentials(grpc_credentials* c_creds) : c_creds_(c_creds) {}
@@ -58,10 +57,15 @@ class SecureCredentials final : public Credentials {
         grpc_secure_channel_create(c_creds_, target.c_str(), &channel_args)));
   }
 
+  SecureCredentials* AsSecureCredentials() {
+    return this;
+  }
+
  private:
   grpc_credentials* const c_creds_;
 };
 
+namespace {
 std::unique_ptr<Credentials> WrapCredentials(grpc_credentials* creds) {
   return creds == nullptr
              ? nullptr
@@ -116,8 +120,8 @@ std::unique_ptr<Credentials> ComposeCredentials(
   // passed in here. This is OK because the underlying C objects (i.e.,
   // creds1 and creds2) into grpc_composite_credentials_create will see their
   // refcounts incremented.
-  SecureCredentials* s1 = dynamic_cast<SecureCredentials*>(creds1.get());
-  SecureCredentials* s2 = dynamic_cast<SecureCredentials*>(creds2.get());
+  SecureCredentials* s1 = creds1->AsSecureCredentials();
+  SecureCredentials* s2 = creds2->AsSecureCredentials();
   if (s1 && s2) {
     return WrapCredentials(grpc_composite_credentials_create(
         s1->GetRawCreds(), s2->GetRawCreds()));
-- 
GitLab