blob: 789760dd9c7101abe1cdc54090f532f493c420f0 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_TEXT_OFFSET_MAP_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_TEXT_OFFSET_MAP_H_
#include <unicode/edits.h>
#include "third_party/blink/renderer/platform/wtf/forward.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
#include "third_party/blink/renderer/platform/wtf/wtf_export.h"
namespace WTF {
// Represents a mapping of text offset when |CaseMap| changes the length of the
// input string. Similar to [icu::Edits], but tracks only when the length
// changes.
//
// For example, when a character is inserted at offset 3, this map has an entry
// {3, 4}, meaning the offset 3 of the source becomes 4 in the result. When a
// character is removed at offset 3, an entry {4, 3} is created.
//
// [icu::Edits]: http://icu-project.org/apiref/icu4c/classicu_1_1Edits.html
class WTF_EXPORT TextOffsetMap {
public:
struct Entry {
Entry(wtf_size_t source, wtf_size_t target)
: source(source), target(target) {}
bool operator==(const Entry& rhs) const {
return source == rhs.source && target == rhs.target;
}
wtf_size_t source;
wtf_size_t target;
};
bool IsEmpty() const { return entries_.IsEmpty(); }
const Vector<Entry>& Entries() const { return entries_; }
void Clear() { entries_.Shrink(0); }
void Append(wtf_size_t source, wtf_size_t target);
void Append(const icu::Edits& edits);
private:
Vector<Entry> entries_;
};
WTF_EXPORT std::ostream& operator<<(std::ostream&, const TextOffsetMap::Entry&);
} // namespace WTF
using WTF::TextOffsetMap;
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_TEXT_OFFSET_MAP_H_