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