From 7fca169d25a0314927f1a6cb027a762a50e8c36b Mon Sep 17 00:00:00 2001 From: Victor Vazquez Date: Wed, 10 Mar 2021 22:13:51 +0000 Subject: [PATCH] Create StringExtensions in azure core internal (#1837) --- .../core/case_insensitive_containers.hpp | 5 +- .../inc/azure/core/internal/strings.hpp | 36 +++++++++------ .../inc/azure/core/operation_status.hpp | 3 +- .../src/environment_log_level_listener.cpp | 2 +- sdk/core/azure-core/src/http/raw_response.cpp | 2 +- sdk/core/azure-core/src/http/request.cpp | 2 +- sdk/core/azure-core/src/http/url.cpp | 2 +- sdk/core/azure-core/src/strings.cpp | 12 +++-- sdk/core/azure-core/test/ut/string.cpp | 46 +++++++++---------- sdk/core/perf/src/program.cpp | 3 +- .../test/ut/telemetry_header_test.cpp | 4 +- .../src/shared_key_policy.cpp | 6 +-- .../azure-storage-common/test/test_base.cpp | 2 +- 13 files changed, 70 insertions(+), 55 deletions(-) diff --git a/sdk/core/azure-core/inc/azure/core/case_insensitive_containers.hpp b/sdk/core/azure-core/inc/azure/core/case_insensitive_containers.hpp index 323759e53..43a301359 100644 --- a/sdk/core/azure-core/inc/azure/core/case_insensitive_containers.hpp +++ b/sdk/core/azure-core/inc/azure/core/case_insensitive_containers.hpp @@ -21,11 +21,12 @@ namespace Azure { namespace Core { * comparison. */ using CaseInsensitiveMap - = std::map; + = std::map; /** * @brief A type alias of `std::set` with case-insensitive element comparison. */ - using CaseInsensitiveSet = std::set; + using CaseInsensitiveSet + = std::set; }} // namespace Azure::Core diff --git a/sdk/core/azure-core/inc/azure/core/internal/strings.hpp b/sdk/core/azure-core/inc/azure/core/internal/strings.hpp index 912089d27..449def37a 100644 --- a/sdk/core/azure-core/inc/azure/core/internal/strings.hpp +++ b/sdk/core/azure-core/inc/azure/core/internal/strings.hpp @@ -11,21 +11,31 @@ #include #include -namespace Azure { namespace Core { namespace _internal { namespace Strings { +namespace Azure { namespace Core { namespace _internal { - bool LocaleInvariantCaseInsensitiveEqual(const std::string& lhs, const std::string& rhs) noexcept; - std::string const ToLower(const std::string& src) noexcept; - unsigned char ToLower(const unsigned char src) noexcept; - - struct CaseInsensitiveComparator + /** + * @brief Extend the functionality of std::string by offering static methods for string + * operations. + * + */ + struct StringExtensions { - bool operator()(const std::string& lhs, const std::string& rhs) const + struct CaseInsensitiveComparator { - return std::lexicographical_compare( - lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), [](char c1, char c2) { - return ToLower(c1) < ToLower(c2); - }); - } + bool operator()(const std::string& lhs, const std::string& rhs) const + { + return std::lexicographical_compare( + lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), [](char c1, char c2) { + return ToLower(c1) < ToLower(c2); + }); + } + }; + + static bool LocaleInvariantCaseInsensitiveEqual( + const std::string& lhs, + const std::string& rhs) noexcept; + static std::string const ToLower(const std::string& src) noexcept; + static unsigned char ToLower(const unsigned char src) noexcept; }; -}}}} // namespace Azure::Core::_internal::Strings +}}} // namespace Azure::Core::_internal diff --git a/sdk/core/azure-core/inc/azure/core/operation_status.hpp b/sdk/core/azure-core/inc/azure/core/operation_status.hpp index e75ee9155..629e9ced3 100644 --- a/sdk/core/azure-core/inc/azure/core/operation_status.hpp +++ b/sdk/core/azure-core/inc/azure/core/operation_status.hpp @@ -53,7 +53,8 @@ namespace Azure { namespace Core { */ bool operator==(const OperationStatus& other) const noexcept { - return _internal::Strings::LocaleInvariantCaseInsensitiveEqual(m_value, other.m_value); + return _internal::StringExtensions::LocaleInvariantCaseInsensitiveEqual( + m_value, other.m_value); } /** diff --git a/sdk/core/azure-core/src/environment_log_level_listener.cpp b/sdk/core/azure-core/src/environment_log_level_listener.cpp index fc9e13d12..35a1d7cc2 100644 --- a/sdk/core/azure-core/src/environment_log_level_listener.cpp +++ b/sdk/core/azure-core/src/environment_log_level_listener.cpp @@ -51,7 +51,7 @@ Logger::Level const* GetEnvironmentLogLevel() if (envVar) { - auto const logLevelStr = _internal::Strings::ToLower(envVar); + auto const logLevelStr = _internal::StringExtensions::ToLower(envVar); // See https://github.com/Azure/azure-sdk-for-java/wiki/Logging-with-Azure-SDK // And diff --git a/sdk/core/azure-core/src/http/raw_response.cpp b/sdk/core/azure-core/src/http/raw_response.cpp index 12333cd99..e4f1043b0 100644 --- a/sdk/core/azure-core/src/http/raw_response.cpp +++ b/sdk/core/azure-core/src/http/raw_response.cpp @@ -30,7 +30,7 @@ void RawResponse::SetHeader(uint8_t const* const first, uint8_t const* const las } // Always toLower() headers - auto headerName = Azure::Core::_internal::Strings::ToLower(std::string(start, end)); + auto headerName = Azure::Core::_internal::StringExtensions::ToLower(std::string(start, end)); start = end + 1; // start value while (start < last && (*start == ' ' || *start == '\t')) { diff --git a/sdk/core/azure-core/src/http/request.cpp b/sdk/core/azure-core/src/http/request.cpp index 0e669d97a..ce2dc130e 100644 --- a/sdk/core/azure-core/src/http/request.cpp +++ b/sdk/core/azure-core/src/http/request.cpp @@ -24,7 +24,7 @@ static Azure::Core::CaseInsensitiveMap MergeMaps( void Request::SetHeader(std::string const& name, std::string const& value) { - auto headerNameLowerCase = Azure::Core::_internal::Strings::ToLower(name); + auto headerNameLowerCase = Azure::Core::_internal::StringExtensions::ToLower(name); return this->m_retryModeEnabled ? _detail::InsertHeaderWithValidation(this->m_retryHeaders, headerNameLowerCase, value) : _detail::InsertHeaderWithValidation(this->m_headers, headerNameLowerCase, value); diff --git a/sdk/core/azure-core/src/http/url.cpp b/sdk/core/azure-core/src/http/url.cpp index d1d96001d..3b97ad23b 100644 --- a/sdk/core/azure-core/src/http/url.cpp +++ b/sdk/core/azure-core/src/http/url.cpp @@ -22,7 +22,7 @@ Url::Url(const std::string& url) { std::transform(url.begin(), url.begin() + schemeIter, std::back_inserter(m_scheme), [](char c) { return static_cast( - Azure::Core::_internal::Strings::ToLower(static_cast(c))); + Azure::Core::_internal::StringExtensions::ToLower(static_cast(c))); }); pos = url.begin() + schemeIter + schemeEnd.length(); diff --git a/sdk/core/azure-core/src/strings.cpp b/sdk/core/azure-core/src/strings.cpp index de0b21ea2..4047bc5a9 100644 --- a/sdk/core/azure-core/src/strings.cpp +++ b/sdk/core/azure-core/src/strings.cpp @@ -67,14 +67,14 @@ const unsigned char LocaleInvariantLowercaseTable[256] = { }; } // unnamed namespace -namespace Azure { namespace Core { namespace _internal { namespace Strings { +namespace Azure { namespace Core { namespace _internal { - unsigned char ToLower(const unsigned char symbol) noexcept + unsigned char StringExtensions::ToLower(const unsigned char symbol) noexcept { return LocaleInvariantLowercaseTable[symbol]; } - std::string const ToLower(const std::string& src) noexcept + std::string const StringExtensions::ToLower(const std::string& src) noexcept { auto result = std::string(src); for (auto i = result.begin(); i < result.end(); i++) @@ -84,7 +84,9 @@ namespace Azure { namespace Core { namespace _internal { namespace Strings { return result; } - bool LocaleInvariantCaseInsensitiveEqual(const std::string& lhs, const std::string& rhs) noexcept + bool StringExtensions::LocaleInvariantCaseInsensitiveEqual( + const std::string& lhs, + const std::string& rhs) noexcept { return std::equal( lhs.begin(), @@ -97,4 +99,4 @@ namespace Azure { namespace Core { namespace _internal { namespace Strings { }); } -}}}} // namespace Azure::Core::_internal::Strings +}}} // namespace Azure::Core::_internal diff --git a/sdk/core/azure-core/test/ut/string.cpp b/sdk/core/azure-core/test/ut/string.cpp index eec96093d..dc0c9c4a4 100644 --- a/sdk/core/azure-core/test/ut/string.cpp +++ b/sdk/core/azure-core/test/ut/string.cpp @@ -7,31 +7,31 @@ TEST(String, invariantCompare) { - using Azure::Core::_internal::Strings::LocaleInvariantCaseInsensitiveEqual; - EXPECT_TRUE(LocaleInvariantCaseInsensitiveEqual("", "")); - EXPECT_TRUE(LocaleInvariantCaseInsensitiveEqual("a", "a")); - EXPECT_TRUE(LocaleInvariantCaseInsensitiveEqual("A", "a")); - EXPECT_TRUE(LocaleInvariantCaseInsensitiveEqual("AA", "aa")); - EXPECT_TRUE(LocaleInvariantCaseInsensitiveEqual("aA", "aa")); - EXPECT_TRUE(LocaleInvariantCaseInsensitiveEqual("ABC", "abc")); - EXPECT_FALSE(LocaleInvariantCaseInsensitiveEqual("", "a")); - EXPECT_FALSE(LocaleInvariantCaseInsensitiveEqual("a", "")); - EXPECT_FALSE(LocaleInvariantCaseInsensitiveEqual("A", "aA")); - EXPECT_FALSE(LocaleInvariantCaseInsensitiveEqual("ABC", "abcd")); + using Azure::Core::_internal::StringExtensions; + EXPECT_TRUE(StringExtensions::LocaleInvariantCaseInsensitiveEqual("", "")); + EXPECT_TRUE(StringExtensions::LocaleInvariantCaseInsensitiveEqual("a", "a")); + EXPECT_TRUE(StringExtensions::LocaleInvariantCaseInsensitiveEqual("A", "a")); + EXPECT_TRUE(StringExtensions::LocaleInvariantCaseInsensitiveEqual("AA", "aa")); + EXPECT_TRUE(StringExtensions::LocaleInvariantCaseInsensitiveEqual("aA", "aa")); + EXPECT_TRUE(StringExtensions::LocaleInvariantCaseInsensitiveEqual("ABC", "abc")); + EXPECT_FALSE(StringExtensions::LocaleInvariantCaseInsensitiveEqual("", "a")); + EXPECT_FALSE(StringExtensions::LocaleInvariantCaseInsensitiveEqual("a", "")); + EXPECT_FALSE(StringExtensions::LocaleInvariantCaseInsensitiveEqual("A", "aA")); + EXPECT_FALSE(StringExtensions::LocaleInvariantCaseInsensitiveEqual("ABC", "abcd")); } TEST(String, toLower) { - using Azure::Core::_internal::Strings::ToLower; - EXPECT_TRUE(ToLower("") == ""); - EXPECT_TRUE(ToLower("a") == "a"); - EXPECT_TRUE(ToLower("A") == "a"); - EXPECT_TRUE(ToLower("AA") == "aa"); - EXPECT_TRUE(ToLower("aA") == "aa"); - EXPECT_TRUE(ToLower("ABC") == "abc"); - EXPECT_TRUE(ToLower("ABC-1-,!@#$%^&*()_+=ABC") == "abc-1-,!@#$%^&*()_+=abc"); - EXPECT_FALSE(ToLower("") == "a"); - EXPECT_FALSE(ToLower("a") == ""); - EXPECT_FALSE(ToLower("a") == "aA"); - EXPECT_FALSE(ToLower("abc") == "abcd"); + using Azure::Core::_internal::StringExtensions; + EXPECT_TRUE(StringExtensions::ToLower("") == ""); + EXPECT_TRUE(StringExtensions::ToLower("a") == "a"); + EXPECT_TRUE(StringExtensions::ToLower("A") == "a"); + EXPECT_TRUE(StringExtensions::ToLower("AA") == "aa"); + EXPECT_TRUE(StringExtensions::ToLower("aA") == "aa"); + EXPECT_TRUE(StringExtensions::ToLower("ABC") == "abc"); + EXPECT_TRUE(StringExtensions::ToLower("ABC-1-,!@#$%^&*()_+=ABC") == "abc-1-,!@#$%^&*()_+=abc"); + EXPECT_FALSE(StringExtensions::ToLower("") == "a"); + EXPECT_FALSE(StringExtensions::ToLower("a") == ""); + EXPECT_FALSE(StringExtensions::ToLower("a") == "aA"); + EXPECT_FALSE(StringExtensions::ToLower("abc") == "abcd"); } diff --git a/sdk/core/perf/src/program.cpp b/sdk/core/perf/src/program.cpp index b8eb804a3..9ba88770c 100644 --- a/sdk/core/perf/src/program.cpp +++ b/sdk/core/perf/src/program.cpp @@ -41,7 +41,8 @@ inline Azure::Perf::TestMetadata const* GetTestMetadata( for (auto& test : tests) { - if (Azure::Core::_internal::Strings::LocaleInvariantCaseInsensitiveEqual(test.Name, testName)) + if (Azure::Core::_internal::StringExtensions::LocaleInvariantCaseInsensitiveEqual( + test.Name, testName)) { return &test; } diff --git a/sdk/keyvault/azure-security-keyvault-keys/test/ut/telemetry_header_test.cpp b/sdk/keyvault/azure-security-keyvault-keys/test/ut/telemetry_header_test.cpp index 7e8591494..230efc794 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/test/ut/telemetry_header_test.cpp +++ b/sdk/keyvault/azure-security-keyvault-keys/test/ut/telemetry_header_test.cpp @@ -31,14 +31,14 @@ TEST_F(MockedTransportAdapterTest, keyvaultTelemetryId) auto foundHeader = false; for (auto& header : response.GetRawResponse().GetHeaders()) { - if (Azure::Core::_internal::Strings::LocaleInvariantCaseInsensitiveEqual( + if (Azure::Core::_internal::StringExtensions::LocaleInvariantCaseInsensitiveEqual( header.first, "User-Agent")) { foundHeader = true; EXPECT_PRED2( [](std::string const& received, std::string const& sent) { auto telemetryInfoWithNoOSAndDate = received.substr(0, sent.size()); - return Azure::Core::_internal::Strings::LocaleInvariantCaseInsensitiveEqual( + return Azure::Core::_internal::StringExtensions::LocaleInvariantCaseInsensitiveEqual( telemetryInfoWithNoOSAndDate, sent); }, header.second, diff --git a/sdk/storage/azure-storage-common/src/shared_key_policy.cpp b/sdk/storage/azure-storage-common/src/shared_key_policy.cpp index 2286f979c..e017a672a 100644 --- a/sdk/storage/azure-storage-common/src/shared_key_policy.cpp +++ b/sdk/storage/azure-storage-common/src/shared_key_policy.cpp @@ -32,7 +32,7 @@ namespace Azure { namespace Storage { namespace _detail { "If-Unmodified-Since", "Range"}) { - auto ite = headers.find(Azure::Core::_internal::Strings::ToLower(headerName)); + auto ite = headers.find(Azure::Core::_internal::StringExtensions::ToLower(headerName)); if (ite != headers.end()) { if (headerName == "Content-Length" && ite->second == "0") @@ -54,7 +54,7 @@ namespace Azure { namespace Storage { namespace _detail { ite != headers.end() && ite->first.substr(0, prefix.length()) == prefix; ++ite) { - std::string key = Azure::Core::_internal::Strings::ToLower(ite->first); + std::string key = Azure::Core::_internal::StringExtensions::ToLower(ite->first); ordered_kv.emplace_back(std::make_pair(std::move(key), ite->second)); } std::sort(ordered_kv.begin(), ordered_kv.end()); @@ -68,7 +68,7 @@ namespace Azure { namespace Storage { namespace _detail { string_to_sign += "/" + m_credential->AccountName + "/" + request.GetUrl().GetPath() + "\n"; for (const auto& query : request.GetUrl().GetQueryParameters()) { - std::string key = Azure::Core::_internal::Strings::ToLower(query.first); + std::string key = Azure::Core::_internal::StringExtensions::ToLower(query.first); ordered_kv.emplace_back(std::make_pair( Azure::Core::Http::Url::Decode(key), Azure::Core::Http::Url::Decode(query.second))); } diff --git a/sdk/storage/azure-storage-common/test/test_base.cpp b/sdk/storage/azure-storage-common/test/test_base.cpp index 4fcf0222d..5c8f48cff 100644 --- a/sdk/storage/azure-storage-common/test/test_base.cpp +++ b/sdk/storage/azure-storage-common/test/test_base.cpp @@ -172,7 +172,7 @@ namespace Azure { namespace Storage { namespace Test { std::string LowercaseRandomString(size_t size) { - return Azure::Core::_internal::Strings::ToLower(RandomString(size)); + return Azure::Core::_internal::StringExtensions::ToLower(RandomString(size)); } Storage::Metadata RandomMetadata(size_t size)