Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions examples/readme_examples.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,23 +58,23 @@ std::u8string as_char32_t_example() {
return input_utf8;
}

std::string enum_to_string(transcoding_error ec) {
std::string enum_to_string(utf_transcoding_error ec) {
switch (ec) {
case transcoding_error::truncated_utf8_sequence:
case utf_transcoding_error::truncated_utf8_sequence:
return "truncated_utf8_sequence";
case transcoding_error::unpaired_high_surrogate:
case utf_transcoding_error::unpaired_high_surrogate:
return "unpaired_high_surrogate";
case transcoding_error::unpaired_low_surrogate:
case utf_transcoding_error::unpaired_low_surrogate:
return "unpaired_low_surrogate";
case transcoding_error::unexpected_utf8_continuation_byte:
case utf_transcoding_error::unexpected_utf8_continuation_byte:
return "unexpected_utf8_continuation_byte";
case transcoding_error::overlong:
case utf_transcoding_error::overlong:
return "overlong";
case transcoding_error::encoded_surrogate:
case utf_transcoding_error::encoded_surrogate:
return "encoded_surrogate";
case transcoding_error::out_of_range:
case utf_transcoding_error::out_of_range:
return "out_of_range";
case transcoding_error::invalid_utf8_leading_byte:
case utf_transcoding_error::invalid_utf8_leading_byte:
return "invalid_utf8_leading_byte";
}
std::unreachable();
Expand Down
82 changes: 41 additions & 41 deletions include/beman/utf_view/to_utf_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ template <class I>
using exposition_only_bidirectional_at_most_t =
decltype(exposition_only_bidirectional_at_most<I>()); // @*exposition only*@

enum class transcoding_error {
enum class utf_transcoding_error {
truncated_utf8_sequence,
unpaired_high_surrogate,
unpaired_low_surrogate,
Expand Down Expand Up @@ -277,11 +277,11 @@ class exposition_only_to_utf_view_impl
return std::move(*this).curr();
}

/* PAPER: constexpr expected<void, transcoding_error> success() const; */
/* PAPER: constexpr expected<void, utf_transcoding_error> success() const; */

/* !PAPER */

constexpr std::expected<void, transcoding_error> success() const {
constexpr std::expected<void, utf_transcoding_error> success() const {
return success_;
}

Expand Down Expand Up @@ -411,7 +411,7 @@ class exposition_only_to_utf_view_impl
struct decode_code_point_result {
char32_t c;
std::uint8_t to_incr;
std::expected<void, transcoding_error> success;
std::expected<void, utf_transcoding_error> success;
};

template <class>
Expand Down Expand Up @@ -450,28 +450,28 @@ class exposition_only_to_utf_view_impl
++it;
const std::uint8_t lo_bound = 0x80, hi_bound = 0xBF;
std::uint8_t to_incr = 1;
std::expected<void, transcoding_error> success{};
std::expected<void, utf_transcoding_error> success{};

auto const error{[&](transcoding_error const error_enum_in) {
auto const error{[&](utf_transcoding_error const error_enum_in) {
success = std::unexpected{error_enum_in};
c = U'\uFFFD';
}};

if (u <= 0x7F) [[likely]] // 0x00 to 0x7F
c = u;
else if (u < 0xC0) [[unlikely]] {
error(transcoding_error::unexpected_utf8_continuation_byte);
error(utf_transcoding_error::unexpected_utf8_continuation_byte);
} else if (u < 0xC2 || u > 0xF4) [[unlikely]] {
error(transcoding_error::invalid_utf8_leading_byte);
error(utf_transcoding_error::invalid_utf8_leading_byte);
} else if (it == last) [[unlikely]] {
error(transcoding_error::truncated_utf8_sequence);
error(utf_transcoding_error::truncated_utf8_sequence);
} else if (u <= 0xDF) // 0xC2 to 0xDF
{
c = u & 0x1F;
u = *it;

if (u < lo_bound || u > hi_bound) [[unlikely]]
error(transcoding_error::truncated_utf8_sequence);
error(utf_transcoding_error::truncated_utf8_sequence);
else {
c = (c << 6) | (u & 0x3F);
++it;
Expand All @@ -484,21 +484,21 @@ class exposition_only_to_utf_view_impl
u = *it;

if (orig == 0xE0 && 0x80 <= u && u < 0xA0) [[unlikely]]
error(transcoding_error::overlong);
error(utf_transcoding_error::overlong);
else if (orig == 0xED && 0xA0 <= u && u < 0xC0) [[unlikely]]
error(transcoding_error::encoded_surrogate);
error(utf_transcoding_error::encoded_surrogate);
else if (u < lo_bound || u > hi_bound) [[unlikely]]
error(transcoding_error::truncated_utf8_sequence);
error(utf_transcoding_error::truncated_utf8_sequence);
else if (++it == last) {
[[unlikely]]++ to_incr;
error(transcoding_error::truncated_utf8_sequence);
error(utf_transcoding_error::truncated_utf8_sequence);
} else {
++to_incr;
c = (c << 6) | (u & 0x3F);
u = *it;

if (u < lo_bound || u > hi_bound) [[unlikely]]
error(transcoding_error::truncated_utf8_sequence);
error(utf_transcoding_error::truncated_utf8_sequence);
else {
c = (c << 6) | (u & 0x3F);
++it;
Expand All @@ -512,31 +512,31 @@ class exposition_only_to_utf_view_impl
u = *it;

if (orig == 0xF0 && 0x80 <= u && u < 0x90) [[unlikely]]
error(transcoding_error::overlong);
error(utf_transcoding_error::overlong);
else if (orig == 0xF4 && 0x90 <= u && u < 0xC0) [[unlikely]]
error(transcoding_error::out_of_range);
error(utf_transcoding_error::out_of_range);
else if (u < lo_bound || u > hi_bound) [[unlikely]]
error(transcoding_error::truncated_utf8_sequence);
error(utf_transcoding_error::truncated_utf8_sequence);
else if (++it == last) {
[[unlikely]]++ to_incr;
error(transcoding_error::truncated_utf8_sequence);
error(utf_transcoding_error::truncated_utf8_sequence);
} else {
++to_incr;
c = (c << 6) | (u & 0x3F);
u = *it;

if (u < lo_bound || u > hi_bound) [[unlikely]]
error(transcoding_error::truncated_utf8_sequence);
error(utf_transcoding_error::truncated_utf8_sequence);
else if (++it == last) {
[[unlikely]]++ to_incr;
error(transcoding_error::truncated_utf8_sequence);
error(utf_transcoding_error::truncated_utf8_sequence);
} else {
++to_incr;
c = (c << 6) | (u & 0x3F);
u = *it;

if (u < lo_bound || u > hi_bound) [[unlikely]]
error(transcoding_error::truncated_utf8_sequence);
error(utf_transcoding_error::truncated_utf8_sequence);
else {
c = (c << 6) | (u & 0x3F);
++it;
Expand All @@ -560,9 +560,9 @@ class exposition_only_to_utf_view_impl
std::uint16_t u = *it;
++it;
std::uint8_t to_incr = 1;
std::expected<void, transcoding_error> success{};
std::expected<void, utf_transcoding_error> success{};

auto const error{[&](transcoding_error const error_enum_in) {
auto const error{[&](utf_transcoding_error const error_enum_in) {
success = std::unexpected{error_enum_in};
c = U'\uFFFD';
}};
Expand All @@ -571,11 +571,11 @@ class exposition_only_to_utf_view_impl
c = u;
else if (u < 0xDC00) {
if (it == last) [[unlikely]] {
error(transcoding_error::unpaired_high_surrogate);
error(utf_transcoding_error::unpaired_high_surrogate);
} else {
std::uint16_t u2 = *it;
if (u2 < 0xDC00 || u2 > 0xDFFF) [[unlikely]]
error(transcoding_error::unpaired_high_surrogate);
error(utf_transcoding_error::unpaired_high_surrogate);
else {
++it;
to_incr = 2;
Expand All @@ -585,7 +585,7 @@ class exposition_only_to_utf_view_impl
}
}
} else
error(transcoding_error::unpaired_low_surrogate);
error(utf_transcoding_error::unpaired_low_surrogate);

return {.c{c}, .to_incr{to_incr}, .success{success}};
}
Expand All @@ -598,18 +598,18 @@ class exposition_only_to_utf_view_impl
static constexpr decode_code_point_result decode_code_point_utf32_impl(
exposition_only_innermost_iter& it) {
char32_t c = *it;
std::expected<void, transcoding_error> success{};
std::expected<void, utf_transcoding_error> success{};
++it;
auto const error{[&](transcoding_error const error_enum_in) {
auto const error{[&](utf_transcoding_error const error_enum_in) {
success = std::unexpected{error_enum_in};
c = U'\uFFFD';
}};
if (c >= 0xD800) {
if (c < 0xE000) {
error(transcoding_error::encoded_surrogate);
error(utf_transcoding_error::encoded_surrogate);
}
if (c > 0x10FFFF) {
error(transcoding_error::out_of_range);
error(utf_transcoding_error::out_of_range);
}
}
return {.c{c}, .to_incr{1}, .success{success}};
Expand Down Expand Up @@ -710,7 +710,7 @@ class exposition_only_to_utf_view_impl
.decode_result{.c{U'\uFFFD'},
.to_incr{1},
.success{std::unexpected{
transcoding_error::unexpected_utf8_continuation_byte}}},
utf_transcoding_error::unexpected_utf8_continuation_byte}}},
.new_curr{new_curr}};
} else if (detail::is_ascii(*it) || detail::lead_code_unit(*it)) {
int const expected_reversed{detail::utf8_code_units(*it)};
Expand All @@ -722,15 +722,15 @@ class exposition_only_to_utf_view_impl
.decode_result{.c{U'\uFFFD'},
.to_incr{1},
.success{std::unexpected{
transcoding_error::unexpected_utf8_continuation_byte}}},
utf_transcoding_error::unexpected_utf8_continuation_byte}}},
.new_curr{new_curr}};
} else {
auto lead{it};
decode_code_point_result const decode_result{
decode_code_point_utf8_impl(it, end())};
if (decode_result.success ||
decode_result.success ==
std::unexpected{transcoding_error::truncated_utf8_sequence}) {
std::unexpected{utf_transcoding_error::truncated_utf8_sequence}) {
assert(decode_result.to_incr == reversed);
return {.decode_result{decode_result}, .new_curr{lead}};
} else {
Expand All @@ -743,7 +743,7 @@ class exposition_only_to_utf_view_impl
.success{
reversed == 1
? decode_result.success
: std::unexpected{transcoding_error::
: std::unexpected{utf_transcoding_error::
unexpected_utf8_continuation_byte}}},
.new_curr{new_curr}};
}
Expand All @@ -758,8 +758,8 @@ class exposition_only_to_utf_view_impl
.to_incr{1},
.success{
reversed == 1
? std::unexpected{transcoding_error::invalid_utf8_leading_byte}
: std::unexpected{transcoding_error::
? std::unexpected{utf_transcoding_error::invalid_utf8_leading_byte}
: std::unexpected{utf_transcoding_error::
unexpected_utf8_continuation_byte}}},
.new_curr{it}};
}
Expand All @@ -774,14 +774,14 @@ class exposition_only_to_utf_view_impl
return {.decode_result{.c{U'\uFFFD'},
.to_incr{1},
.success{std::unexpected{
transcoding_error::unpaired_high_surrogate}}},
utf_transcoding_error::unpaired_high_surrogate}}},
.new_curr{it}};
} else if (detail::low_surrogate(*it)) {
if (it == begin()) {
return {.decode_result{.c{U'\uFFFD'},
.to_incr{1},
.success{std::unexpected{
transcoding_error::unpaired_low_surrogate}}},
utf_transcoding_error::unpaired_low_surrogate}}},
.new_curr{it}};
} else {
--it;
Expand All @@ -795,7 +795,7 @@ class exposition_only_to_utf_view_impl
return {.decode_result{.c{U'\uFFFD'},
.to_incr{1},
.success{std::unexpected{
transcoding_error::unpaired_low_surrogate}}},
utf_transcoding_error::unpaired_low_surrogate}}},
.new_curr{new_curr}};
}
}
Expand Down Expand Up @@ -866,7 +866,7 @@ class exposition_only_to_utf_view_impl
std::uint8_t to_increment_ = 0; // @*exposition only*@

/* !PAPER */
std::expected<void, transcoding_error> success_{}; // @*exposition only*@
std::expected<void, utf_transcoding_error> success_{}; // @*exposition only*@
/* PAPER */
};

Expand Down
Loading