/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Tokenizer.

#ifndef LIBTEXTCLASSIFIER_SMARTSELECT_TOKENIZER_H_
#define LIBTEXTCLASSIFIER_SMARTSELECT_TOKENIZER_H_

#include <string>
#include <vector>

#include "smartselect/tokenizer.pb.h"
#include "smartselect/types.h"
#include "util/base/integral_types.h"

namespace libtextclassifier {

// Represents a codepoint range [start, end) with its role for tokenization.
struct CodepointRange {
  int32 start;
  int32 end;
  TokenizationCodepointRange::Role role;

  CodepointRange(int32 arg_start, int32 arg_end,
                 TokenizationCodepointRange::Role arg_role)
      : start(arg_start), end(arg_end), role(arg_role) {}
};

// Tokenizer splits the input string into a sequence of tokens, according to the
// configuration.
class Tokenizer {
 public:
  explicit Tokenizer(
      const std::vector<TokenizationCodepointRange>& codepoint_range_configs) {
    PrepareTokenizationCodepointRanges(codepoint_range_configs);
  }

  // Tokenizes the input string using the selected tokenization method.
  std::vector<Token> Tokenize(const std::string& utf8_text) const;

 protected:
  // Prepares tokenization codepoint ranges for use in tokenization.
  void PrepareTokenizationCodepointRanges(
      const std::vector<TokenizationCodepointRange> codepoint_range_configs);

  // Finds the tokenization role for given codepoint.
  // If the character is not found returns DEFAULT_ROLE.
  // Internally uses binary search so should be O(log2(# of codepoint_ranges)).
  TokenizationCodepointRange::Role FindTokenizationRole(int codepoint) const;

 private:
  // Codepoint ranges that determine how different codepoints are tokenized.
  // The ranges must not overlap.
  std::vector<CodepointRange> codepoint_ranges_;
};

}  // namespace libtextclassifier

#endif  // LIBTEXTCLASSIFIER_SMARTSELECT_TOKENIZER_H_
