From: Casey Bodley Date: Fri, 16 Jun 2017 20:50:12 +0000 (-0400) Subject: rgw: fix constexpr for string_size X-Git-Tag: v12.1.0~72^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ccc146c5bb36a91c0c517bb8cf6cce70635127e2;p=ceph.git rgw: fix constexpr for string_size string_size() is no longer constexpr. added new constexpr specialization for string_size() Signed-off-by: Adam C. Emerson Signed-off-by: Casey Bodley --- diff --git a/src/rgw/rgw_string.h b/src/rgw/rgw_string.h index 311add42c774..747c47ebe275 100644 --- a/src/rgw/rgw_string.h +++ b/src/rgw/rgw_string.h @@ -137,15 +137,21 @@ struct string_traits { // specializations for char*/const char* use strlen() template <> struct string_traits { - static constexpr size_t size(const char* s) { return std::strlen(s); } + static size_t size(const char* s) { return std::strlen(s); } }; template <> struct string_traits : string_traits {}; -// specializations for char[]/const char[] also use strlen() +// constexpr specializations for char[]/const char[] template -struct string_traits : string_traits {}; +struct string_traits { + static constexpr size_t size_(const char* s, size_t i) { + return i < N ? (*(s + i) == '\0' ? i : size_(s, i + 1)) + : throw std::invalid_argument("Unterminated string constant."); + } + static constexpr size_t size(const char(&s)[N]) { return size_(s, 0); } +}; template -struct string_traits : string_traits {}; +struct string_traits : string_traits {}; // helpers for string_cat_reserve() static inline void append_to(std::string& s) {} diff --git a/src/test/rgw/test_rgw_string.cc b/src/test/rgw/test_rgw_string.cc index 4b35fbc29261..96dc8a9bf26b 100644 --- a/src/test/rgw/test_rgw_string.cc +++ b/src/test/rgw/test_rgw_string.cc @@ -32,8 +32,13 @@ TEST(string_size, types) ASSERT_EQ(3u, string_size(mno)); ASSERT_EQ(3u, string_size(pqr)); - constexpr auto compile_time_size = string_size(jkl); - ASSERT_EQ(3u, compile_time_size); + constexpr auto compile_time_string_view_size = string_size(jkl); + ASSERT_EQ(3u, compile_time_string_view_size); + constexpr auto compile_time_string_literal_size = string_size(mno); + ASSERT_EQ(3u, compile_time_string_literal_size); + + char arr[] = {'a', 'b', 'c'}; // not null-terminated + ASSERT_THROW(string_size(arr), std::invalid_argument); } TEST(string_cat_reserve, types)