Skip to content

Commit

Permalink
Refactor RewriteAd() and RewriteEra() arguments
Browse files Browse the repository at this point in the history
This patch moves `num_done` to an out argument to simplify the caller code.

It also changes `RewriteEra()` to be consistent with `RewriteAd()`, to skip rewriting the segment that starts with the `kNenKey`.

This makes the two functions more consistent, makes the caller a bit more readable, and reduces some minor CPU cycles. But the change isn't observable, unless we have a rewrite pattern that starts with the `kNenKey` in future, such as an era name starting with the `kNenKey`.

PiperOrigin-RevId: 650501471
  • Loading branch information
kojiishi authored and hiroyuki-komatsu committed Jul 9, 2024
1 parent 183b5e8 commit a6eb8c8
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 21 deletions.
35 changes: 18 additions & 17 deletions src/rewriter/date_rewriter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -963,7 +963,8 @@ std::vector<std::string> GetConversions(const DateRewriter::DateData &data,
} // namespace

bool DateRewriter::RewriteDate(Segment *segment,
const absl::string_view extra_format) {
const absl::string_view extra_format,
size_t &num_done_out) {
const std::string &key = segment->key();
auto rit = std::find_if(std::begin(kDateData), std::end(kDateData),
[&key](auto data) { return key == data.key; });
Expand Down Expand Up @@ -1005,10 +1006,12 @@ bool DateRewriter::RewriteDate(Segment *segment,
const size_t min_idx = std::min<size_t>(3, end_idx);
const size_t insert_idx = std::clamp(cand_idx + 1, min_idx, end_idx);
segment->insert_candidates(insert_idx, std::move(candidates));
num_done_out = 1;
return true;
}

size_t DateRewriter::RewriteEra(Segments::range segments_range) {
bool DateRewriter::RewriteEra(Segments::range segments_range,
size_t &num_done_out) {
// Rewrite:
// * If the first segment ends with the `kNenKey`, or
// * If the second segment starts with the `kNenKey`.
Expand All @@ -1019,29 +1022,29 @@ size_t DateRewriter::RewriteEra(Segments::range segments_range) {
key.remove_suffix(kNenKey.size());
} else if (segments_range.size() < 2 ||
!absl::StartsWith(segments_range[1].key(), kNenKey)) {
return 0;
return false;
}

if (Util::GetScriptType(key) != Util::NUMBER) {
return 0;
return false;
}

const size_t len = Util::CharsLen(key);
if (len < 3 || len > 4) {
LOG(WARNING) << "Too long year";
return 0;
return false;
}

std::string year_str = japanese_util::FullWidthAsciiToHalfWidthAscii(key);

uint32_t year = 0;
if (!absl::SimpleAtoi(year_str, &year)) {
return 0;
return false;
}

std::vector<std::string> results;
if (!AdToEra(year, 0, /* unknown month */ &results)) {
return 0;
return false;
}

constexpr absl::string_view kDescription = "和暦";
Expand All @@ -1061,10 +1064,12 @@ size_t DateRewriter::RewriteEra(Segments::range segments_range) {
constexpr int kInsertPosition = 2;
segment.insert_candidates(kInsertPosition, std::move(candidates));

return has_suffix ? 1 : 2;
num_done_out = has_suffix ? 1 : 2;
return true;
}

bool DateRewriter::RewriteAd(Segments::range segments_range) {
bool DateRewriter::RewriteAd(Segments::range segments_range,
size_t &num_done_out) {
// Rewrite:
// * If the first segment ends with the `kNenKey`, or
// * If the second segment starts with the `kNenKey`.
Expand Down Expand Up @@ -1100,6 +1105,7 @@ bool DateRewriter::RewriteAd(Segments::range segments_range) {
// Insert position is the last of candidates
const int position = static_cast<int>(segment->candidates_size());
segment->insert_candidates(position, std::move(candidates));
num_done_out = has_suffix ? 1 : 2;
return true;
}

Expand Down Expand Up @@ -1526,14 +1532,9 @@ bool DateRewriter::Rewrite(const ConversionRequest &request,
return true;
}

if (RewriteAd(rest_segments) || RewriteDate(seg, extra_format)) {
modified = true;
num_done = 1;
continue;
}

num_done = RewriteEra(rest_segments);
if (num_done) {
if (RewriteAd(rest_segments, num_done) ||
RewriteDate(seg, extra_format, num_done) ||
RewriteEra(rest_segments, num_done)) {
modified = true;
continue;
}
Expand Down
11 changes: 7 additions & 4 deletions src/rewriter/date_rewriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,10 +150,13 @@ class DateRewriter : public RewriterInterface {
static constexpr char kExtraFormatKey[] = "DATE_FORMAT";

private:
static bool RewriteDate(Segment *segment, absl::string_view extra_format);
// Returns the number of segments processed.
static size_t RewriteEra(Segments::range segments_range);
static bool RewriteAd(Segments::range segments_range);
// If the rewrite is done, returns `true` and sets the `num_done_out` to the
// number of segments processed. The `num_done_out` is not modified if the
// rewrite is not done.
static bool RewriteDate(Segment *segment, absl::string_view extra_format,
size_t &num_done_out);
static bool RewriteEra(Segments::range segments_range, size_t &num_done_out);
static bool RewriteAd(Segments::range segments_range, size_t &num_done_out);
bool ResizeSegmentsForRewriteAd(const ConversionRequest &request,
Segments::const_range segments_range,
Segments *segments) const;
Expand Down

0 comments on commit a6eb8c8

Please sign in to comment.