Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Unified Diff: base/strings/utf_offset_string_conversions.cc

Issue 2953943003: base::OffsetAdjuster: Refactor offset limiting logic into the base::OffsetAdjuster (Closed)
Patch Set: fix Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/strings/utf_offset_string_conversions.cc
diff --git a/base/strings/utf_offset_string_conversions.cc b/base/strings/utf_offset_string_conversions.cc
index 79c00f03834ea80e58216787eee50dbfa47508b9..5cdbaf9de0b4b11097d8afb57543b23df36d5be5 100644
--- a/base/strings/utf_offset_string_conversions.cc
+++ b/base/strings/utf_offset_string_conversions.cc
@@ -15,6 +15,23 @@
namespace base {
+namespace {
+
+// Limiting function callable by std::for_each which will replace any value
+// which is greater than |limit| with npos.
+struct LimitOffset {
+ explicit LimitOffset(size_t limit) : limit_(limit) {}
+
+ void operator()(size_t& offset) {
+ if (offset > limit_)
+ offset = string16::npos;
+ }
+
+ size_t limit_;
+};
+
+} // namespace
+
OffsetAdjuster::Adjustment::Adjustment(size_t original_offset,
size_t original_length,
size_t output_length)
@@ -24,19 +41,20 @@ OffsetAdjuster::Adjustment::Adjustment(size_t original_offset,
}
// static
-void OffsetAdjuster::AdjustOffsets(
- const Adjustments& adjustments,
- std::vector<size_t>* offsets_for_adjustment) {
- if (!offsets_for_adjustment || adjustments.empty())
- return;
+void OffsetAdjuster::AdjustOffsets(const Adjustments& adjustments,
+ std::vector<size_t>* offsets_for_adjustment,
+ size_t limit) {
+ DCHECK(offsets_for_adjustment);
for (std::vector<size_t>::iterator i(offsets_for_adjustment->begin());
i != offsets_for_adjustment->end(); ++i)
- AdjustOffset(adjustments, &(*i));
+ AdjustOffset(adjustments, &(*i), limit);
}
// static
void OffsetAdjuster::AdjustOffset(const Adjustments& adjustments,
- size_t* offset) {
+ size_t* offset,
+ size_t limit) {
+ DCHECK(offset);
if (*offset == string16::npos)
return;
int adjustment = 0;
@@ -51,6 +69,9 @@ void OffsetAdjuster::AdjustOffset(const Adjustments& adjustments,
adjustment += static_cast<int>(i->original_length - i->output_length);
}
*offset -= adjustment;
+
+ if (*offset > limit)
+ *offset = string16::npos;
}
// static
@@ -236,9 +257,8 @@ string16 UTF8ToUTF16WithAdjustments(
string16 UTF8ToUTF16AndAdjustOffsets(
const base::StringPiece& utf8,
std::vector<size_t>* offsets_for_adjustment) {
- std::for_each(offsets_for_adjustment->begin(),
- offsets_for_adjustment->end(),
- LimitOffset<base::StringPiece>(utf8.length()));
+ std::for_each(offsets_for_adjustment->begin(), offsets_for_adjustment->end(),
+ LimitOffset(utf8.length()));
OffsetAdjuster::Adjustments adjustments;
string16 result = UTF8ToUTF16WithAdjustments(utf8, &adjustments);
OffsetAdjuster::AdjustOffsets(adjustments, offsets_for_adjustment);
@@ -248,9 +268,8 @@ string16 UTF8ToUTF16AndAdjustOffsets(
std::string UTF16ToUTF8AndAdjustOffsets(
const base::StringPiece16& utf16,
std::vector<size_t>* offsets_for_adjustment) {
- std::for_each(offsets_for_adjustment->begin(),
- offsets_for_adjustment->end(),
- LimitOffset<base::StringPiece16>(utf16.length()));
+ std::for_each(offsets_for_adjustment->begin(), offsets_for_adjustment->end(),
+ LimitOffset(utf16.length()));
std::string result;
PrepareForUTF8Output(utf16.data(), utf16.length(), &result);
OffsetAdjuster::Adjustments adjustments;

Powered by Google App Engine
This is Rietveld 408576698