2
0
mirror of https://github.com/boostorg/parser.git synced 2026-01-19 04:22:13 +00:00

Change concept can_utf_view to use the form MSVC uses in its std lib, and turn

off code relying on alias CTAD on MSVC.  Add test cases for {w,}string{,_view}
| as_utfN in C++20 builds.
This commit is contained in:
Zach Laine
2024-01-28 14:55:37 -06:00
parent 01f2f21899
commit 4d14fba7fd
3 changed files with 169 additions and 2 deletions

View File

@@ -20,7 +20,8 @@
// GCC 12 claims to support 201907L <= __cpp_deduction_guides, but does not.
#if BOOST_PARSER_DETAIL_TEXT_USE_CONCEPTS && defined(__cpp_deduction_guides) && \
201907L <= __cpp_deduction_guides && (!defined(__GNUC__) || 13 <= __GNUC__)
201907L <= __cpp_deduction_guides && (!defined(__GNUC__) || 13 <= __GNUC__) && \
!defined(_MSC_VER)
#define BOOST_PARSER_DETAIL_TEXT_USE_ALIAS_CTAD 1
#else
#define BOOST_PARSER_DETAIL_TEXT_USE_ALIAS_CTAD 0

View File

@@ -701,7 +701,7 @@ namespace boost::parser::detail { namespace text {
namespace detail {
#if BOOST_PARSER_DETAIL_TEXT_USE_CONCEPTS
template<class R, template<class> class View>
concept can_utf_view = requires { View(std::declval<R>()); };
concept can_utf_view = requires(R && r) { View((R &&)r); };
#else
template<class R, class View>
using can_utf_view_expr = decltype(View(std::declval<R>()));

View File

@@ -21,6 +21,172 @@
using namespace boost::parser;
#if BOOST_PARSER_DETAIL_TEXT_USE_CONCEPTS && defined(_MSC_VER)
#include <algorithm>
TEST(parser, msvc_string_view)
{
std::string_view sv = "text";
std::wstring_view wsv = L"text";
{
auto r = detail::text::as_utf8(sv);
std::string str = " ";
std::ranges::copy(r, str.begin());
EXPECT_EQ(str, sv);
}
{
auto r = detail::text::as_utf8(wsv);
std::wstring wstr = L" ";
std::ranges::copy(r, wstr.begin());
EXPECT_EQ(wstr, wsv);
}
{
auto r = sv | detail::text::as_utf8;
std::string str = " ";
std::ranges::copy(r, str.begin());
EXPECT_EQ(str, sv);
}
{
auto r = wsv | detail::text::as_utf8;
std::wstring wstr = L" ";
std::ranges::copy(r, wstr.begin());
EXPECT_EQ(wstr, wsv);
}
{
auto r = detail::text::as_utf16(sv);
std::string str = " ";
std::ranges::copy(r, str.begin());
EXPECT_EQ(str, sv);
}
{
auto r = detail::text::as_utf16(wsv);
std::wstring wstr = L" ";
std::ranges::copy(r, wstr.begin());
EXPECT_EQ(wstr, wsv);
}
{
auto r = sv | detail::text::as_utf16;
std::string str = " ";
std::ranges::copy(r, str.begin());
EXPECT_EQ(str, sv);
}
{
auto r = wsv | detail::text::as_utf16;
std::wstring wstr = L" ";
std::ranges::copy(r, wstr.begin());
EXPECT_EQ(wstr, wsv);
}
{
auto r = detail::text::as_utf32(sv);
std::string str = " ";
std::ranges::copy(r, str.begin());
EXPECT_EQ(str, sv);
}
{
auto r = detail::text::as_utf32(wsv);
std::wstring wstr = L" ";
std::ranges::copy(r, wstr.begin());
EXPECT_EQ(wstr, wsv);
}
{
auto r = sv | detail::text::as_utf32;
std::string str = " ";
std::ranges::copy(r, str.begin());
EXPECT_EQ(str, sv);
}
{
auto r = wsv | detail::text::as_utf32;
std::wstring wstr = L" ";
std::ranges::copy(r, wstr.begin());
EXPECT_EQ(wstr, wsv);
}
}
TEST(parser, msvc_string)
{
std::string sv = "text";
std::wstring wsv = L"text";
{
auto r = detail::text::as_utf8(sv);
std::string str = " ";
std::ranges::copy(r, str.begin());
EXPECT_EQ(str, sv);
}
{
auto r = detail::text::as_utf8(wsv);
std::wstring wstr = L" ";
std::ranges::copy(r, wstr.begin());
EXPECT_EQ(wstr, wsv);
}
{
auto r = sv | detail::text::as_utf8;
std::string str = " ";
std::ranges::copy(r, str.begin());
EXPECT_EQ(str, sv);
}
{
auto r = wsv | detail::text::as_utf8;
std::wstring wstr = L" ";
std::ranges::copy(r, wstr.begin());
EXPECT_EQ(wstr, wsv);
}
{
auto r = detail::text::as_utf16(sv);
std::string str = " ";
std::ranges::copy(r, str.begin());
EXPECT_EQ(str, sv);
}
{
auto r = detail::text::as_utf16(wsv);
std::wstring wstr = L" ";
std::ranges::copy(r, wstr.begin());
EXPECT_EQ(wstr, wsv);
}
{
auto r = sv | detail::text::as_utf16;
std::string str = " ";
std::ranges::copy(r, str.begin());
EXPECT_EQ(str, sv);
}
{
auto r = wsv | detail::text::as_utf16;
std::wstring wstr = L" ";
std::ranges::copy(r, wstr.begin());
EXPECT_EQ(wstr, wsv);
}
{
auto r = detail::text::as_utf32(sv);
std::string str = " ";
std::ranges::copy(r, str.begin());
EXPECT_EQ(str, sv);
}
{
auto r = detail::text::as_utf32(wsv);
std::wstring wstr = L" ";
std::ranges::copy(r, wstr.begin());
EXPECT_EQ(wstr, wsv);
}
{
auto r = sv | detail::text::as_utf32;
std::string str = " ";
std::ranges::copy(r, str.begin());
EXPECT_EQ(str, sv);
}
{
auto r = wsv | detail::text::as_utf32;
std::wstring wstr = L" ";
std::ranges::copy(r, wstr.begin());
EXPECT_EQ(wstr, wsv);
}
}
#endif
#if TEST_BOOST_OPTIONAL
template<typename T>
constexpr bool boost::parser::enable_optional<boost::optional<T>> = true;