From 32f9be169ca3c5e1c56735c8b1e076570d56389c Mon Sep 17 00:00:00 2001 From: Edward Smith-Rowland <3dw4rd@verizon.net> Date: Thu, 21 Nov 2013 12:30:37 +0000 Subject: [PATCH] string_view: Rep empty string with unit-length static constexpr string. 2013-11-21 Edward Smith-Rowland <3dw4rd@verizon.net> * include/experimental/string_view: Rep empty string with unit-length static constexpr string. Uncomment _GLIBCXX_VISIBILITY. Enforce invariant of no nullptr string pointer. * include/experimental/string_view.tcc: Ditto. * testsuite/experimental/string_view/cons/char/1.cc: data() for empty string_view is no longer nullptr. * testsuite/experimental/string_view/cons/wchar_t/1.cc: Ditto. * testsuite/experimental/string_view/operations/data/char/1.cc: Ditto. * testsuite/experimental/string_view/operations/data/wchar_t/1.cc: Ditto. From-SVN: r205213 --- libstdc++-v3/ChangeLog | 13 ++++++++++++ libstdc++-v3/include/experimental/string_view | 24 ++++++++++++++++------ libstdc++-v3/include/experimental/string_view.tcc | 6 +++++- .../experimental/string_view/cons/char/1.cc | 11 +++++----- .../experimental/string_view/cons/wchar_t/1.cc | 11 +++++----- .../string_view/operations/data/char/1.cc | 4 ++-- .../string_view/operations/data/wchar_t/1.cc | 4 ++-- 7 files changed, 52 insertions(+), 21 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 16a06fb12ec..d3d6405320f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,18 @@ 2013-11-21 Edward Smith-Rowland <3dw4rd@verizon.net> + * include/experimental/string_view: Rep empty string with unit-length + static constexpr string. Uncomment _GLIBCXX_VISIBILITY. Enforce + invariant of no nullptr string pointer. + * include/experimental/string_view.tcc: Ditto. + * testsuite/experimental/string_view/cons/char/1.cc: data() for empty + string_view is no longer nullptr. + * testsuite/experimental/string_view/cons/wchar_t/1.cc: Ditto. + * testsuite/experimental/string_view/operations/data/char/1.cc: Ditto. + * testsuite/experimental/string_view/operations/data/wchar_t/1.cc: + Ditto. + +2013-11-21 Edward Smith-Rowland <3dw4rd@verizon.net> + Implement __gnu_cxx::hypergeometric_distribution. * include/ext/random: Add hypergeometric_distribution. * include/ext/random.tcc: Add hypergeometric_distribution. diff --git a/libstdc++-v3/include/experimental/string_view b/libstdc++-v3/include/experimental/string_view index 6a95e8d0bd0..000d317c5c5 100644 --- a/libstdc++-v3/include/experimental/string_view +++ b/libstdc++-v3/include/experimental/string_view @@ -43,7 +43,7 @@ #include #include -namespace std //_GLIBCXX_VISIBILITY(default) +namespace std _GLIBCXX_VISIBILITY(default) { namespace experimental { @@ -66,6 +66,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * _CharT* _M_str * size_t _M_len * @endcode + * + * A basic_string_view represents an empty string with a static constexpr + * length one string: + * + * @code + * static constexpr value_type _S_empty_str[1]{0}; + * @endcode */ template> class basic_string_view @@ -92,7 +99,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr basic_string_view() noexcept - : _M_len{0}, _M_str{nullptr} + : _M_len{0}, _M_str{_S_empty_str} { } constexpr basic_string_view(const basic_string_view&) noexcept = default; @@ -104,11 +111,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { } constexpr basic_string_view(const _CharT* __str) - : _M_len{__str == nullptr ? 0 : traits_type::length(__str)}, _M_str{__str} + : _M_len{__str == nullptr ? 0 : traits_type::length(__str)}, + _M_str{__str == nullptr ? _S_empty_str : __str} { } constexpr basic_string_view(const _CharT* __str, size_type __len) - : _M_len{__len}, _M_str{__str} + : _M_len{__str == nullptr ? 0 :__len}, + _M_str{__str == nullptr || __len == 0 ? _S_empty_str : __str} { } basic_string_view& @@ -185,7 +194,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION "(which is %zu) >= this->size() " "(which is %zu)"), __pos, this->size()), - *static_cast(nullptr)); + _S_empty_str[0]); } constexpr const _CharT& @@ -211,7 +220,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION clear() noexcept { this->_M_len = 0; - this->_M_str = nullptr; + this->_M_str = _S_empty_str; } void @@ -408,6 +417,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } private: + static constexpr const int _S_compare(size_type __n1, size_type __n2) noexcept { @@ -418,6 +428,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : static_cast(difference_type{__n1 - __n2}); } + static constexpr value_type _S_empty_str[1]{}; + size_t _M_len; const _CharT* _M_str; }; diff --git a/libstdc++-v3/include/experimental/string_view.tcc b/libstdc++-v3/include/experimental/string_view.tcc index af334b456ca..eeccb026344 100644 --- a/libstdc++-v3/include/experimental/string_view.tcc +++ b/libstdc++-v3/include/experimental/string_view.tcc @@ -40,13 +40,17 @@ # include #else -namespace std //_GLIBCXX_VISIBILITY(default) +namespace std _GLIBCXX_VISIBILITY(default) { namespace experimental { _GLIBCXX_BEGIN_NAMESPACE_VERSION template + constexpr _CharT + basic_string_view<_CharT, _Traits>::_S_empty_str[1]; + + template typename basic_string_view<_CharT, _Traits>::size_type basic_string_view<_CharT, _Traits>:: find(const _CharT* __str, size_type __pos, size_type __n) const noexcept diff --git a/libstdc++-v3/testsuite/experimental/string_view/cons/char/1.cc b/libstdc++-v3/testsuite/experimental/string_view/cons/char/1.cc index 4bb22098df1..982a4c76fb5 100644 --- a/libstdc++-v3/testsuite/experimental/string_view/cons/char/1.cc +++ b/libstdc++-v3/testsuite/experimental/string_view/cons/char/1.cc @@ -33,7 +33,7 @@ test01() // basic_string_view() const std::experimental::string_view str00{}; VERIFY( str00.length() == 0 ); - VERIFY( str00.data() == nullptr ); + VERIFY( str00.data() != nullptr ); // basic_string_view(const char*) const char str_lit01[] = "rodeo beach, marin"; @@ -53,10 +53,11 @@ test01() std::experimental::string_view str05{str_lit01, len_lit01}; VERIFY( str05.length() == len_lit01 ); VERIFY( str05.data() == str_lit01 ); - // This is invalid and unchecked. - //std::experimental::string_view str06{nullptr, len_lit01}; - //VERIFY( str06.length() == 0 ); - //VERIFY( str06.data() == nullptr ); + + // basic_string_view(const char* s, std::size_t l) + std::experimental::string_view str06{nullptr, len_lit01}; + VERIFY( str06.length() == 0 ); + VERIFY( str06.data() != nullptr ); // basic_string_view(basic_string& s) std::string istr07(10, 'z'); diff --git a/libstdc++-v3/testsuite/experimental/string_view/cons/wchar_t/1.cc b/libstdc++-v3/testsuite/experimental/string_view/cons/wchar_t/1.cc index 3028f654bf0..eb115fd5528 100644 --- a/libstdc++-v3/testsuite/experimental/string_view/cons/wchar_t/1.cc +++ b/libstdc++-v3/testsuite/experimental/string_view/cons/wchar_t/1.cc @@ -33,7 +33,7 @@ test01() // basic_string_view() const std::experimental::wstring_view str00{}; VERIFY( str00.length() == 0 ); - VERIFY( str00.data() == nullptr ); + VERIFY( str00.data() != nullptr ); // basic_string_view(const char*) const wchar_t str_lit01[] = L"rodeo beach, marin"; @@ -53,10 +53,11 @@ test01() std::experimental::wstring_view str05{str_lit01, len_lit01}; VERIFY( str05.length() == len_lit01 ); VERIFY( str05.data() == str_lit01 ); - // This is invalid and unchecked. - //std::experimental::wstring_view str06{nullptr, len_lit01}; - //VERIFY( str06.length() == 0 ); - //VERIFY( str06.data() == nullptr ); + + // basic_string_view(const wchar_t* s, std::size_t l) + std::experimental::wstring_view str06{nullptr, len_lit01}; + VERIFY( str06.length() == 0 ); + VERIFY( str06.data() != nullptr ); // basic_string_view(basic_string& s) std::wstring istr07(10, L'z'); diff --git a/libstdc++-v3/testsuite/experimental/string_view/operations/data/char/1.cc b/libstdc++-v3/testsuite/experimental/string_view/operations/data/char/1.cc index 4f2bd3dba5c..be75de91791 100644 --- a/libstdc++-v3/testsuite/experimental/string_view/operations/data/char/1.cc +++ b/libstdc++-v3/testsuite/experimental/string_view/operations/data/char/1.cc @@ -29,10 +29,10 @@ test01() std::experimental::string_view empty; - // data() for size == 0 is non-NULL? + // data() for size == 0 is non-NULL. VERIFY( empty.size() == 0 ); const std::experimental::string_view::value_type* p = empty.data(); - VERIFY( p == nullptr ); + VERIFY( p ); return 0; } diff --git a/libstdc++-v3/testsuite/experimental/string_view/operations/data/wchar_t/1.cc b/libstdc++-v3/testsuite/experimental/string_view/operations/data/wchar_t/1.cc index d577c9f3c0a..5e00b00b601 100644 --- a/libstdc++-v3/testsuite/experimental/string_view/operations/data/wchar_t/1.cc +++ b/libstdc++-v3/testsuite/experimental/string_view/operations/data/wchar_t/1.cc @@ -29,10 +29,10 @@ test01() std::experimental::wstring_view empty; - // data() for size == 0 is non-NULL? + // data() for size == 0 is non-NULL. VERIFY( empty.size() == 0 ); const std::experimental::wstring_view::value_type* p = empty.data(); - VERIFY( p == nullptr ); + VERIFY( p ); return 0; } -- 2.11.4.GIT