Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add constexpr to to_ascii methods #12

Merged
merged 1 commit into from
Feb 13, 2023
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
12 changes: 11 additions & 1 deletion include/ada/idna/to_ascii.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,16 @@ namespace ada::idna {
// this function. We also do not trim control characters. We also assume that
// the input is not empty. We return "" on error. For now.
std::string to_ascii(std::string_view ut8_string);

bool constexpr begins_with(std::u32string_view view,
std::u32string_view prefix);
bool constexpr begins_with(std::string_view view, std::string_view prefix);

bool constexpr is_ascii(std::u32string_view view);
bool constexpr is_ascii(std::string_view view);

static std::string from_ascii_to_ascii(std::string_view ut8_string);

} // namespace ada::idna

#endif // ADA_IDNA_TO_ASCII_H
#endif // ADA_IDNA_TO_ASCII_H
39 changes: 26 additions & 13 deletions src/to_ascii.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,22 @@

namespace ada::idna {

bool begins_with(std::u32string_view view, std::u32string_view prefix) {
bool constexpr begins_with(std::u32string_view view,
std::u32string_view prefix) {
if (view.size() < prefix.size()) {
return false;
}
return view.substr(0, prefix.size()) == prefix;
}

bool begins_with(std::string_view view, std::string_view prefix) {
bool constexpr begins_with(std::string_view view, std::string_view prefix) {
if (view.size() < prefix.size()) {
return false;
}
return view.substr(0, prefix.size()) == prefix;
}

bool is_ascii(std::u32string_view view) {
bool constexpr is_ascii(std::u32string_view view) {
for (uint32_t c : view) {
if (c >= 0x80) {
return false;
Expand All @@ -33,7 +34,7 @@ bool is_ascii(std::u32string_view view) {
return true;
}

bool is_ascii(std::string_view view) {
bool constexpr is_ascii(std::string_view view) {
for (uint8_t c : view) {
if (c >= 0x80) {
return false;
Expand All @@ -55,8 +56,8 @@ static std::string from_ascii_to_ascii(std::string_view ut8_string) {
while (label_start != mapped_string.size()) {
size_t loc_dot = mapped_string.find('.', label_start);
bool is_last_label = (loc_dot == std::string_view::npos);
size_t label_size =
is_last_label ? mapped_string.size() - label_start : loc_dot - label_start;
size_t label_size = is_last_label ? mapped_string.size() - label_start
: loc_dot - label_start;
size_t label_size_with_dot = is_last_label ? label_size : label_size + 1;
std::string_view label_view(mapped_string.data() + label_start, label_size);
label_start += label_size_with_dot;
Expand All @@ -74,10 +75,14 @@ static std::string from_ascii_to_ascii(std::string_view ut8_string) {
return error;
}
std::u32string post_map = ada::idna::map(tmp_buffer);
if(tmp_buffer != post_map) { return error; }
if (tmp_buffer != post_map) {
return error;
}
std::u32string pre_normal = post_map;
normalize(post_map);
if(post_map != pre_normal) { return error; }
if (post_map != pre_normal) {
return error;
}
if (post_map.empty()) {
return error;
}
Expand All @@ -96,15 +101,19 @@ static std::string from_ascii_to_ascii(std::string_view ut8_string) {

// We return "" on error. For now.
std::string to_ascii(std::string_view ut8_string) {
if(is_ascii(ut8_string)) { return from_ascii_to_ascii(ut8_string); }
if (is_ascii(ut8_string)) {
return from_ascii_to_ascii(ut8_string);
}
static const std::string error = "";
// We convert to UTF-32
size_t utf32_length =
ada::idna::utf32_length_from_utf8(ut8_string.data(), ut8_string.size());
std::u32string utf32(utf32_length, '\0');
size_t actual_utf32_length = ada::idna::utf8_to_utf32(
ut8_string.data(), ut8_string.size(), utf32.data());
if(actual_utf32_length == 0) { return error; }
if (actual_utf32_length == 0) {
return error;
}
// mapping
utf32 = ada::idna::map(utf32);
normalize(utf32);
Expand Down Expand Up @@ -138,10 +147,14 @@ std::string to_ascii(std::string_view ut8_string) {
return error;
}
std::u32string post_map = ada::idna::map(tmp_buffer);
if(tmp_buffer != post_map) { return error; }
if (tmp_buffer != post_map) {
return error;
}
std::u32string pre_normal = post_map;
normalize(post_map);
if(post_map != pre_normal) { return error; }
if (post_map != pre_normal) {
return error;
}
if (post_map.empty()) {
return error;
}
Expand Down Expand Up @@ -175,4 +188,4 @@ std::string to_ascii(std::string_view ut8_string) {
}
return out;
}
} // namespace ada::idna
} // namespace ada::idna