// 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_
