From ad9d0c472d158d7b4df3250793d475724ac3516a Mon Sep 17 00:00:00 2001 From: Craig Tiller 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 b462b450daf..26e9b556fe4 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 ComposeCredentials( + const std::unique_ptr& creds1, + const std::unique_ptr& creds2); + + virtual SecureCredentials* AsSecureCredentials() = 0; + private: friend std::shared_ptr CreateChannel( const grpc::string& target, const std::unique_ptr& creds, diff --git a/src/cpp/client/insecure_credentials.cc b/src/cpp/client/insecure_credentials.cc index 4f3bba5c8e5..8180d1e60ed 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(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 367dfe3447b..f8643801054 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 WrapCredentials(grpc_credentials* creds) { return creds == nullptr ? nullptr @@ -116,8 +120,8 @@ std::unique_ptr 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(creds1.get()); - SecureCredentials* s2 = dynamic_cast(creds2.get()); + SecureCredentials* s1 = creds1->AsSecureCredentials(); + SecureCredentials* s2 = creds2->AsSecureCredentials(); if (s1 && s2) { return WrapCredentials(grpc_composite_credentials_create( s1->GetRawCreds(), s2->GetRawCreds()));