friend class _Utf_iterator;
};
- template<typename _ToFormat, ranges::input_range _Range>
+ template<typename _ToFormat, ranges::input_range _View>
+ requires ranges::view<_View>
class _Utf_view
- : public ranges::view_interface<_Utf_view<_ToFormat, _Range>>
+ : public ranges::view_interface<_Utf_view<_ToFormat, _View>>
{
- using _Iterator = _Utf_iterator<ranges::range_value_t<_Range>,
- _ToFormat, ranges::iterator_t<_Range>,
- ranges::sentinel_t<_Range>>;
+ using _Iterator = _Utf_iterator<ranges::range_value_t<_View>,
+ _ToFormat, ranges::iterator_t<_View>,
+ ranges::sentinel_t<_View>>;
template<typename _Iter, typename _Sent>
constexpr auto
return _Iterator(__last, __last);
}
- _Range _M_base;
+ _View _M_base;
public:
constexpr explicit
- _Utf_view(_Range&& __r) : _M_base(std::forward<_Range>(__r)) { }
+ _Utf_view(_View __r) : _M_base(std::move(__r)) { }
constexpr auto begin()
{ return _M_begin(ranges::begin(_M_base), ranges::end(_M_base)); }
namespace uc = std::__unicode;
using namespace std::string_view_literals;
+static_assert( std::ranges::view<uc::_Utf8_view<std::string_view>> );
+static_assert( std::ranges::view<uc::_Utf16_view<std::string_view>> );
+static_assert( std::ranges::view<uc::_Utf32_view<std::string_view>> );
+
template<std::ranges::range View>
constexpr void
compare(View v, std::basic_string_view<std::ranges::range_value_t<View>> s)
compare(uc::_Utf16_view(s.substr(0, 1)), r);
compare(uc::_Utf16_view(s.substr(1, 1)), r);
std::array s2{ s[0], s[0] };
- compare(uc::_Utf16_view(s2), u"\uFFFD\uFFFD"sv);
+ compare(uc::_Utf16_view(std::span(s2)), u"\uFFFD\uFFFD"sv);
std::array s3{ s[0], s[0], s[1] };
- compare(uc::_Utf16_view(s3), u"\uFFFD\N{CLOWN FACE}"sv);
+ compare(uc::_Utf16_view(std::span(s3)), u"\uFFFD\N{CLOWN FACE}"sv);
std::array s4{ s[1], s[0] };
- compare(uc::_Utf16_view(s4), u"\uFFFD\uFFFD"sv);
+ compare(uc::_Utf16_view(std::span(s4)), u"\uFFFD\uFFFD"sv);
std::array s5{ s[1], s[0], s[1] };
- compare(uc::_Utf16_view(s5), u"\uFFFD\N{CLOWN FACE}"sv);
+ compare(uc::_Utf16_view(std::span(s5)), u"\uFFFD\N{CLOWN FACE}"sv);
std::array<char16_t, 2> s6{ 0xDC00, 0xDC01 };
- compare(uc::_Utf16_view(s6), u"\uFFFD\uFFFD"sv);
+ compare(uc::_Utf16_view(std::span(s6)), u"\uFFFD\uFFFD"sv);
std::array<char16_t, 2> s7{ 0xD7FF, 0xDC00 };
- compare(uc::_Utf16_view(s7), u"\uD7FF\uFFFD"sv);
+ compare(uc::_Utf16_view(std::span(s7)), u"\uD7FF\uFFFD"sv);
}
constexpr void