31 const auto rbase = std::reverse_iterator<char *>(pbase());
32 const auto rpptr = std::reverse_iterator<char *>(pptr());
33 static auto uch = [](
char c) {
return static_cast<unsigned char>(c); };
34 auto is_ascii = [](
char c) {
return (uch(c) & 0x80) == 0x00; };
35 auto is_leading = [](
char c) {
return (uch(c) & 0xC0) == 0xC0; };
36 auto is_leading_2b = [](
char c) {
return uch(c) <= 0xDF; };
37 auto is_leading_3b = [](
char c) {
return uch(c) <= 0xEF; };
43 const auto rpend = rbase - rpptr >= 3 ? rpptr + 3 : rbase;
44 const auto leading = std::find_if(rpptr, rpend, is_leading);
47 const auto dist =
static_cast<size_t>(leading - rpptr);
53 remainder = is_leading_2b(*leading) ? 0 : dist + 1;
55 remainder = is_leading_3b(*leading) ? 0 : dist + 1;
84 using traits_type = std::streambuf::traits_type;
85 if (!traits_type::eq_int_type(c, traits_type::eof())) {
86 *pptr() = traits_type::to_char_type(c);
89 return _sync() == 0 ? traits_type::not_eof(c) : traits_type::eof();