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:
@@ -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
|
||||
|
||||
@@ -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>()));
|
||||
|
||||
166
test/parser.cpp
166
test/parser.cpp
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user