[libc++] Fix the return value of max_size()

I assume nobody ever uses std::string_view::max_size() outside of
testing. However, we should still return a value that is based on
something with a reasonable rationale. Previously, we would forget
to take into account the size of the character type stored in the
string, and this patch takes that into account.

Thanks to @mclow.lists for pointing out this issue.

Differential Revision: https://reviews.llvm.org/D114395
This commit is contained in:
Louis Dionne 2021-11-22 16:44:50 -05:00
parent a101a9b64b
commit 2db67e9771
2 changed files with 12 additions and 1 deletions

View File

@ -356,7 +356,7 @@ public:
size_type length() const _NOEXCEPT { return __size; } size_type length() const _NOEXCEPT { return __size; }
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
size_type max_size() const _NOEXCEPT { return numeric_limits<size_type>::max(); } size_type max_size() const _NOEXCEPT { return numeric_limits<size_type>::max() / sizeof(value_type); }
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
bool empty() const _NOEXCEPT { return __size == 0; } bool empty() const _NOEXCEPT { return __size == 0; }

View File

@ -16,6 +16,7 @@
#include <string_view> #include <string_view>
#include <cassert> #include <cassert>
#include <limits>
#include "test_macros.h" #include "test_macros.h"
@ -42,6 +43,16 @@ void test1 () {
assert ( sv1.size() == sv1.length()); assert ( sv1.size() == sv1.length());
assert ( sv1.max_size() > sv1.size()); assert ( sv1.max_size() > sv1.size());
} }
// Sanity check max_size() -- a string_view can't store more bytes than a single object
// can contain. Any implementation that fails this check is certainly lying.
{
typedef typename SV::value_type CharT;
typedef typename SV::size_type Size;
SV sv;
assert(sv.max_size() <= std::numeric_limits<Size>::max() / sizeof(CharT));
LIBCPP_ASSERT(sv.max_size() == std::numeric_limits<Size>::max() / sizeof(CharT));
}
} }
template<typename CharT> template<typename CharT>