mirror of git://gcc.gnu.org/git/gcc.git
libstdc++: implement P3044R2 - sub-string_view from string (string_view part)
libstdc++-v3/ChangeLog: * include/bits/version.def: Add string_subview FTM. * include/bits/version.h: Regenerate. * include/std/string_view: Add subview. * testsuite/21_strings/basic_string_view/operations/subview/char.cc: New test. * testsuite/21_strings/basic_string_view/operations/subview/wchar_t.cc: New test.
This commit is contained in:
parent
45f3501bda
commit
475933164f
|
|
@ -1945,6 +1945,14 @@ ftms = {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ftms = {
|
||||||
|
name = string_subview;
|
||||||
|
values = {
|
||||||
|
v = 202506;
|
||||||
|
cxxmin = 26;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
ftms = {
|
ftms = {
|
||||||
name = to_underlying;
|
name = to_underlying;
|
||||||
values = {
|
values = {
|
||||||
|
|
|
||||||
|
|
@ -2170,6 +2170,16 @@
|
||||||
#endif /* !defined(__cpp_lib_string_resize_and_overwrite) */
|
#endif /* !defined(__cpp_lib_string_resize_and_overwrite) */
|
||||||
#undef __glibcxx_want_string_resize_and_overwrite
|
#undef __glibcxx_want_string_resize_and_overwrite
|
||||||
|
|
||||||
|
#if !defined(__cpp_lib_string_subview)
|
||||||
|
# if (__cplusplus > 202302L)
|
||||||
|
# define __glibcxx_string_subview 202506L
|
||||||
|
# if defined(__glibcxx_want_all) || defined(__glibcxx_want_string_subview)
|
||||||
|
# define __cpp_lib_string_subview 202506L
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif /* !defined(__cpp_lib_string_subview) */
|
||||||
|
#undef __glibcxx_want_string_subview
|
||||||
|
|
||||||
#if !defined(__cpp_lib_to_underlying)
|
#if !defined(__cpp_lib_to_underlying)
|
||||||
# if (__cplusplus >= 202100L)
|
# if (__cplusplus >= 202100L)
|
||||||
# define __glibcxx_to_underlying 202102L
|
# define __glibcxx_to_underlying 202102L
|
||||||
|
|
|
||||||
|
|
@ -40,9 +40,10 @@
|
||||||
#define __glibcxx_want_constexpr_char_traits
|
#define __glibcxx_want_constexpr_char_traits
|
||||||
#define __glibcxx_want_constexpr_string_view
|
#define __glibcxx_want_constexpr_string_view
|
||||||
#define __glibcxx_want_freestanding_string_view
|
#define __glibcxx_want_freestanding_string_view
|
||||||
#define __glibcxx_want_string_view
|
|
||||||
#define __glibcxx_want_starts_ends_with
|
#define __glibcxx_want_starts_ends_with
|
||||||
#define __glibcxx_want_string_contains
|
#define __glibcxx_want_string_contains
|
||||||
|
#define __glibcxx_want_string_subview
|
||||||
|
#define __glibcxx_want_string_view
|
||||||
#include <bits/version.h>
|
#include <bits/version.h>
|
||||||
|
|
||||||
#if __cplusplus >= 201703L
|
#if __cplusplus >= 201703L
|
||||||
|
|
@ -342,6 +343,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
return basic_string_view{_M_str + __pos, __rlen};
|
return basic_string_view{_M_str + __pos, __rlen};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __glibcxx_string_subview // >= C++26
|
||||||
|
[[nodiscard]]
|
||||||
|
constexpr basic_string_view
|
||||||
|
subview(size_type __pos = 0, size_type __n = npos) const
|
||||||
|
{ return substr(__pos, __n); }
|
||||||
|
#endif
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr int
|
constexpr int
|
||||||
compare(basic_string_view __str) const noexcept
|
compare(basic_string_view __str) const noexcept
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
// { dg-do run { target c++26 } }
|
||||||
|
|
||||||
|
#include <string_view>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
#if __STDC_HOSTED__
|
||||||
|
#include <stdexcept>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void test01() {
|
||||||
|
typedef std::string_view::size_type csize_type;
|
||||||
|
typedef std::string_view::const_reference cref;
|
||||||
|
typedef std::string_view::reference ref;
|
||||||
|
csize_type csz01;
|
||||||
|
|
||||||
|
const char str_lit01[] = "rockaway, pacifica";
|
||||||
|
const std::string_view str01(str_lit01);
|
||||||
|
std::string_view str02;
|
||||||
|
|
||||||
|
csz01 = str01.size();
|
||||||
|
str02 = str01.subview(0, 1);
|
||||||
|
VERIFY(str02 == "r");
|
||||||
|
str02 = str01.subview(10);
|
||||||
|
VERIFY(str02 == "pacifica");
|
||||||
|
|
||||||
|
#if __STDC_HOSTED__
|
||||||
|
try {
|
||||||
|
str02 = str01.subview(csz01 + 1);
|
||||||
|
VERIFY(false);
|
||||||
|
} catch (std::out_of_range &fail) {
|
||||||
|
VERIFY(true);
|
||||||
|
} catch (...) {
|
||||||
|
VERIFY(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
str02 = str01.subview(csz01);
|
||||||
|
VERIFY(str02.size() == 0);
|
||||||
|
VERIFY(str02.begin() == str01.end());
|
||||||
|
VERIFY(true);
|
||||||
|
} catch (...) {
|
||||||
|
VERIFY(false);
|
||||||
|
}
|
||||||
|
#endif // HOSTED
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
test01();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
// { dg-do run { target c++26 } }
|
||||||
|
|
||||||
|
#include <string_view>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
#if __STDC_HOSTED__
|
||||||
|
#include <stdexcept>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void test01() {
|
||||||
|
typedef std::wstring_view::size_type csize_type;
|
||||||
|
typedef std::wstring_view::const_reference cref;
|
||||||
|
typedef std::wstring_view::reference ref;
|
||||||
|
csize_type csz01;
|
||||||
|
|
||||||
|
const wchar_t str_lit01[] = L"rockaway, pacifica";
|
||||||
|
const std::wstring_view str01(str_lit01);
|
||||||
|
std::wstring_view str02;
|
||||||
|
|
||||||
|
csz01 = str01.size();
|
||||||
|
str02 = str01.subview(0, 1);
|
||||||
|
VERIFY(str02 == L"r");
|
||||||
|
str02 = str01.subview(10);
|
||||||
|
VERIFY(str02 == L"pacifica");
|
||||||
|
|
||||||
|
#if __STDC_HOSTED__
|
||||||
|
try {
|
||||||
|
str02 = str01.subview(csz01 + 1);
|
||||||
|
VERIFY(false);
|
||||||
|
} catch (std::out_of_range &fail) {
|
||||||
|
VERIFY(true);
|
||||||
|
} catch (...) {
|
||||||
|
VERIFY(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
str02 = str01.subview(csz01);
|
||||||
|
VERIFY(str02.size() == 0);
|
||||||
|
VERIFY(str02.begin() == str01.end());
|
||||||
|
VERIFY(true);
|
||||||
|
} catch (...) {
|
||||||
|
VERIFY(false);
|
||||||
|
}
|
||||||
|
#endif // HOSTED
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
test01();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue