// Copyright 2014 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.

// This module computes snippets of queries based on hits in the documents
// for display in history search results.

#ifndef COMPONENTS_QUERY_PARSER_SNIPPET_H__
#define COMPONENTS_QUERY_PARSER_SNIPPET_H__

#include <stddef.h>

#include <vector>

#include "base/strings/string16.h"

namespace query_parser {

class Snippet {
 public:
  // Each MatchPosition is the [begin, end) positions of a match within a
  // string.
  typedef std::pair<size_t, size_t> MatchPosition;
  typedef std::vector<MatchPosition> MatchPositions;

  // Parses an offsets string as returned from a sqlite full text index. An
  // offsets string encodes information about why a row matched a text query.
  // The information is encoded in the string as a set of matches, where each
  // match consists of the column, term-number, location, and length of the
  // match. Each element of the match is separated by a space, as is each match
  // from other matches.
  //
  // This method adds the start and end of each match whose column is
  // column_num to match_positions. The pairs are ordered based on first,
  // with no overlapping elements.
  //
  // NOTE: the positions returned are in terms of UTF8 encoding. To convert the
  // offsets to UTF-16, use ConvertMatchPositionsToWide
  static void ExtractMatchPositions(const std::string& offsets_str,
                                    const std::string& column_num,
                                    MatchPositions* match_positions);

  // Converts match positions as returned from ExtractMatchPositions to be in
  // terms of a UTF-16 2-byte code unit.
  static void ConvertMatchPositionsToWide(
      const std::string& utf8_string,
      Snippet::MatchPositions* match_positions);

  Snippet();
  Snippet(const Snippet& other);
  Snippet(Snippet&& other) noexcept;
  ~Snippet();

  Snippet& operator=(const Snippet&);

  // Given |matches|, the match positions within |document|, compute the snippet
  // for the document.
  // Note that |document| is UTF-8 and the offsets in |matches| are byte
  // offsets.
  void ComputeSnippet(const MatchPositions& matches,
                      const std::string& document);

  const base::string16& text() const { return text_; }
  const MatchPositions& matches() const { return matches_; }

  // Efficiently swaps the contents of this snippet with the other.
  void Swap(Snippet* other);

 private:
  // The text of the snippet.
  base::string16 text_;

  // The matches within text_.
  MatchPositions matches_;
};

}  // namespace query_parser

#endif  // COMPONENTS_QUERY_PARSER_SNIPPET_H__
