C++程序  |  3719行  |  168.48 KB

/*
 * 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.
 */

// automatically generated by the FlatBuffers compiler, do not modify


#ifndef FLATBUFFERS_GENERATED_MODEL_LIBTEXTCLASSIFIER2_H_
#define FLATBUFFERS_GENERATED_MODEL_LIBTEXTCLASSIFIER2_H_

#include "flatbuffers/flatbuffers.h"

namespace libtextclassifier2 {

struct CompressedBuffer;
struct CompressedBufferT;

struct SelectionModelOptions;
struct SelectionModelOptionsT;

struct ClassificationModelOptions;
struct ClassificationModelOptionsT;

namespace RegexModel_ {

struct Pattern;
struct PatternT;

}  // namespace RegexModel_

struct RegexModel;
struct RegexModelT;

namespace DatetimeModelPattern_ {

struct Regex;
struct RegexT;

}  // namespace DatetimeModelPattern_

struct DatetimeModelPattern;
struct DatetimeModelPatternT;

struct DatetimeModelExtractor;
struct DatetimeModelExtractorT;

struct DatetimeModel;
struct DatetimeModelT;

namespace DatetimeModelLibrary_ {

struct Item;
struct ItemT;

}  // namespace DatetimeModelLibrary_

struct DatetimeModelLibrary;
struct DatetimeModelLibraryT;

struct ModelTriggeringOptions;
struct ModelTriggeringOptionsT;

struct OutputOptions;
struct OutputOptionsT;

struct Model;
struct ModelT;

struct TokenizationCodepointRange;
struct TokenizationCodepointRangeT;

namespace FeatureProcessorOptions_ {

struct CodepointRange;
struct CodepointRangeT;

struct BoundsSensitiveFeatures;
struct BoundsSensitiveFeaturesT;

struct AlternativeCollectionMapEntry;
struct AlternativeCollectionMapEntryT;

}  // namespace FeatureProcessorOptions_

struct FeatureProcessorOptions;
struct FeatureProcessorOptionsT;

enum ModeFlag {
  ModeFlag_NONE = 0,
  ModeFlag_ANNOTATION = 1,
  ModeFlag_CLASSIFICATION = 2,
  ModeFlag_ANNOTATION_AND_CLASSIFICATION = 3,
  ModeFlag_SELECTION = 4,
  ModeFlag_ANNOTATION_AND_SELECTION = 5,
  ModeFlag_CLASSIFICATION_AND_SELECTION = 6,
  ModeFlag_ALL = 7,
  ModeFlag_MIN = ModeFlag_NONE,
  ModeFlag_MAX = ModeFlag_ALL
};

inline ModeFlag (&EnumValuesModeFlag())[8] {
  static ModeFlag values[] = {
    ModeFlag_NONE,
    ModeFlag_ANNOTATION,
    ModeFlag_CLASSIFICATION,
    ModeFlag_ANNOTATION_AND_CLASSIFICATION,
    ModeFlag_SELECTION,
    ModeFlag_ANNOTATION_AND_SELECTION,
    ModeFlag_CLASSIFICATION_AND_SELECTION,
    ModeFlag_ALL
  };
  return values;
}

inline const char **EnumNamesModeFlag() {
  static const char *names[] = {
    "NONE",
    "ANNOTATION",
    "CLASSIFICATION",
    "ANNOTATION_AND_CLASSIFICATION",
    "SELECTION",
    "ANNOTATION_AND_SELECTION",
    "CLASSIFICATION_AND_SELECTION",
    "ALL",
    nullptr
  };
  return names;
}

inline const char *EnumNameModeFlag(ModeFlag e) {
  const size_t index = static_cast<int>(e);
  return EnumNamesModeFlag()[index];
}

enum DatetimeExtractorType {
  DatetimeExtractorType_UNKNOWN_DATETIME_EXTRACTOR_TYPE = 0,
  DatetimeExtractorType_AM = 1,
  DatetimeExtractorType_PM = 2,
  DatetimeExtractorType_JANUARY = 3,
  DatetimeExtractorType_FEBRUARY = 4,
  DatetimeExtractorType_MARCH = 5,
  DatetimeExtractorType_APRIL = 6,
  DatetimeExtractorType_MAY = 7,
  DatetimeExtractorType_JUNE = 8,
  DatetimeExtractorType_JULY = 9,
  DatetimeExtractorType_AUGUST = 10,
  DatetimeExtractorType_SEPTEMBER = 11,
  DatetimeExtractorType_OCTOBER = 12,
  DatetimeExtractorType_NOVEMBER = 13,
  DatetimeExtractorType_DECEMBER = 14,
  DatetimeExtractorType_NEXT = 15,
  DatetimeExtractorType_NEXT_OR_SAME = 16,
  DatetimeExtractorType_LAST = 17,
  DatetimeExtractorType_NOW = 18,
  DatetimeExtractorType_TOMORROW = 19,
  DatetimeExtractorType_YESTERDAY = 20,
  DatetimeExtractorType_PAST = 21,
  DatetimeExtractorType_FUTURE = 22,
  DatetimeExtractorType_DAY = 23,
  DatetimeExtractorType_WEEK = 24,
  DatetimeExtractorType_MONTH = 25,
  DatetimeExtractorType_YEAR = 26,
  DatetimeExtractorType_MONDAY = 27,
  DatetimeExtractorType_TUESDAY = 28,
  DatetimeExtractorType_WEDNESDAY = 29,
  DatetimeExtractorType_THURSDAY = 30,
  DatetimeExtractorType_FRIDAY = 31,
  DatetimeExtractorType_SATURDAY = 32,
  DatetimeExtractorType_SUNDAY = 33,
  DatetimeExtractorType_DAYS = 34,
  DatetimeExtractorType_WEEKS = 35,
  DatetimeExtractorType_MONTHS = 36,
  DatetimeExtractorType_HOURS = 37,
  DatetimeExtractorType_MINUTES = 38,
  DatetimeExtractorType_SECONDS = 39,
  DatetimeExtractorType_YEARS = 40,
  DatetimeExtractorType_DIGITS = 41,
  DatetimeExtractorType_SIGNEDDIGITS = 42,
  DatetimeExtractorType_ZERO = 43,
  DatetimeExtractorType_ONE = 44,
  DatetimeExtractorType_TWO = 45,
  DatetimeExtractorType_THREE = 46,
  DatetimeExtractorType_FOUR = 47,
  DatetimeExtractorType_FIVE = 48,
  DatetimeExtractorType_SIX = 49,
  DatetimeExtractorType_SEVEN = 50,
  DatetimeExtractorType_EIGHT = 51,
  DatetimeExtractorType_NINE = 52,
  DatetimeExtractorType_TEN = 53,
  DatetimeExtractorType_ELEVEN = 54,
  DatetimeExtractorType_TWELVE = 55,
  DatetimeExtractorType_THIRTEEN = 56,
  DatetimeExtractorType_FOURTEEN = 57,
  DatetimeExtractorType_FIFTEEN = 58,
  DatetimeExtractorType_SIXTEEN = 59,
  DatetimeExtractorType_SEVENTEEN = 60,
  DatetimeExtractorType_EIGHTEEN = 61,
  DatetimeExtractorType_NINETEEN = 62,
  DatetimeExtractorType_TWENTY = 63,
  DatetimeExtractorType_THIRTY = 64,
  DatetimeExtractorType_FORTY = 65,
  DatetimeExtractorType_FIFTY = 66,
  DatetimeExtractorType_SIXTY = 67,
  DatetimeExtractorType_SEVENTY = 68,
  DatetimeExtractorType_EIGHTY = 69,
  DatetimeExtractorType_NINETY = 70,
  DatetimeExtractorType_HUNDRED = 71,
  DatetimeExtractorType_THOUSAND = 72,
  DatetimeExtractorType_MIN = DatetimeExtractorType_UNKNOWN_DATETIME_EXTRACTOR_TYPE,
  DatetimeExtractorType_MAX = DatetimeExtractorType_THOUSAND
};

inline DatetimeExtractorType (&EnumValuesDatetimeExtractorType())[73] {
  static DatetimeExtractorType values[] = {
    DatetimeExtractorType_UNKNOWN_DATETIME_EXTRACTOR_TYPE,
    DatetimeExtractorType_AM,
    DatetimeExtractorType_PM,
    DatetimeExtractorType_JANUARY,
    DatetimeExtractorType_FEBRUARY,
    DatetimeExtractorType_MARCH,
    DatetimeExtractorType_APRIL,
    DatetimeExtractorType_MAY,
    DatetimeExtractorType_JUNE,
    DatetimeExtractorType_JULY,
    DatetimeExtractorType_AUGUST,
    DatetimeExtractorType_SEPTEMBER,
    DatetimeExtractorType_OCTOBER,
    DatetimeExtractorType_NOVEMBER,
    DatetimeExtractorType_DECEMBER,
    DatetimeExtractorType_NEXT,
    DatetimeExtractorType_NEXT_OR_SAME,
    DatetimeExtractorType_LAST,
    DatetimeExtractorType_NOW,
    DatetimeExtractorType_TOMORROW,
    DatetimeExtractorType_YESTERDAY,
    DatetimeExtractorType_PAST,
    DatetimeExtractorType_FUTURE,
    DatetimeExtractorType_DAY,
    DatetimeExtractorType_WEEK,
    DatetimeExtractorType_MONTH,
    DatetimeExtractorType_YEAR,
    DatetimeExtractorType_MONDAY,
    DatetimeExtractorType_TUESDAY,
    DatetimeExtractorType_WEDNESDAY,
    DatetimeExtractorType_THURSDAY,
    DatetimeExtractorType_FRIDAY,
    DatetimeExtractorType_SATURDAY,
    DatetimeExtractorType_SUNDAY,
    DatetimeExtractorType_DAYS,
    DatetimeExtractorType_WEEKS,
    DatetimeExtractorType_MONTHS,
    DatetimeExtractorType_HOURS,
    DatetimeExtractorType_MINUTES,
    DatetimeExtractorType_SECONDS,
    DatetimeExtractorType_YEARS,
    DatetimeExtractorType_DIGITS,
    DatetimeExtractorType_SIGNEDDIGITS,
    DatetimeExtractorType_ZERO,
    DatetimeExtractorType_ONE,
    DatetimeExtractorType_TWO,
    DatetimeExtractorType_THREE,
    DatetimeExtractorType_FOUR,
    DatetimeExtractorType_FIVE,
    DatetimeExtractorType_SIX,
    DatetimeExtractorType_SEVEN,
    DatetimeExtractorType_EIGHT,
    DatetimeExtractorType_NINE,
    DatetimeExtractorType_TEN,
    DatetimeExtractorType_ELEVEN,
    DatetimeExtractorType_TWELVE,
    DatetimeExtractorType_THIRTEEN,
    DatetimeExtractorType_FOURTEEN,
    DatetimeExtractorType_FIFTEEN,
    DatetimeExtractorType_SIXTEEN,
    DatetimeExtractorType_SEVENTEEN,
    DatetimeExtractorType_EIGHTEEN,
    DatetimeExtractorType_NINETEEN,
    DatetimeExtractorType_TWENTY,
    DatetimeExtractorType_THIRTY,
    DatetimeExtractorType_FORTY,
    DatetimeExtractorType_FIFTY,
    DatetimeExtractorType_SIXTY,
    DatetimeExtractorType_SEVENTY,
    DatetimeExtractorType_EIGHTY,
    DatetimeExtractorType_NINETY,
    DatetimeExtractorType_HUNDRED,
    DatetimeExtractorType_THOUSAND
  };
  return values;
}

inline const char **EnumNamesDatetimeExtractorType() {
  static const char *names[] = {
    "UNKNOWN_DATETIME_EXTRACTOR_TYPE",
    "AM",
    "PM",
    "JANUARY",
    "FEBRUARY",
    "MARCH",
    "APRIL",
    "MAY",
    "JUNE",
    "JULY",
    "AUGUST",
    "SEPTEMBER",
    "OCTOBER",
    "NOVEMBER",
    "DECEMBER",
    "NEXT",
    "NEXT_OR_SAME",
    "LAST",
    "NOW",
    "TOMORROW",
    "YESTERDAY",
    "PAST",
    "FUTURE",
    "DAY",
    "WEEK",
    "MONTH",
    "YEAR",
    "MONDAY",
    "TUESDAY",
    "WEDNESDAY",
    "THURSDAY",
    "FRIDAY",
    "SATURDAY",
    "SUNDAY",
    "DAYS",
    "WEEKS",
    "MONTHS",
    "HOURS",
    "MINUTES",
    "SECONDS",
    "YEARS",
    "DIGITS",
    "SIGNEDDIGITS",
    "ZERO",
    "ONE",
    "TWO",
    "THREE",
    "FOUR",
    "FIVE",
    "SIX",
    "SEVEN",
    "EIGHT",
    "NINE",
    "TEN",
    "ELEVEN",
    "TWELVE",
    "THIRTEEN",
    "FOURTEEN",
    "FIFTEEN",
    "SIXTEEN",
    "SEVENTEEN",
    "EIGHTEEN",
    "NINETEEN",
    "TWENTY",
    "THIRTY",
    "FORTY",
    "FIFTY",
    "SIXTY",
    "SEVENTY",
    "EIGHTY",
    "NINETY",
    "HUNDRED",
    "THOUSAND",
    nullptr
  };
  return names;
}

inline const char *EnumNameDatetimeExtractorType(DatetimeExtractorType e) {
  const size_t index = static_cast<int>(e);
  return EnumNamesDatetimeExtractorType()[index];
}

enum DatetimeGroupType {
  DatetimeGroupType_GROUP_UNKNOWN = 0,
  DatetimeGroupType_GROUP_UNUSED = 1,
  DatetimeGroupType_GROUP_YEAR = 2,
  DatetimeGroupType_GROUP_MONTH = 3,
  DatetimeGroupType_GROUP_DAY = 4,
  DatetimeGroupType_GROUP_HOUR = 5,
  DatetimeGroupType_GROUP_MINUTE = 6,
  DatetimeGroupType_GROUP_SECOND = 7,
  DatetimeGroupType_GROUP_AMPM = 8,
  DatetimeGroupType_GROUP_RELATIONDISTANCE = 9,
  DatetimeGroupType_GROUP_RELATION = 10,
  DatetimeGroupType_GROUP_RELATIONTYPE = 11,
  DatetimeGroupType_GROUP_DUMMY1 = 12,
  DatetimeGroupType_GROUP_DUMMY2 = 13,
  DatetimeGroupType_MIN = DatetimeGroupType_GROUP_UNKNOWN,
  DatetimeGroupType_MAX = DatetimeGroupType_GROUP_DUMMY2
};

inline DatetimeGroupType (&EnumValuesDatetimeGroupType())[14] {
  static DatetimeGroupType values[] = {
    DatetimeGroupType_GROUP_UNKNOWN,
    DatetimeGroupType_GROUP_UNUSED,
    DatetimeGroupType_GROUP_YEAR,
    DatetimeGroupType_GROUP_MONTH,
    DatetimeGroupType_GROUP_DAY,
    DatetimeGroupType_GROUP_HOUR,
    DatetimeGroupType_GROUP_MINUTE,
    DatetimeGroupType_GROUP_SECOND,
    DatetimeGroupType_GROUP_AMPM,
    DatetimeGroupType_GROUP_RELATIONDISTANCE,
    DatetimeGroupType_GROUP_RELATION,
    DatetimeGroupType_GROUP_RELATIONTYPE,
    DatetimeGroupType_GROUP_DUMMY1,
    DatetimeGroupType_GROUP_DUMMY2
  };
  return values;
}

inline const char **EnumNamesDatetimeGroupType() {
  static const char *names[] = {
    "GROUP_UNKNOWN",
    "GROUP_UNUSED",
    "GROUP_YEAR",
    "GROUP_MONTH",
    "GROUP_DAY",
    "GROUP_HOUR",
    "GROUP_MINUTE",
    "GROUP_SECOND",
    "GROUP_AMPM",
    "GROUP_RELATIONDISTANCE",
    "GROUP_RELATION",
    "GROUP_RELATIONTYPE",
    "GROUP_DUMMY1",
    "GROUP_DUMMY2",
    nullptr
  };
  return names;
}

inline const char *EnumNameDatetimeGroupType(DatetimeGroupType e) {
  const size_t index = static_cast<int>(e);
  return EnumNamesDatetimeGroupType()[index];
}

namespace TokenizationCodepointRange_ {

enum Role {
  Role_DEFAULT_ROLE = 0,
  Role_SPLIT_BEFORE = 1,
  Role_SPLIT_AFTER = 2,
  Role_TOKEN_SEPARATOR = 3,
  Role_DISCARD_CODEPOINT = 4,
  Role_WHITESPACE_SEPARATOR = 7,
  Role_MIN = Role_DEFAULT_ROLE,
  Role_MAX = Role_WHITESPACE_SEPARATOR
};

inline Role (&EnumValuesRole())[6] {
  static Role values[] = {
    Role_DEFAULT_ROLE,
    Role_SPLIT_BEFORE,
    Role_SPLIT_AFTER,
    Role_TOKEN_SEPARATOR,
    Role_DISCARD_CODEPOINT,
    Role_WHITESPACE_SEPARATOR
  };
  return values;
}

inline const char **EnumNamesRole() {
  static const char *names[] = {
    "DEFAULT_ROLE",
    "SPLIT_BEFORE",
    "SPLIT_AFTER",
    "TOKEN_SEPARATOR",
    "DISCARD_CODEPOINT",
    "",
    "",
    "WHITESPACE_SEPARATOR",
    nullptr
  };
  return names;
}

inline const char *EnumNameRole(Role e) {
  const size_t index = static_cast<int>(e);
  return EnumNamesRole()[index];
}

}  // namespace TokenizationCodepointRange_

namespace FeatureProcessorOptions_ {

enum CenterTokenSelectionMethod {
  CenterTokenSelectionMethod_DEFAULT_CENTER_TOKEN_METHOD = 0,
  CenterTokenSelectionMethod_CENTER_TOKEN_FROM_CLICK = 1,
  CenterTokenSelectionMethod_CENTER_TOKEN_MIDDLE_OF_SELECTION = 2,
  CenterTokenSelectionMethod_MIN = CenterTokenSelectionMethod_DEFAULT_CENTER_TOKEN_METHOD,
  CenterTokenSelectionMethod_MAX = CenterTokenSelectionMethod_CENTER_TOKEN_MIDDLE_OF_SELECTION
};

inline CenterTokenSelectionMethod (&EnumValuesCenterTokenSelectionMethod())[3] {
  static CenterTokenSelectionMethod values[] = {
    CenterTokenSelectionMethod_DEFAULT_CENTER_TOKEN_METHOD,
    CenterTokenSelectionMethod_CENTER_TOKEN_FROM_CLICK,
    CenterTokenSelectionMethod_CENTER_TOKEN_MIDDLE_OF_SELECTION
  };
  return values;
}

inline const char **EnumNamesCenterTokenSelectionMethod() {
  static const char *names[] = {
    "DEFAULT_CENTER_TOKEN_METHOD",
    "CENTER_TOKEN_FROM_CLICK",
    "CENTER_TOKEN_MIDDLE_OF_SELECTION",
    nullptr
  };
  return names;
}

inline const char *EnumNameCenterTokenSelectionMethod(CenterTokenSelectionMethod e) {
  const size_t index = static_cast<int>(e);
  return EnumNamesCenterTokenSelectionMethod()[index];
}

enum TokenizationType {
  TokenizationType_INVALID_TOKENIZATION_TYPE = 0,
  TokenizationType_INTERNAL_TOKENIZER = 1,
  TokenizationType_ICU = 2,
  TokenizationType_MIXED = 3,
  TokenizationType_MIN = TokenizationType_INVALID_TOKENIZATION_TYPE,
  TokenizationType_MAX = TokenizationType_MIXED
};

inline TokenizationType (&EnumValuesTokenizationType())[4] {
  static TokenizationType values[] = {
    TokenizationType_INVALID_TOKENIZATION_TYPE,
    TokenizationType_INTERNAL_TOKENIZER,
    TokenizationType_ICU,
    TokenizationType_MIXED
  };
  return values;
}

inline const char **EnumNamesTokenizationType() {
  static const char *names[] = {
    "INVALID_TOKENIZATION_TYPE",
    "INTERNAL_TOKENIZER",
    "ICU",
    "MIXED",
    nullptr
  };
  return names;
}

inline const char *EnumNameTokenizationType(TokenizationType e) {
  const size_t index = static_cast<int>(e);
  return EnumNamesTokenizationType()[index];
}

}  // namespace FeatureProcessorOptions_

struct CompressedBufferT : public flatbuffers::NativeTable {
  typedef CompressedBuffer TableType;
  std::vector<uint8_t> buffer;
  int32_t uncompressed_size;
  CompressedBufferT()
      : uncompressed_size(0) {
  }
};

struct CompressedBuffer FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef CompressedBufferT NativeTableType;
  enum {
    VT_BUFFER = 4,
    VT_UNCOMPRESSED_SIZE = 6
  };
  const flatbuffers::Vector<uint8_t> *buffer() const {
    return GetPointer<const flatbuffers::Vector<uint8_t> *>(VT_BUFFER);
  }
  int32_t uncompressed_size() const {
    return GetField<int32_t>(VT_UNCOMPRESSED_SIZE, 0);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_BUFFER) &&
           verifier.Verify(buffer()) &&
           VerifyField<int32_t>(verifier, VT_UNCOMPRESSED_SIZE) &&
           verifier.EndTable();
  }
  CompressedBufferT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(CompressedBufferT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<CompressedBuffer> Pack(flatbuffers::FlatBufferBuilder &_fbb, const CompressedBufferT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct CompressedBufferBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_buffer(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> buffer) {
    fbb_.AddOffset(CompressedBuffer::VT_BUFFER, buffer);
  }
  void add_uncompressed_size(int32_t uncompressed_size) {
    fbb_.AddElement<int32_t>(CompressedBuffer::VT_UNCOMPRESSED_SIZE, uncompressed_size, 0);
  }
  explicit CompressedBufferBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  CompressedBufferBuilder &operator=(const CompressedBufferBuilder &);
  flatbuffers::Offset<CompressedBuffer> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<CompressedBuffer>(end);
    return o;
  }
};

inline flatbuffers::Offset<CompressedBuffer> CreateCompressedBuffer(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::Vector<uint8_t>> buffer = 0,
    int32_t uncompressed_size = 0) {
  CompressedBufferBuilder builder_(_fbb);
  builder_.add_uncompressed_size(uncompressed_size);
  builder_.add_buffer(buffer);
  return builder_.Finish();
}

inline flatbuffers::Offset<CompressedBuffer> CreateCompressedBufferDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const std::vector<uint8_t> *buffer = nullptr,
    int32_t uncompressed_size = 0) {
  return libtextclassifier2::CreateCompressedBuffer(
      _fbb,
      buffer ? _fbb.CreateVector<uint8_t>(*buffer) : 0,
      uncompressed_size);
}

flatbuffers::Offset<CompressedBuffer> CreateCompressedBuffer(flatbuffers::FlatBufferBuilder &_fbb, const CompressedBufferT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct SelectionModelOptionsT : public flatbuffers::NativeTable {
  typedef SelectionModelOptions TableType;
  bool strip_unpaired_brackets;
  int32_t symmetry_context_size;
  int32_t batch_size;
  bool always_classify_suggested_selection;
  SelectionModelOptionsT()
      : strip_unpaired_brackets(true),
        symmetry_context_size(0),
        batch_size(1024),
        always_classify_suggested_selection(false) {
  }
};

struct SelectionModelOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef SelectionModelOptionsT NativeTableType;
  enum {
    VT_STRIP_UNPAIRED_BRACKETS = 4,
    VT_SYMMETRY_CONTEXT_SIZE = 6,
    VT_BATCH_SIZE = 8,
    VT_ALWAYS_CLASSIFY_SUGGESTED_SELECTION = 10
  };
  bool strip_unpaired_brackets() const {
    return GetField<uint8_t>(VT_STRIP_UNPAIRED_BRACKETS, 1) != 0;
  }
  int32_t symmetry_context_size() const {
    return GetField<int32_t>(VT_SYMMETRY_CONTEXT_SIZE, 0);
  }
  int32_t batch_size() const {
    return GetField<int32_t>(VT_BATCH_SIZE, 1024);
  }
  bool always_classify_suggested_selection() const {
    return GetField<uint8_t>(VT_ALWAYS_CLASSIFY_SUGGESTED_SELECTION, 0) != 0;
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<uint8_t>(verifier, VT_STRIP_UNPAIRED_BRACKETS) &&
           VerifyField<int32_t>(verifier, VT_SYMMETRY_CONTEXT_SIZE) &&
           VerifyField<int32_t>(verifier, VT_BATCH_SIZE) &&
           VerifyField<uint8_t>(verifier, VT_ALWAYS_CLASSIFY_SUGGESTED_SELECTION) &&
           verifier.EndTable();
  }
  SelectionModelOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(SelectionModelOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<SelectionModelOptions> Pack(flatbuffers::FlatBufferBuilder &_fbb, const SelectionModelOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct SelectionModelOptionsBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_strip_unpaired_brackets(bool strip_unpaired_brackets) {
    fbb_.AddElement<uint8_t>(SelectionModelOptions::VT_STRIP_UNPAIRED_BRACKETS, static_cast<uint8_t>(strip_unpaired_brackets), 1);
  }
  void add_symmetry_context_size(int32_t symmetry_context_size) {
    fbb_.AddElement<int32_t>(SelectionModelOptions::VT_SYMMETRY_CONTEXT_SIZE, symmetry_context_size, 0);
  }
  void add_batch_size(int32_t batch_size) {
    fbb_.AddElement<int32_t>(SelectionModelOptions::VT_BATCH_SIZE, batch_size, 1024);
  }
  void add_always_classify_suggested_selection(bool always_classify_suggested_selection) {
    fbb_.AddElement<uint8_t>(SelectionModelOptions::VT_ALWAYS_CLASSIFY_SUGGESTED_SELECTION, static_cast<uint8_t>(always_classify_suggested_selection), 0);
  }
  explicit SelectionModelOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  SelectionModelOptionsBuilder &operator=(const SelectionModelOptionsBuilder &);
  flatbuffers::Offset<SelectionModelOptions> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<SelectionModelOptions>(end);
    return o;
  }
};

inline flatbuffers::Offset<SelectionModelOptions> CreateSelectionModelOptions(
    flatbuffers::FlatBufferBuilder &_fbb,
    bool strip_unpaired_brackets = true,
    int32_t symmetry_context_size = 0,
    int32_t batch_size = 1024,
    bool always_classify_suggested_selection = false) {
  SelectionModelOptionsBuilder builder_(_fbb);
  builder_.add_batch_size(batch_size);
  builder_.add_symmetry_context_size(symmetry_context_size);
  builder_.add_always_classify_suggested_selection(always_classify_suggested_selection);
  builder_.add_strip_unpaired_brackets(strip_unpaired_brackets);
  return builder_.Finish();
}

flatbuffers::Offset<SelectionModelOptions> CreateSelectionModelOptions(flatbuffers::FlatBufferBuilder &_fbb, const SelectionModelOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct ClassificationModelOptionsT : public flatbuffers::NativeTable {
  typedef ClassificationModelOptions TableType;
  int32_t phone_min_num_digits;
  int32_t phone_max_num_digits;
  int32_t address_min_num_tokens;
  int32_t max_num_tokens;
  ClassificationModelOptionsT()
      : phone_min_num_digits(7),
        phone_max_num_digits(15),
        address_min_num_tokens(0),
        max_num_tokens(-1) {
  }
};

struct ClassificationModelOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef ClassificationModelOptionsT NativeTableType;
  enum {
    VT_PHONE_MIN_NUM_DIGITS = 4,
    VT_PHONE_MAX_NUM_DIGITS = 6,
    VT_ADDRESS_MIN_NUM_TOKENS = 8,
    VT_MAX_NUM_TOKENS = 10
  };
  int32_t phone_min_num_digits() const {
    return GetField<int32_t>(VT_PHONE_MIN_NUM_DIGITS, 7);
  }
  int32_t phone_max_num_digits() const {
    return GetField<int32_t>(VT_PHONE_MAX_NUM_DIGITS, 15);
  }
  int32_t address_min_num_tokens() const {
    return GetField<int32_t>(VT_ADDRESS_MIN_NUM_TOKENS, 0);
  }
  int32_t max_num_tokens() const {
    return GetField<int32_t>(VT_MAX_NUM_TOKENS, -1);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<int32_t>(verifier, VT_PHONE_MIN_NUM_DIGITS) &&
           VerifyField<int32_t>(verifier, VT_PHONE_MAX_NUM_DIGITS) &&
           VerifyField<int32_t>(verifier, VT_ADDRESS_MIN_NUM_TOKENS) &&
           VerifyField<int32_t>(verifier, VT_MAX_NUM_TOKENS) &&
           verifier.EndTable();
  }
  ClassificationModelOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(ClassificationModelOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<ClassificationModelOptions> Pack(flatbuffers::FlatBufferBuilder &_fbb, const ClassificationModelOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct ClassificationModelOptionsBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_phone_min_num_digits(int32_t phone_min_num_digits) {
    fbb_.AddElement<int32_t>(ClassificationModelOptions::VT_PHONE_MIN_NUM_DIGITS, phone_min_num_digits, 7);
  }
  void add_phone_max_num_digits(int32_t phone_max_num_digits) {
    fbb_.AddElement<int32_t>(ClassificationModelOptions::VT_PHONE_MAX_NUM_DIGITS, phone_max_num_digits, 15);
  }
  void add_address_min_num_tokens(int32_t address_min_num_tokens) {
    fbb_.AddElement<int32_t>(ClassificationModelOptions::VT_ADDRESS_MIN_NUM_TOKENS, address_min_num_tokens, 0);
  }
  void add_max_num_tokens(int32_t max_num_tokens) {
    fbb_.AddElement<int32_t>(ClassificationModelOptions::VT_MAX_NUM_TOKENS, max_num_tokens, -1);
  }
  explicit ClassificationModelOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  ClassificationModelOptionsBuilder &operator=(const ClassificationModelOptionsBuilder &);
  flatbuffers::Offset<ClassificationModelOptions> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<ClassificationModelOptions>(end);
    return o;
  }
};

inline flatbuffers::Offset<ClassificationModelOptions> CreateClassificationModelOptions(
    flatbuffers::FlatBufferBuilder &_fbb,
    int32_t phone_min_num_digits = 7,
    int32_t phone_max_num_digits = 15,
    int32_t address_min_num_tokens = 0,
    int32_t max_num_tokens = -1) {
  ClassificationModelOptionsBuilder builder_(_fbb);
  builder_.add_max_num_tokens(max_num_tokens);
  builder_.add_address_min_num_tokens(address_min_num_tokens);
  builder_.add_phone_max_num_digits(phone_max_num_digits);
  builder_.add_phone_min_num_digits(phone_min_num_digits);
  return builder_.Finish();
}

flatbuffers::Offset<ClassificationModelOptions> CreateClassificationModelOptions(flatbuffers::FlatBufferBuilder &_fbb, const ClassificationModelOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

namespace RegexModel_ {

struct PatternT : public flatbuffers::NativeTable {
  typedef Pattern TableType;
  std::string collection_name;
  std::string pattern;
  libtextclassifier2::ModeFlag enabled_modes;
  float target_classification_score;
  float priority_score;
  bool use_approximate_matching;
  std::unique_ptr<libtextclassifier2::CompressedBufferT> compressed_pattern;
  PatternT()
      : enabled_modes(libtextclassifier2::ModeFlag_ALL),
        target_classification_score(1.0f),
        priority_score(0.0f),
        use_approximate_matching(false) {
  }
};

struct Pattern FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef PatternT NativeTableType;
  enum {
    VT_COLLECTION_NAME = 4,
    VT_PATTERN = 6,
    VT_ENABLED_MODES = 8,
    VT_TARGET_CLASSIFICATION_SCORE = 10,
    VT_PRIORITY_SCORE = 12,
    VT_USE_APPROXIMATE_MATCHING = 14,
    VT_COMPRESSED_PATTERN = 16
  };
  const flatbuffers::String *collection_name() const {
    return GetPointer<const flatbuffers::String *>(VT_COLLECTION_NAME);
  }
  const flatbuffers::String *pattern() const {
    return GetPointer<const flatbuffers::String *>(VT_PATTERN);
  }
  libtextclassifier2::ModeFlag enabled_modes() const {
    return static_cast<libtextclassifier2::ModeFlag>(GetField<int32_t>(VT_ENABLED_MODES, 7));
  }
  float target_classification_score() const {
    return GetField<float>(VT_TARGET_CLASSIFICATION_SCORE, 1.0f);
  }
  float priority_score() const {
    return GetField<float>(VT_PRIORITY_SCORE, 0.0f);
  }
  bool use_approximate_matching() const {
    return GetField<uint8_t>(VT_USE_APPROXIMATE_MATCHING, 0) != 0;
  }
  const libtextclassifier2::CompressedBuffer *compressed_pattern() const {
    return GetPointer<const libtextclassifier2::CompressedBuffer *>(VT_COMPRESSED_PATTERN);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_COLLECTION_NAME) &&
           verifier.Verify(collection_name()) &&
           VerifyOffset(verifier, VT_PATTERN) &&
           verifier.Verify(pattern()) &&
           VerifyField<int32_t>(verifier, VT_ENABLED_MODES) &&
           VerifyField<float>(verifier, VT_TARGET_CLASSIFICATION_SCORE) &&
           VerifyField<float>(verifier, VT_PRIORITY_SCORE) &&
           VerifyField<uint8_t>(verifier, VT_USE_APPROXIMATE_MATCHING) &&
           VerifyOffset(verifier, VT_COMPRESSED_PATTERN) &&
           verifier.VerifyTable(compressed_pattern()) &&
           verifier.EndTable();
  }
  PatternT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(PatternT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<Pattern> Pack(flatbuffers::FlatBufferBuilder &_fbb, const PatternT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct PatternBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_collection_name(flatbuffers::Offset<flatbuffers::String> collection_name) {
    fbb_.AddOffset(Pattern::VT_COLLECTION_NAME, collection_name);
  }
  void add_pattern(flatbuffers::Offset<flatbuffers::String> pattern) {
    fbb_.AddOffset(Pattern::VT_PATTERN, pattern);
  }
  void add_enabled_modes(libtextclassifier2::ModeFlag enabled_modes) {
    fbb_.AddElement<int32_t>(Pattern::VT_ENABLED_MODES, static_cast<int32_t>(enabled_modes), 7);
  }
  void add_target_classification_score(float target_classification_score) {
    fbb_.AddElement<float>(Pattern::VT_TARGET_CLASSIFICATION_SCORE, target_classification_score, 1.0f);
  }
  void add_priority_score(float priority_score) {
    fbb_.AddElement<float>(Pattern::VT_PRIORITY_SCORE, priority_score, 0.0f);
  }
  void add_use_approximate_matching(bool use_approximate_matching) {
    fbb_.AddElement<uint8_t>(Pattern::VT_USE_APPROXIMATE_MATCHING, static_cast<uint8_t>(use_approximate_matching), 0);
  }
  void add_compressed_pattern(flatbuffers::Offset<libtextclassifier2::CompressedBuffer> compressed_pattern) {
    fbb_.AddOffset(Pattern::VT_COMPRESSED_PATTERN, compressed_pattern);
  }
  explicit PatternBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  PatternBuilder &operator=(const PatternBuilder &);
  flatbuffers::Offset<Pattern> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<Pattern>(end);
    return o;
  }
};

inline flatbuffers::Offset<Pattern> CreatePattern(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::String> collection_name = 0,
    flatbuffers::Offset<flatbuffers::String> pattern = 0,
    libtextclassifier2::ModeFlag enabled_modes = libtextclassifier2::ModeFlag_ALL,
    float target_classification_score = 1.0f,
    float priority_score = 0.0f,
    bool use_approximate_matching = false,
    flatbuffers::Offset<libtextclassifier2::CompressedBuffer> compressed_pattern = 0) {
  PatternBuilder builder_(_fbb);
  builder_.add_compressed_pattern(compressed_pattern);
  builder_.add_priority_score(priority_score);
  builder_.add_target_classification_score(target_classification_score);
  builder_.add_enabled_modes(enabled_modes);
  builder_.add_pattern(pattern);
  builder_.add_collection_name(collection_name);
  builder_.add_use_approximate_matching(use_approximate_matching);
  return builder_.Finish();
}

inline flatbuffers::Offset<Pattern> CreatePatternDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const char *collection_name = nullptr,
    const char *pattern = nullptr,
    libtextclassifier2::ModeFlag enabled_modes = libtextclassifier2::ModeFlag_ALL,
    float target_classification_score = 1.0f,
    float priority_score = 0.0f,
    bool use_approximate_matching = false,
    flatbuffers::Offset<libtextclassifier2::CompressedBuffer> compressed_pattern = 0) {
  return libtextclassifier2::RegexModel_::CreatePattern(
      _fbb,
      collection_name ? _fbb.CreateString(collection_name) : 0,
      pattern ? _fbb.CreateString(pattern) : 0,
      enabled_modes,
      target_classification_score,
      priority_score,
      use_approximate_matching,
      compressed_pattern);
}

flatbuffers::Offset<Pattern> CreatePattern(flatbuffers::FlatBufferBuilder &_fbb, const PatternT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

}  // namespace RegexModel_

struct RegexModelT : public flatbuffers::NativeTable {
  typedef RegexModel TableType;
  std::vector<std::unique_ptr<libtextclassifier2::RegexModel_::PatternT>> patterns;
  RegexModelT() {
  }
};

struct RegexModel FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef RegexModelT NativeTableType;
  enum {
    VT_PATTERNS = 4
  };
  const flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::RegexModel_::Pattern>> *patterns() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::RegexModel_::Pattern>> *>(VT_PATTERNS);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_PATTERNS) &&
           verifier.Verify(patterns()) &&
           verifier.VerifyVectorOfTables(patterns()) &&
           verifier.EndTable();
  }
  RegexModelT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(RegexModelT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<RegexModel> Pack(flatbuffers::FlatBufferBuilder &_fbb, const RegexModelT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct RegexModelBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_patterns(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::RegexModel_::Pattern>>> patterns) {
    fbb_.AddOffset(RegexModel::VT_PATTERNS, patterns);
  }
  explicit RegexModelBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  RegexModelBuilder &operator=(const RegexModelBuilder &);
  flatbuffers::Offset<RegexModel> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<RegexModel>(end);
    return o;
  }
};

inline flatbuffers::Offset<RegexModel> CreateRegexModel(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::RegexModel_::Pattern>>> patterns = 0) {
  RegexModelBuilder builder_(_fbb);
  builder_.add_patterns(patterns);
  return builder_.Finish();
}

inline flatbuffers::Offset<RegexModel> CreateRegexModelDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const std::vector<flatbuffers::Offset<libtextclassifier2::RegexModel_::Pattern>> *patterns = nullptr) {
  return libtextclassifier2::CreateRegexModel(
      _fbb,
      patterns ? _fbb.CreateVector<flatbuffers::Offset<libtextclassifier2::RegexModel_::Pattern>>(*patterns) : 0);
}

flatbuffers::Offset<RegexModel> CreateRegexModel(flatbuffers::FlatBufferBuilder &_fbb, const RegexModelT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

namespace DatetimeModelPattern_ {

struct RegexT : public flatbuffers::NativeTable {
  typedef Regex TableType;
  std::string pattern;
  std::vector<libtextclassifier2::DatetimeGroupType> groups;
  std::unique_ptr<libtextclassifier2::CompressedBufferT> compressed_pattern;
  RegexT() {
  }
};

struct Regex FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef RegexT NativeTableType;
  enum {
    VT_PATTERN = 4,
    VT_GROUPS = 6,
    VT_COMPRESSED_PATTERN = 8
  };
  const flatbuffers::String *pattern() const {
    return GetPointer<const flatbuffers::String *>(VT_PATTERN);
  }
  const flatbuffers::Vector<int32_t> *groups() const {
    return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_GROUPS);
  }
  const libtextclassifier2::CompressedBuffer *compressed_pattern() const {
    return GetPointer<const libtextclassifier2::CompressedBuffer *>(VT_COMPRESSED_PATTERN);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_PATTERN) &&
           verifier.Verify(pattern()) &&
           VerifyOffset(verifier, VT_GROUPS) &&
           verifier.Verify(groups()) &&
           VerifyOffset(verifier, VT_COMPRESSED_PATTERN) &&
           verifier.VerifyTable(compressed_pattern()) &&
           verifier.EndTable();
  }
  RegexT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(RegexT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<Regex> Pack(flatbuffers::FlatBufferBuilder &_fbb, const RegexT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct RegexBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_pattern(flatbuffers::Offset<flatbuffers::String> pattern) {
    fbb_.AddOffset(Regex::VT_PATTERN, pattern);
  }
  void add_groups(flatbuffers::Offset<flatbuffers::Vector<int32_t>> groups) {
    fbb_.AddOffset(Regex::VT_GROUPS, groups);
  }
  void add_compressed_pattern(flatbuffers::Offset<libtextclassifier2::CompressedBuffer> compressed_pattern) {
    fbb_.AddOffset(Regex::VT_COMPRESSED_PATTERN, compressed_pattern);
  }
  explicit RegexBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  RegexBuilder &operator=(const RegexBuilder &);
  flatbuffers::Offset<Regex> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<Regex>(end);
    return o;
  }
};

inline flatbuffers::Offset<Regex> CreateRegex(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::String> pattern = 0,
    flatbuffers::Offset<flatbuffers::Vector<int32_t>> groups = 0,
    flatbuffers::Offset<libtextclassifier2::CompressedBuffer> compressed_pattern = 0) {
  RegexBuilder builder_(_fbb);
  builder_.add_compressed_pattern(compressed_pattern);
  builder_.add_groups(groups);
  builder_.add_pattern(pattern);
  return builder_.Finish();
}

inline flatbuffers::Offset<Regex> CreateRegexDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const char *pattern = nullptr,
    const std::vector<int32_t> *groups = nullptr,
    flatbuffers::Offset<libtextclassifier2::CompressedBuffer> compressed_pattern = 0) {
  return libtextclassifier2::DatetimeModelPattern_::CreateRegex(
      _fbb,
      pattern ? _fbb.CreateString(pattern) : 0,
      groups ? _fbb.CreateVector<int32_t>(*groups) : 0,
      compressed_pattern);
}

flatbuffers::Offset<Regex> CreateRegex(flatbuffers::FlatBufferBuilder &_fbb, const RegexT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

}  // namespace DatetimeModelPattern_

struct DatetimeModelPatternT : public flatbuffers::NativeTable {
  typedef DatetimeModelPattern TableType;
  std::vector<std::unique_ptr<libtextclassifier2::DatetimeModelPattern_::RegexT>> regexes;
  std::vector<int32_t> locales;
  float target_classification_score;
  float priority_score;
  ModeFlag enabled_modes;
  DatetimeModelPatternT()
      : target_classification_score(1.0f),
        priority_score(0.0f),
        enabled_modes(ModeFlag_ALL) {
  }
};

struct DatetimeModelPattern FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef DatetimeModelPatternT NativeTableType;
  enum {
    VT_REGEXES = 4,
    VT_LOCALES = 6,
    VT_TARGET_CLASSIFICATION_SCORE = 8,
    VT_PRIORITY_SCORE = 10,
    VT_ENABLED_MODES = 12
  };
  const flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::DatetimeModelPattern_::Regex>> *regexes() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::DatetimeModelPattern_::Regex>> *>(VT_REGEXES);
  }
  const flatbuffers::Vector<int32_t> *locales() const {
    return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_LOCALES);
  }
  float target_classification_score() const {
    return GetField<float>(VT_TARGET_CLASSIFICATION_SCORE, 1.0f);
  }
  float priority_score() const {
    return GetField<float>(VT_PRIORITY_SCORE, 0.0f);
  }
  ModeFlag enabled_modes() const {
    return static_cast<ModeFlag>(GetField<int32_t>(VT_ENABLED_MODES, 7));
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_REGEXES) &&
           verifier.Verify(regexes()) &&
           verifier.VerifyVectorOfTables(regexes()) &&
           VerifyOffset(verifier, VT_LOCALES) &&
           verifier.Verify(locales()) &&
           VerifyField<float>(verifier, VT_TARGET_CLASSIFICATION_SCORE) &&
           VerifyField<float>(verifier, VT_PRIORITY_SCORE) &&
           VerifyField<int32_t>(verifier, VT_ENABLED_MODES) &&
           verifier.EndTable();
  }
  DatetimeModelPatternT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(DatetimeModelPatternT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<DatetimeModelPattern> Pack(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelPatternT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct DatetimeModelPatternBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_regexes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::DatetimeModelPattern_::Regex>>> regexes) {
    fbb_.AddOffset(DatetimeModelPattern::VT_REGEXES, regexes);
  }
  void add_locales(flatbuffers::Offset<flatbuffers::Vector<int32_t>> locales) {
    fbb_.AddOffset(DatetimeModelPattern::VT_LOCALES, locales);
  }
  void add_target_classification_score(float target_classification_score) {
    fbb_.AddElement<float>(DatetimeModelPattern::VT_TARGET_CLASSIFICATION_SCORE, target_classification_score, 1.0f);
  }
  void add_priority_score(float priority_score) {
    fbb_.AddElement<float>(DatetimeModelPattern::VT_PRIORITY_SCORE, priority_score, 0.0f);
  }
  void add_enabled_modes(ModeFlag enabled_modes) {
    fbb_.AddElement<int32_t>(DatetimeModelPattern::VT_ENABLED_MODES, static_cast<int32_t>(enabled_modes), 7);
  }
  explicit DatetimeModelPatternBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  DatetimeModelPatternBuilder &operator=(const DatetimeModelPatternBuilder &);
  flatbuffers::Offset<DatetimeModelPattern> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<DatetimeModelPattern>(end);
    return o;
  }
};

inline flatbuffers::Offset<DatetimeModelPattern> CreateDatetimeModelPattern(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::DatetimeModelPattern_::Regex>>> regexes = 0,
    flatbuffers::Offset<flatbuffers::Vector<int32_t>> locales = 0,
    float target_classification_score = 1.0f,
    float priority_score = 0.0f,
    ModeFlag enabled_modes = ModeFlag_ALL) {
  DatetimeModelPatternBuilder builder_(_fbb);
  builder_.add_enabled_modes(enabled_modes);
  builder_.add_priority_score(priority_score);
  builder_.add_target_classification_score(target_classification_score);
  builder_.add_locales(locales);
  builder_.add_regexes(regexes);
  return builder_.Finish();
}

inline flatbuffers::Offset<DatetimeModelPattern> CreateDatetimeModelPatternDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const std::vector<flatbuffers::Offset<libtextclassifier2::DatetimeModelPattern_::Regex>> *regexes = nullptr,
    const std::vector<int32_t> *locales = nullptr,
    float target_classification_score = 1.0f,
    float priority_score = 0.0f,
    ModeFlag enabled_modes = ModeFlag_ALL) {
  return libtextclassifier2::CreateDatetimeModelPattern(
      _fbb,
      regexes ? _fbb.CreateVector<flatbuffers::Offset<libtextclassifier2::DatetimeModelPattern_::Regex>>(*regexes) : 0,
      locales ? _fbb.CreateVector<int32_t>(*locales) : 0,
      target_classification_score,
      priority_score,
      enabled_modes);
}

flatbuffers::Offset<DatetimeModelPattern> CreateDatetimeModelPattern(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelPatternT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct DatetimeModelExtractorT : public flatbuffers::NativeTable {
  typedef DatetimeModelExtractor TableType;
  DatetimeExtractorType extractor;
  std::string pattern;
  std::vector<int32_t> locales;
  std::unique_ptr<CompressedBufferT> compressed_pattern;
  DatetimeModelExtractorT()
      : extractor(DatetimeExtractorType_UNKNOWN_DATETIME_EXTRACTOR_TYPE) {
  }
};

struct DatetimeModelExtractor FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef DatetimeModelExtractorT NativeTableType;
  enum {
    VT_EXTRACTOR = 4,
    VT_PATTERN = 6,
    VT_LOCALES = 8,
    VT_COMPRESSED_PATTERN = 10
  };
  DatetimeExtractorType extractor() const {
    return static_cast<DatetimeExtractorType>(GetField<int32_t>(VT_EXTRACTOR, 0));
  }
  const flatbuffers::String *pattern() const {
    return GetPointer<const flatbuffers::String *>(VT_PATTERN);
  }
  const flatbuffers::Vector<int32_t> *locales() const {
    return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_LOCALES);
  }
  const CompressedBuffer *compressed_pattern() const {
    return GetPointer<const CompressedBuffer *>(VT_COMPRESSED_PATTERN);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<int32_t>(verifier, VT_EXTRACTOR) &&
           VerifyOffset(verifier, VT_PATTERN) &&
           verifier.Verify(pattern()) &&
           VerifyOffset(verifier, VT_LOCALES) &&
           verifier.Verify(locales()) &&
           VerifyOffset(verifier, VT_COMPRESSED_PATTERN) &&
           verifier.VerifyTable(compressed_pattern()) &&
           verifier.EndTable();
  }
  DatetimeModelExtractorT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(DatetimeModelExtractorT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<DatetimeModelExtractor> Pack(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelExtractorT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct DatetimeModelExtractorBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_extractor(DatetimeExtractorType extractor) {
    fbb_.AddElement<int32_t>(DatetimeModelExtractor::VT_EXTRACTOR, static_cast<int32_t>(extractor), 0);
  }
  void add_pattern(flatbuffers::Offset<flatbuffers::String> pattern) {
    fbb_.AddOffset(DatetimeModelExtractor::VT_PATTERN, pattern);
  }
  void add_locales(flatbuffers::Offset<flatbuffers::Vector<int32_t>> locales) {
    fbb_.AddOffset(DatetimeModelExtractor::VT_LOCALES, locales);
  }
  void add_compressed_pattern(flatbuffers::Offset<CompressedBuffer> compressed_pattern) {
    fbb_.AddOffset(DatetimeModelExtractor::VT_COMPRESSED_PATTERN, compressed_pattern);
  }
  explicit DatetimeModelExtractorBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  DatetimeModelExtractorBuilder &operator=(const DatetimeModelExtractorBuilder &);
  flatbuffers::Offset<DatetimeModelExtractor> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<DatetimeModelExtractor>(end);
    return o;
  }
};

inline flatbuffers::Offset<DatetimeModelExtractor> CreateDatetimeModelExtractor(
    flatbuffers::FlatBufferBuilder &_fbb,
    DatetimeExtractorType extractor = DatetimeExtractorType_UNKNOWN_DATETIME_EXTRACTOR_TYPE,
    flatbuffers::Offset<flatbuffers::String> pattern = 0,
    flatbuffers::Offset<flatbuffers::Vector<int32_t>> locales = 0,
    flatbuffers::Offset<CompressedBuffer> compressed_pattern = 0) {
  DatetimeModelExtractorBuilder builder_(_fbb);
  builder_.add_compressed_pattern(compressed_pattern);
  builder_.add_locales(locales);
  builder_.add_pattern(pattern);
  builder_.add_extractor(extractor);
  return builder_.Finish();
}

inline flatbuffers::Offset<DatetimeModelExtractor> CreateDatetimeModelExtractorDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    DatetimeExtractorType extractor = DatetimeExtractorType_UNKNOWN_DATETIME_EXTRACTOR_TYPE,
    const char *pattern = nullptr,
    const std::vector<int32_t> *locales = nullptr,
    flatbuffers::Offset<CompressedBuffer> compressed_pattern = 0) {
  return libtextclassifier2::CreateDatetimeModelExtractor(
      _fbb,
      extractor,
      pattern ? _fbb.CreateString(pattern) : 0,
      locales ? _fbb.CreateVector<int32_t>(*locales) : 0,
      compressed_pattern);
}

flatbuffers::Offset<DatetimeModelExtractor> CreateDatetimeModelExtractor(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelExtractorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct DatetimeModelT : public flatbuffers::NativeTable {
  typedef DatetimeModel TableType;
  std::vector<std::string> locales;
  std::vector<std::unique_ptr<DatetimeModelPatternT>> patterns;
  std::vector<std::unique_ptr<DatetimeModelExtractorT>> extractors;
  bool use_extractors_for_locating;
  std::vector<int32_t> default_locales;
  DatetimeModelT()
      : use_extractors_for_locating(true) {
  }
};

struct DatetimeModel FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef DatetimeModelT NativeTableType;
  enum {
    VT_LOCALES = 4,
    VT_PATTERNS = 6,
    VT_EXTRACTORS = 8,
    VT_USE_EXTRACTORS_FOR_LOCATING = 10,
    VT_DEFAULT_LOCALES = 12
  };
  const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *locales() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_LOCALES);
  }
  const flatbuffers::Vector<flatbuffers::Offset<DatetimeModelPattern>> *patterns() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<DatetimeModelPattern>> *>(VT_PATTERNS);
  }
  const flatbuffers::Vector<flatbuffers::Offset<DatetimeModelExtractor>> *extractors() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<DatetimeModelExtractor>> *>(VT_EXTRACTORS);
  }
  bool use_extractors_for_locating() const {
    return GetField<uint8_t>(VT_USE_EXTRACTORS_FOR_LOCATING, 1) != 0;
  }
  const flatbuffers::Vector<int32_t> *default_locales() const {
    return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_DEFAULT_LOCALES);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_LOCALES) &&
           verifier.Verify(locales()) &&
           verifier.VerifyVectorOfStrings(locales()) &&
           VerifyOffset(verifier, VT_PATTERNS) &&
           verifier.Verify(patterns()) &&
           verifier.VerifyVectorOfTables(patterns()) &&
           VerifyOffset(verifier, VT_EXTRACTORS) &&
           verifier.Verify(extractors()) &&
           verifier.VerifyVectorOfTables(extractors()) &&
           VerifyField<uint8_t>(verifier, VT_USE_EXTRACTORS_FOR_LOCATING) &&
           VerifyOffset(verifier, VT_DEFAULT_LOCALES) &&
           verifier.Verify(default_locales()) &&
           verifier.EndTable();
  }
  DatetimeModelT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(DatetimeModelT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<DatetimeModel> Pack(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct DatetimeModelBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_locales(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> locales) {
    fbb_.AddOffset(DatetimeModel::VT_LOCALES, locales);
  }
  void add_patterns(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<DatetimeModelPattern>>> patterns) {
    fbb_.AddOffset(DatetimeModel::VT_PATTERNS, patterns);
  }
  void add_extractors(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<DatetimeModelExtractor>>> extractors) {
    fbb_.AddOffset(DatetimeModel::VT_EXTRACTORS, extractors);
  }
  void add_use_extractors_for_locating(bool use_extractors_for_locating) {
    fbb_.AddElement<uint8_t>(DatetimeModel::VT_USE_EXTRACTORS_FOR_LOCATING, static_cast<uint8_t>(use_extractors_for_locating), 1);
  }
  void add_default_locales(flatbuffers::Offset<flatbuffers::Vector<int32_t>> default_locales) {
    fbb_.AddOffset(DatetimeModel::VT_DEFAULT_LOCALES, default_locales);
  }
  explicit DatetimeModelBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  DatetimeModelBuilder &operator=(const DatetimeModelBuilder &);
  flatbuffers::Offset<DatetimeModel> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<DatetimeModel>(end);
    return o;
  }
};

inline flatbuffers::Offset<DatetimeModel> CreateDatetimeModel(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> locales = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<DatetimeModelPattern>>> patterns = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<DatetimeModelExtractor>>> extractors = 0,
    bool use_extractors_for_locating = true,
    flatbuffers::Offset<flatbuffers::Vector<int32_t>> default_locales = 0) {
  DatetimeModelBuilder builder_(_fbb);
  builder_.add_default_locales(default_locales);
  builder_.add_extractors(extractors);
  builder_.add_patterns(patterns);
  builder_.add_locales(locales);
  builder_.add_use_extractors_for_locating(use_extractors_for_locating);
  return builder_.Finish();
}

inline flatbuffers::Offset<DatetimeModel> CreateDatetimeModelDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const std::vector<flatbuffers::Offset<flatbuffers::String>> *locales = nullptr,
    const std::vector<flatbuffers::Offset<DatetimeModelPattern>> *patterns = nullptr,
    const std::vector<flatbuffers::Offset<DatetimeModelExtractor>> *extractors = nullptr,
    bool use_extractors_for_locating = true,
    const std::vector<int32_t> *default_locales = nullptr) {
  return libtextclassifier2::CreateDatetimeModel(
      _fbb,
      locales ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*locales) : 0,
      patterns ? _fbb.CreateVector<flatbuffers::Offset<DatetimeModelPattern>>(*patterns) : 0,
      extractors ? _fbb.CreateVector<flatbuffers::Offset<DatetimeModelExtractor>>(*extractors) : 0,
      use_extractors_for_locating,
      default_locales ? _fbb.CreateVector<int32_t>(*default_locales) : 0);
}

flatbuffers::Offset<DatetimeModel> CreateDatetimeModel(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

namespace DatetimeModelLibrary_ {

struct ItemT : public flatbuffers::NativeTable {
  typedef Item TableType;
  std::string key;
  std::unique_ptr<libtextclassifier2::DatetimeModelT> value;
  ItemT() {
  }
};

struct Item FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef ItemT NativeTableType;
  enum {
    VT_KEY = 4,
    VT_VALUE = 6
  };
  const flatbuffers::String *key() const {
    return GetPointer<const flatbuffers::String *>(VT_KEY);
  }
  const libtextclassifier2::DatetimeModel *value() const {
    return GetPointer<const libtextclassifier2::DatetimeModel *>(VT_VALUE);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_KEY) &&
           verifier.Verify(key()) &&
           VerifyOffset(verifier, VT_VALUE) &&
           verifier.VerifyTable(value()) &&
           verifier.EndTable();
  }
  ItemT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(ItemT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<Item> Pack(flatbuffers::FlatBufferBuilder &_fbb, const ItemT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct ItemBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_key(flatbuffers::Offset<flatbuffers::String> key) {
    fbb_.AddOffset(Item::VT_KEY, key);
  }
  void add_value(flatbuffers::Offset<libtextclassifier2::DatetimeModel> value) {
    fbb_.AddOffset(Item::VT_VALUE, value);
  }
  explicit ItemBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  ItemBuilder &operator=(const ItemBuilder &);
  flatbuffers::Offset<Item> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<Item>(end);
    return o;
  }
};

inline flatbuffers::Offset<Item> CreateItem(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::String> key = 0,
    flatbuffers::Offset<libtextclassifier2::DatetimeModel> value = 0) {
  ItemBuilder builder_(_fbb);
  builder_.add_value(value);
  builder_.add_key(key);
  return builder_.Finish();
}

inline flatbuffers::Offset<Item> CreateItemDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const char *key = nullptr,
    flatbuffers::Offset<libtextclassifier2::DatetimeModel> value = 0) {
  return libtextclassifier2::DatetimeModelLibrary_::CreateItem(
      _fbb,
      key ? _fbb.CreateString(key) : 0,
      value);
}

flatbuffers::Offset<Item> CreateItem(flatbuffers::FlatBufferBuilder &_fbb, const ItemT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

}  // namespace DatetimeModelLibrary_

struct DatetimeModelLibraryT : public flatbuffers::NativeTable {
  typedef DatetimeModelLibrary TableType;
  std::vector<std::unique_ptr<libtextclassifier2::DatetimeModelLibrary_::ItemT>> models;
  DatetimeModelLibraryT() {
  }
};

struct DatetimeModelLibrary FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef DatetimeModelLibraryT NativeTableType;
  enum {
    VT_MODELS = 4
  };
  const flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::DatetimeModelLibrary_::Item>> *models() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::DatetimeModelLibrary_::Item>> *>(VT_MODELS);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_MODELS) &&
           verifier.Verify(models()) &&
           verifier.VerifyVectorOfTables(models()) &&
           verifier.EndTable();
  }
  DatetimeModelLibraryT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(DatetimeModelLibraryT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<DatetimeModelLibrary> Pack(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelLibraryT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct DatetimeModelLibraryBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_models(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::DatetimeModelLibrary_::Item>>> models) {
    fbb_.AddOffset(DatetimeModelLibrary::VT_MODELS, models);
  }
  explicit DatetimeModelLibraryBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  DatetimeModelLibraryBuilder &operator=(const DatetimeModelLibraryBuilder &);
  flatbuffers::Offset<DatetimeModelLibrary> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<DatetimeModelLibrary>(end);
    return o;
  }
};

inline flatbuffers::Offset<DatetimeModelLibrary> CreateDatetimeModelLibrary(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::DatetimeModelLibrary_::Item>>> models = 0) {
  DatetimeModelLibraryBuilder builder_(_fbb);
  builder_.add_models(models);
  return builder_.Finish();
}

inline flatbuffers::Offset<DatetimeModelLibrary> CreateDatetimeModelLibraryDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const std::vector<flatbuffers::Offset<libtextclassifier2::DatetimeModelLibrary_::Item>> *models = nullptr) {
  return libtextclassifier2::CreateDatetimeModelLibrary(
      _fbb,
      models ? _fbb.CreateVector<flatbuffers::Offset<libtextclassifier2::DatetimeModelLibrary_::Item>>(*models) : 0);
}

flatbuffers::Offset<DatetimeModelLibrary> CreateDatetimeModelLibrary(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelLibraryT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct ModelTriggeringOptionsT : public flatbuffers::NativeTable {
  typedef ModelTriggeringOptions TableType;
  float min_annotate_confidence;
  ModeFlag enabled_modes;
  ModelTriggeringOptionsT()
      : min_annotate_confidence(0.0f),
        enabled_modes(ModeFlag_ALL) {
  }
};

struct ModelTriggeringOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef ModelTriggeringOptionsT NativeTableType;
  enum {
    VT_MIN_ANNOTATE_CONFIDENCE = 4,
    VT_ENABLED_MODES = 6
  };
  float min_annotate_confidence() const {
    return GetField<float>(VT_MIN_ANNOTATE_CONFIDENCE, 0.0f);
  }
  ModeFlag enabled_modes() const {
    return static_cast<ModeFlag>(GetField<int32_t>(VT_ENABLED_MODES, 7));
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<float>(verifier, VT_MIN_ANNOTATE_CONFIDENCE) &&
           VerifyField<int32_t>(verifier, VT_ENABLED_MODES) &&
           verifier.EndTable();
  }
  ModelTriggeringOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(ModelTriggeringOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<ModelTriggeringOptions> Pack(flatbuffers::FlatBufferBuilder &_fbb, const ModelTriggeringOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct ModelTriggeringOptionsBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_min_annotate_confidence(float min_annotate_confidence) {
    fbb_.AddElement<float>(ModelTriggeringOptions::VT_MIN_ANNOTATE_CONFIDENCE, min_annotate_confidence, 0.0f);
  }
  void add_enabled_modes(ModeFlag enabled_modes) {
    fbb_.AddElement<int32_t>(ModelTriggeringOptions::VT_ENABLED_MODES, static_cast<int32_t>(enabled_modes), 7);
  }
  explicit ModelTriggeringOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  ModelTriggeringOptionsBuilder &operator=(const ModelTriggeringOptionsBuilder &);
  flatbuffers::Offset<ModelTriggeringOptions> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<ModelTriggeringOptions>(end);
    return o;
  }
};

inline flatbuffers::Offset<ModelTriggeringOptions> CreateModelTriggeringOptions(
    flatbuffers::FlatBufferBuilder &_fbb,
    float min_annotate_confidence = 0.0f,
    ModeFlag enabled_modes = ModeFlag_ALL) {
  ModelTriggeringOptionsBuilder builder_(_fbb);
  builder_.add_enabled_modes(enabled_modes);
  builder_.add_min_annotate_confidence(min_annotate_confidence);
  return builder_.Finish();
}

flatbuffers::Offset<ModelTriggeringOptions> CreateModelTriggeringOptions(flatbuffers::FlatBufferBuilder &_fbb, const ModelTriggeringOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct OutputOptionsT : public flatbuffers::NativeTable {
  typedef OutputOptions TableType;
  std::vector<std::string> filtered_collections_annotation;
  std::vector<std::string> filtered_collections_classification;
  std::vector<std::string> filtered_collections_selection;
  OutputOptionsT() {
  }
};

struct OutputOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef OutputOptionsT NativeTableType;
  enum {
    VT_FILTERED_COLLECTIONS_ANNOTATION = 4,
    VT_FILTERED_COLLECTIONS_CLASSIFICATION = 6,
    VT_FILTERED_COLLECTIONS_SELECTION = 8
  };
  const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *filtered_collections_annotation() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_FILTERED_COLLECTIONS_ANNOTATION);
  }
  const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *filtered_collections_classification() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_FILTERED_COLLECTIONS_CLASSIFICATION);
  }
  const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *filtered_collections_selection() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_FILTERED_COLLECTIONS_SELECTION);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_FILTERED_COLLECTIONS_ANNOTATION) &&
           verifier.Verify(filtered_collections_annotation()) &&
           verifier.VerifyVectorOfStrings(filtered_collections_annotation()) &&
           VerifyOffset(verifier, VT_FILTERED_COLLECTIONS_CLASSIFICATION) &&
           verifier.Verify(filtered_collections_classification()) &&
           verifier.VerifyVectorOfStrings(filtered_collections_classification()) &&
           VerifyOffset(verifier, VT_FILTERED_COLLECTIONS_SELECTION) &&
           verifier.Verify(filtered_collections_selection()) &&
           verifier.VerifyVectorOfStrings(filtered_collections_selection()) &&
           verifier.EndTable();
  }
  OutputOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(OutputOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<OutputOptions> Pack(flatbuffers::FlatBufferBuilder &_fbb, const OutputOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct OutputOptionsBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_filtered_collections_annotation(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> filtered_collections_annotation) {
    fbb_.AddOffset(OutputOptions::VT_FILTERED_COLLECTIONS_ANNOTATION, filtered_collections_annotation);
  }
  void add_filtered_collections_classification(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> filtered_collections_classification) {
    fbb_.AddOffset(OutputOptions::VT_FILTERED_COLLECTIONS_CLASSIFICATION, filtered_collections_classification);
  }
  void add_filtered_collections_selection(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> filtered_collections_selection) {
    fbb_.AddOffset(OutputOptions::VT_FILTERED_COLLECTIONS_SELECTION, filtered_collections_selection);
  }
  explicit OutputOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  OutputOptionsBuilder &operator=(const OutputOptionsBuilder &);
  flatbuffers::Offset<OutputOptions> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<OutputOptions>(end);
    return o;
  }
};

inline flatbuffers::Offset<OutputOptions> CreateOutputOptions(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> filtered_collections_annotation = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> filtered_collections_classification = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> filtered_collections_selection = 0) {
  OutputOptionsBuilder builder_(_fbb);
  builder_.add_filtered_collections_selection(filtered_collections_selection);
  builder_.add_filtered_collections_classification(filtered_collections_classification);
  builder_.add_filtered_collections_annotation(filtered_collections_annotation);
  return builder_.Finish();
}

inline flatbuffers::Offset<OutputOptions> CreateOutputOptionsDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const std::vector<flatbuffers::Offset<flatbuffers::String>> *filtered_collections_annotation = nullptr,
    const std::vector<flatbuffers::Offset<flatbuffers::String>> *filtered_collections_classification = nullptr,
    const std::vector<flatbuffers::Offset<flatbuffers::String>> *filtered_collections_selection = nullptr) {
  return libtextclassifier2::CreateOutputOptions(
      _fbb,
      filtered_collections_annotation ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*filtered_collections_annotation) : 0,
      filtered_collections_classification ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*filtered_collections_classification) : 0,
      filtered_collections_selection ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*filtered_collections_selection) : 0);
}

flatbuffers::Offset<OutputOptions> CreateOutputOptions(flatbuffers::FlatBufferBuilder &_fbb, const OutputOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct ModelT : public flatbuffers::NativeTable {
  typedef Model TableType;
  std::string locales;
  int32_t version;
  std::string name;
  std::unique_ptr<FeatureProcessorOptionsT> selection_feature_options;
  std::unique_ptr<FeatureProcessorOptionsT> classification_feature_options;
  std::vector<uint8_t> selection_model;
  std::vector<uint8_t> classification_model;
  std::vector<uint8_t> embedding_model;
  std::unique_ptr<SelectionModelOptionsT> selection_options;
  std::unique_ptr<ClassificationModelOptionsT> classification_options;
  std::unique_ptr<RegexModelT> regex_model;
  std::unique_ptr<DatetimeModelT> datetime_model;
  std::unique_ptr<ModelTriggeringOptionsT> triggering_options;
  ModeFlag enabled_modes;
  bool snap_whitespace_selections;
  std::unique_ptr<OutputOptionsT> output_options;
  ModelT()
      : version(0),
        enabled_modes(ModeFlag_ALL),
        snap_whitespace_selections(true) {
  }
};

struct Model FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef ModelT NativeTableType;
  enum {
    VT_LOCALES = 4,
    VT_VERSION = 6,
    VT_NAME = 8,
    VT_SELECTION_FEATURE_OPTIONS = 10,
    VT_CLASSIFICATION_FEATURE_OPTIONS = 12,
    VT_SELECTION_MODEL = 14,
    VT_CLASSIFICATION_MODEL = 16,
    VT_EMBEDDING_MODEL = 18,
    VT_SELECTION_OPTIONS = 20,
    VT_CLASSIFICATION_OPTIONS = 22,
    VT_REGEX_MODEL = 24,
    VT_DATETIME_MODEL = 26,
    VT_TRIGGERING_OPTIONS = 28,
    VT_ENABLED_MODES = 30,
    VT_SNAP_WHITESPACE_SELECTIONS = 32,
    VT_OUTPUT_OPTIONS = 34
  };
  const flatbuffers::String *locales() const {
    return GetPointer<const flatbuffers::String *>(VT_LOCALES);
  }
  int32_t version() const {
    return GetField<int32_t>(VT_VERSION, 0);
  }
  const flatbuffers::String *name() const {
    return GetPointer<const flatbuffers::String *>(VT_NAME);
  }
  const FeatureProcessorOptions *selection_feature_options() const {
    return GetPointer<const FeatureProcessorOptions *>(VT_SELECTION_FEATURE_OPTIONS);
  }
  const FeatureProcessorOptions *classification_feature_options() const {
    return GetPointer<const FeatureProcessorOptions *>(VT_CLASSIFICATION_FEATURE_OPTIONS);
  }
  const flatbuffers::Vector<uint8_t> *selection_model() const {
    return GetPointer<const flatbuffers::Vector<uint8_t> *>(VT_SELECTION_MODEL);
  }
  const flatbuffers::Vector<uint8_t> *classification_model() const {
    return GetPointer<const flatbuffers::Vector<uint8_t> *>(VT_CLASSIFICATION_MODEL);
  }
  const flatbuffers::Vector<uint8_t> *embedding_model() const {
    return GetPointer<const flatbuffers::Vector<uint8_t> *>(VT_EMBEDDING_MODEL);
  }
  const SelectionModelOptions *selection_options() const {
    return GetPointer<const SelectionModelOptions *>(VT_SELECTION_OPTIONS);
  }
  const ClassificationModelOptions *classification_options() const {
    return GetPointer<const ClassificationModelOptions *>(VT_CLASSIFICATION_OPTIONS);
  }
  const RegexModel *regex_model() const {
    return GetPointer<const RegexModel *>(VT_REGEX_MODEL);
  }
  const DatetimeModel *datetime_model() const {
    return GetPointer<const DatetimeModel *>(VT_DATETIME_MODEL);
  }
  const ModelTriggeringOptions *triggering_options() const {
    return GetPointer<const ModelTriggeringOptions *>(VT_TRIGGERING_OPTIONS);
  }
  ModeFlag enabled_modes() const {
    return static_cast<ModeFlag>(GetField<int32_t>(VT_ENABLED_MODES, 7));
  }
  bool snap_whitespace_selections() const {
    return GetField<uint8_t>(VT_SNAP_WHITESPACE_SELECTIONS, 1) != 0;
  }
  const OutputOptions *output_options() const {
    return GetPointer<const OutputOptions *>(VT_OUTPUT_OPTIONS);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_LOCALES) &&
           verifier.Verify(locales()) &&
           VerifyField<int32_t>(verifier, VT_VERSION) &&
           VerifyOffset(verifier, VT_NAME) &&
           verifier.Verify(name()) &&
           VerifyOffset(verifier, VT_SELECTION_FEATURE_OPTIONS) &&
           verifier.VerifyTable(selection_feature_options()) &&
           VerifyOffset(verifier, VT_CLASSIFICATION_FEATURE_OPTIONS) &&
           verifier.VerifyTable(classification_feature_options()) &&
           VerifyOffset(verifier, VT_SELECTION_MODEL) &&
           verifier.Verify(selection_model()) &&
           VerifyOffset(verifier, VT_CLASSIFICATION_MODEL) &&
           verifier.Verify(classification_model()) &&
           VerifyOffset(verifier, VT_EMBEDDING_MODEL) &&
           verifier.Verify(embedding_model()) &&
           VerifyOffset(verifier, VT_SELECTION_OPTIONS) &&
           verifier.VerifyTable(selection_options()) &&
           VerifyOffset(verifier, VT_CLASSIFICATION_OPTIONS) &&
           verifier.VerifyTable(classification_options()) &&
           VerifyOffset(verifier, VT_REGEX_MODEL) &&
           verifier.VerifyTable(regex_model()) &&
           VerifyOffset(verifier, VT_DATETIME_MODEL) &&
           verifier.VerifyTable(datetime_model()) &&
           VerifyOffset(verifier, VT_TRIGGERING_OPTIONS) &&
           verifier.VerifyTable(triggering_options()) &&
           VerifyField<int32_t>(verifier, VT_ENABLED_MODES) &&
           VerifyField<uint8_t>(verifier, VT_SNAP_WHITESPACE_SELECTIONS) &&
           VerifyOffset(verifier, VT_OUTPUT_OPTIONS) &&
           verifier.VerifyTable(output_options()) &&
           verifier.EndTable();
  }
  ModelT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(ModelT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<Model> Pack(flatbuffers::FlatBufferBuilder &_fbb, const ModelT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct ModelBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_locales(flatbuffers::Offset<flatbuffers::String> locales) {
    fbb_.AddOffset(Model::VT_LOCALES, locales);
  }
  void add_version(int32_t version) {
    fbb_.AddElement<int32_t>(Model::VT_VERSION, version, 0);
  }
  void add_name(flatbuffers::Offset<flatbuffers::String> name) {
    fbb_.AddOffset(Model::VT_NAME, name);
  }
  void add_selection_feature_options(flatbuffers::Offset<FeatureProcessorOptions> selection_feature_options) {
    fbb_.AddOffset(Model::VT_SELECTION_FEATURE_OPTIONS, selection_feature_options);
  }
  void add_classification_feature_options(flatbuffers::Offset<FeatureProcessorOptions> classification_feature_options) {
    fbb_.AddOffset(Model::VT_CLASSIFICATION_FEATURE_OPTIONS, classification_feature_options);
  }
  void add_selection_model(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> selection_model) {
    fbb_.AddOffset(Model::VT_SELECTION_MODEL, selection_model);
  }
  void add_classification_model(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> classification_model) {
    fbb_.AddOffset(Model::VT_CLASSIFICATION_MODEL, classification_model);
  }
  void add_embedding_model(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> embedding_model) {
    fbb_.AddOffset(Model::VT_EMBEDDING_MODEL, embedding_model);
  }
  void add_selection_options(flatbuffers::Offset<SelectionModelOptions> selection_options) {
    fbb_.AddOffset(Model::VT_SELECTION_OPTIONS, selection_options);
  }
  void add_classification_options(flatbuffers::Offset<ClassificationModelOptions> classification_options) {
    fbb_.AddOffset(Model::VT_CLASSIFICATION_OPTIONS, classification_options);
  }
  void add_regex_model(flatbuffers::Offset<RegexModel> regex_model) {
    fbb_.AddOffset(Model::VT_REGEX_MODEL, regex_model);
  }
  void add_datetime_model(flatbuffers::Offset<DatetimeModel> datetime_model) {
    fbb_.AddOffset(Model::VT_DATETIME_MODEL, datetime_model);
  }
  void add_triggering_options(flatbuffers::Offset<ModelTriggeringOptions> triggering_options) {
    fbb_.AddOffset(Model::VT_TRIGGERING_OPTIONS, triggering_options);
  }
  void add_enabled_modes(ModeFlag enabled_modes) {
    fbb_.AddElement<int32_t>(Model::VT_ENABLED_MODES, static_cast<int32_t>(enabled_modes), 7);
  }
  void add_snap_whitespace_selections(bool snap_whitespace_selections) {
    fbb_.AddElement<uint8_t>(Model::VT_SNAP_WHITESPACE_SELECTIONS, static_cast<uint8_t>(snap_whitespace_selections), 1);
  }
  void add_output_options(flatbuffers::Offset<OutputOptions> output_options) {
    fbb_.AddOffset(Model::VT_OUTPUT_OPTIONS, output_options);
  }
  explicit ModelBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  ModelBuilder &operator=(const ModelBuilder &);
  flatbuffers::Offset<Model> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<Model>(end);
    return o;
  }
};

inline flatbuffers::Offset<Model> CreateModel(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::String> locales = 0,
    int32_t version = 0,
    flatbuffers::Offset<flatbuffers::String> name = 0,
    flatbuffers::Offset<FeatureProcessorOptions> selection_feature_options = 0,
    flatbuffers::Offset<FeatureProcessorOptions> classification_feature_options = 0,
    flatbuffers::Offset<flatbuffers::Vector<uint8_t>> selection_model = 0,
    flatbuffers::Offset<flatbuffers::Vector<uint8_t>> classification_model = 0,
    flatbuffers::Offset<flatbuffers::Vector<uint8_t>> embedding_model = 0,
    flatbuffers::Offset<SelectionModelOptions> selection_options = 0,
    flatbuffers::Offset<ClassificationModelOptions> classification_options = 0,
    flatbuffers::Offset<RegexModel> regex_model = 0,
    flatbuffers::Offset<DatetimeModel> datetime_model = 0,
    flatbuffers::Offset<ModelTriggeringOptions> triggering_options = 0,
    ModeFlag enabled_modes = ModeFlag_ALL,
    bool snap_whitespace_selections = true,
    flatbuffers::Offset<OutputOptions> output_options = 0) {
  ModelBuilder builder_(_fbb);
  builder_.add_output_options(output_options);
  builder_.add_enabled_modes(enabled_modes);
  builder_.add_triggering_options(triggering_options);
  builder_.add_datetime_model(datetime_model);
  builder_.add_regex_model(regex_model);
  builder_.add_classification_options(classification_options);
  builder_.add_selection_options(selection_options);
  builder_.add_embedding_model(embedding_model);
  builder_.add_classification_model(classification_model);
  builder_.add_selection_model(selection_model);
  builder_.add_classification_feature_options(classification_feature_options);
  builder_.add_selection_feature_options(selection_feature_options);
  builder_.add_name(name);
  builder_.add_version(version);
  builder_.add_locales(locales);
  builder_.add_snap_whitespace_selections(snap_whitespace_selections);
  return builder_.Finish();
}

inline flatbuffers::Offset<Model> CreateModelDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const char *locales = nullptr,
    int32_t version = 0,
    const char *name = nullptr,
    flatbuffers::Offset<FeatureProcessorOptions> selection_feature_options = 0,
    flatbuffers::Offset<FeatureProcessorOptions> classification_feature_options = 0,
    const std::vector<uint8_t> *selection_model = nullptr,
    const std::vector<uint8_t> *classification_model = nullptr,
    const std::vector<uint8_t> *embedding_model = nullptr,
    flatbuffers::Offset<SelectionModelOptions> selection_options = 0,
    flatbuffers::Offset<ClassificationModelOptions> classification_options = 0,
    flatbuffers::Offset<RegexModel> regex_model = 0,
    flatbuffers::Offset<DatetimeModel> datetime_model = 0,
    flatbuffers::Offset<ModelTriggeringOptions> triggering_options = 0,
    ModeFlag enabled_modes = ModeFlag_ALL,
    bool snap_whitespace_selections = true,
    flatbuffers::Offset<OutputOptions> output_options = 0) {
  return libtextclassifier2::CreateModel(
      _fbb,
      locales ? _fbb.CreateString(locales) : 0,
      version,
      name ? _fbb.CreateString(name) : 0,
      selection_feature_options,
      classification_feature_options,
      selection_model ? _fbb.CreateVector<uint8_t>(*selection_model) : 0,
      classification_model ? _fbb.CreateVector<uint8_t>(*classification_model) : 0,
      embedding_model ? _fbb.CreateVector<uint8_t>(*embedding_model) : 0,
      selection_options,
      classification_options,
      regex_model,
      datetime_model,
      triggering_options,
      enabled_modes,
      snap_whitespace_selections,
      output_options);
}

flatbuffers::Offset<Model> CreateModel(flatbuffers::FlatBufferBuilder &_fbb, const ModelT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct TokenizationCodepointRangeT : public flatbuffers::NativeTable {
  typedef TokenizationCodepointRange TableType;
  int32_t start;
  int32_t end;
  libtextclassifier2::TokenizationCodepointRange_::Role role;
  int32_t script_id;
  TokenizationCodepointRangeT()
      : start(0),
        end(0),
        role(libtextclassifier2::TokenizationCodepointRange_::Role_DEFAULT_ROLE),
        script_id(0) {
  }
};

struct TokenizationCodepointRange FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef TokenizationCodepointRangeT NativeTableType;
  enum {
    VT_START = 4,
    VT_END = 6,
    VT_ROLE = 8,
    VT_SCRIPT_ID = 10
  };
  int32_t start() const {
    return GetField<int32_t>(VT_START, 0);
  }
  int32_t end() const {
    return GetField<int32_t>(VT_END, 0);
  }
  libtextclassifier2::TokenizationCodepointRange_::Role role() const {
    return static_cast<libtextclassifier2::TokenizationCodepointRange_::Role>(GetField<int32_t>(VT_ROLE, 0));
  }
  int32_t script_id() const {
    return GetField<int32_t>(VT_SCRIPT_ID, 0);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<int32_t>(verifier, VT_START) &&
           VerifyField<int32_t>(verifier, VT_END) &&
           VerifyField<int32_t>(verifier, VT_ROLE) &&
           VerifyField<int32_t>(verifier, VT_SCRIPT_ID) &&
           verifier.EndTable();
  }
  TokenizationCodepointRangeT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(TokenizationCodepointRangeT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<TokenizationCodepointRange> Pack(flatbuffers::FlatBufferBuilder &_fbb, const TokenizationCodepointRangeT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct TokenizationCodepointRangeBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_start(int32_t start) {
    fbb_.AddElement<int32_t>(TokenizationCodepointRange::VT_START, start, 0);
  }
  void add_end(int32_t end) {
    fbb_.AddElement<int32_t>(TokenizationCodepointRange::VT_END, end, 0);
  }
  void add_role(libtextclassifier2::TokenizationCodepointRange_::Role role) {
    fbb_.AddElement<int32_t>(TokenizationCodepointRange::VT_ROLE, static_cast<int32_t>(role), 0);
  }
  void add_script_id(int32_t script_id) {
    fbb_.AddElement<int32_t>(TokenizationCodepointRange::VT_SCRIPT_ID, script_id, 0);
  }
  explicit TokenizationCodepointRangeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  TokenizationCodepointRangeBuilder &operator=(const TokenizationCodepointRangeBuilder &);
  flatbuffers::Offset<TokenizationCodepointRange> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<TokenizationCodepointRange>(end);
    return o;
  }
};

inline flatbuffers::Offset<TokenizationCodepointRange> CreateTokenizationCodepointRange(
    flatbuffers::FlatBufferBuilder &_fbb,
    int32_t start = 0,
    int32_t end = 0,
    libtextclassifier2::TokenizationCodepointRange_::Role role = libtextclassifier2::TokenizationCodepointRange_::Role_DEFAULT_ROLE,
    int32_t script_id = 0) {
  TokenizationCodepointRangeBuilder builder_(_fbb);
  builder_.add_script_id(script_id);
  builder_.add_role(role);
  builder_.add_end(end);
  builder_.add_start(start);
  return builder_.Finish();
}

flatbuffers::Offset<TokenizationCodepointRange> CreateTokenizationCodepointRange(flatbuffers::FlatBufferBuilder &_fbb, const TokenizationCodepointRangeT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

namespace FeatureProcessorOptions_ {

struct CodepointRangeT : public flatbuffers::NativeTable {
  typedef CodepointRange TableType;
  int32_t start;
  int32_t end;
  CodepointRangeT()
      : start(0),
        end(0) {
  }
};

struct CodepointRange FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef CodepointRangeT NativeTableType;
  enum {
    VT_START = 4,
    VT_END = 6
  };
  int32_t start() const {
    return GetField<int32_t>(VT_START, 0);
  }
  int32_t end() const {
    return GetField<int32_t>(VT_END, 0);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<int32_t>(verifier, VT_START) &&
           VerifyField<int32_t>(verifier, VT_END) &&
           verifier.EndTable();
  }
  CodepointRangeT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(CodepointRangeT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<CodepointRange> Pack(flatbuffers::FlatBufferBuilder &_fbb, const CodepointRangeT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct CodepointRangeBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_start(int32_t start) {
    fbb_.AddElement<int32_t>(CodepointRange::VT_START, start, 0);
  }
  void add_end(int32_t end) {
    fbb_.AddElement<int32_t>(CodepointRange::VT_END, end, 0);
  }
  explicit CodepointRangeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  CodepointRangeBuilder &operator=(const CodepointRangeBuilder &);
  flatbuffers::Offset<CodepointRange> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<CodepointRange>(end);
    return o;
  }
};

inline flatbuffers::Offset<CodepointRange> CreateCodepointRange(
    flatbuffers::FlatBufferBuilder &_fbb,
    int32_t start = 0,
    int32_t end = 0) {
  CodepointRangeBuilder builder_(_fbb);
  builder_.add_end(end);
  builder_.add_start(start);
  return builder_.Finish();
}

flatbuffers::Offset<CodepointRange> CreateCodepointRange(flatbuffers::FlatBufferBuilder &_fbb, const CodepointRangeT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct BoundsSensitiveFeaturesT : public flatbuffers::NativeTable {
  typedef BoundsSensitiveFeatures TableType;
  bool enabled;
  int32_t num_tokens_before;
  int32_t num_tokens_inside_left;
  int32_t num_tokens_inside_right;
  int32_t num_tokens_after;
  bool include_inside_bag;
  bool include_inside_length;
  bool score_single_token_spans_as_zero;
  BoundsSensitiveFeaturesT()
      : enabled(false),
        num_tokens_before(0),
        num_tokens_inside_left(0),
        num_tokens_inside_right(0),
        num_tokens_after(0),
        include_inside_bag(false),
        include_inside_length(false),
        score_single_token_spans_as_zero(false) {
  }
};

struct BoundsSensitiveFeatures FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef BoundsSensitiveFeaturesT NativeTableType;
  enum {
    VT_ENABLED = 4,
    VT_NUM_TOKENS_BEFORE = 6,
    VT_NUM_TOKENS_INSIDE_LEFT = 8,
    VT_NUM_TOKENS_INSIDE_RIGHT = 10,
    VT_NUM_TOKENS_AFTER = 12,
    VT_INCLUDE_INSIDE_BAG = 14,
    VT_INCLUDE_INSIDE_LENGTH = 16,
    VT_SCORE_SINGLE_TOKEN_SPANS_AS_ZERO = 18
  };
  bool enabled() const {
    return GetField<uint8_t>(VT_ENABLED, 0) != 0;
  }
  int32_t num_tokens_before() const {
    return GetField<int32_t>(VT_NUM_TOKENS_BEFORE, 0);
  }
  int32_t num_tokens_inside_left() const {
    return GetField<int32_t>(VT_NUM_TOKENS_INSIDE_LEFT, 0);
  }
  int32_t num_tokens_inside_right() const {
    return GetField<int32_t>(VT_NUM_TOKENS_INSIDE_RIGHT, 0);
  }
  int32_t num_tokens_after() const {
    return GetField<int32_t>(VT_NUM_TOKENS_AFTER, 0);
  }
  bool include_inside_bag() const {
    return GetField<uint8_t>(VT_INCLUDE_INSIDE_BAG, 0) != 0;
  }
  bool include_inside_length() const {
    return GetField<uint8_t>(VT_INCLUDE_INSIDE_LENGTH, 0) != 0;
  }
  bool score_single_token_spans_as_zero() const {
    return GetField<uint8_t>(VT_SCORE_SINGLE_TOKEN_SPANS_AS_ZERO, 0) != 0;
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<uint8_t>(verifier, VT_ENABLED) &&
           VerifyField<int32_t>(verifier, VT_NUM_TOKENS_BEFORE) &&
           VerifyField<int32_t>(verifier, VT_NUM_TOKENS_INSIDE_LEFT) &&
           VerifyField<int32_t>(verifier, VT_NUM_TOKENS_INSIDE_RIGHT) &&
           VerifyField<int32_t>(verifier, VT_NUM_TOKENS_AFTER) &&
           VerifyField<uint8_t>(verifier, VT_INCLUDE_INSIDE_BAG) &&
           VerifyField<uint8_t>(verifier, VT_INCLUDE_INSIDE_LENGTH) &&
           VerifyField<uint8_t>(verifier, VT_SCORE_SINGLE_TOKEN_SPANS_AS_ZERO) &&
           verifier.EndTable();
  }
  BoundsSensitiveFeaturesT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(BoundsSensitiveFeaturesT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<BoundsSensitiveFeatures> Pack(flatbuffers::FlatBufferBuilder &_fbb, const BoundsSensitiveFeaturesT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct BoundsSensitiveFeaturesBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_enabled(bool enabled) {
    fbb_.AddElement<uint8_t>(BoundsSensitiveFeatures::VT_ENABLED, static_cast<uint8_t>(enabled), 0);
  }
  void add_num_tokens_before(int32_t num_tokens_before) {
    fbb_.AddElement<int32_t>(BoundsSensitiveFeatures::VT_NUM_TOKENS_BEFORE, num_tokens_before, 0);
  }
  void add_num_tokens_inside_left(int32_t num_tokens_inside_left) {
    fbb_.AddElement<int32_t>(BoundsSensitiveFeatures::VT_NUM_TOKENS_INSIDE_LEFT, num_tokens_inside_left, 0);
  }
  void add_num_tokens_inside_right(int32_t num_tokens_inside_right) {
    fbb_.AddElement<int32_t>(BoundsSensitiveFeatures::VT_NUM_TOKENS_INSIDE_RIGHT, num_tokens_inside_right, 0);
  }
  void add_num_tokens_after(int32_t num_tokens_after) {
    fbb_.AddElement<int32_t>(BoundsSensitiveFeatures::VT_NUM_TOKENS_AFTER, num_tokens_after, 0);
  }
  void add_include_inside_bag(bool include_inside_bag) {
    fbb_.AddElement<uint8_t>(BoundsSensitiveFeatures::VT_INCLUDE_INSIDE_BAG, static_cast<uint8_t>(include_inside_bag), 0);
  }
  void add_include_inside_length(bool include_inside_length) {
    fbb_.AddElement<uint8_t>(BoundsSensitiveFeatures::VT_INCLUDE_INSIDE_LENGTH, static_cast<uint8_t>(include_inside_length), 0);
  }
  void add_score_single_token_spans_as_zero(bool score_single_token_spans_as_zero) {
    fbb_.AddElement<uint8_t>(BoundsSensitiveFeatures::VT_SCORE_SINGLE_TOKEN_SPANS_AS_ZERO, static_cast<uint8_t>(score_single_token_spans_as_zero), 0);
  }
  explicit BoundsSensitiveFeaturesBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  BoundsSensitiveFeaturesBuilder &operator=(const BoundsSensitiveFeaturesBuilder &);
  flatbuffers::Offset<BoundsSensitiveFeatures> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<BoundsSensitiveFeatures>(end);
    return o;
  }
};

inline flatbuffers::Offset<BoundsSensitiveFeatures> CreateBoundsSensitiveFeatures(
    flatbuffers::FlatBufferBuilder &_fbb,
    bool enabled = false,
    int32_t num_tokens_before = 0,
    int32_t num_tokens_inside_left = 0,
    int32_t num_tokens_inside_right = 0,
    int32_t num_tokens_after = 0,
    bool include_inside_bag = false,
    bool include_inside_length = false,
    bool score_single_token_spans_as_zero = false) {
  BoundsSensitiveFeaturesBuilder builder_(_fbb);
  builder_.add_num_tokens_after(num_tokens_after);
  builder_.add_num_tokens_inside_right(num_tokens_inside_right);
  builder_.add_num_tokens_inside_left(num_tokens_inside_left);
  builder_.add_num_tokens_before(num_tokens_before);
  builder_.add_score_single_token_spans_as_zero(score_single_token_spans_as_zero);
  builder_.add_include_inside_length(include_inside_length);
  builder_.add_include_inside_bag(include_inside_bag);
  builder_.add_enabled(enabled);
  return builder_.Finish();
}

flatbuffers::Offset<BoundsSensitiveFeatures> CreateBoundsSensitiveFeatures(flatbuffers::FlatBufferBuilder &_fbb, const BoundsSensitiveFeaturesT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct AlternativeCollectionMapEntryT : public flatbuffers::NativeTable {
  typedef AlternativeCollectionMapEntry TableType;
  std::string key;
  std::string value;
  AlternativeCollectionMapEntryT() {
  }
};

struct AlternativeCollectionMapEntry FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef AlternativeCollectionMapEntryT NativeTableType;
  enum {
    VT_KEY = 4,
    VT_VALUE = 6
  };
  const flatbuffers::String *key() const {
    return GetPointer<const flatbuffers::String *>(VT_KEY);
  }
  const flatbuffers::String *value() const {
    return GetPointer<const flatbuffers::String *>(VT_VALUE);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_KEY) &&
           verifier.Verify(key()) &&
           VerifyOffset(verifier, VT_VALUE) &&
           verifier.Verify(value()) &&
           verifier.EndTable();
  }
  AlternativeCollectionMapEntryT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(AlternativeCollectionMapEntryT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<AlternativeCollectionMapEntry> Pack(flatbuffers::FlatBufferBuilder &_fbb, const AlternativeCollectionMapEntryT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct AlternativeCollectionMapEntryBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_key(flatbuffers::Offset<flatbuffers::String> key) {
    fbb_.AddOffset(AlternativeCollectionMapEntry::VT_KEY, key);
  }
  void add_value(flatbuffers::Offset<flatbuffers::String> value) {
    fbb_.AddOffset(AlternativeCollectionMapEntry::VT_VALUE, value);
  }
  explicit AlternativeCollectionMapEntryBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  AlternativeCollectionMapEntryBuilder &operator=(const AlternativeCollectionMapEntryBuilder &);
  flatbuffers::Offset<AlternativeCollectionMapEntry> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<AlternativeCollectionMapEntry>(end);
    return o;
  }
};

inline flatbuffers::Offset<AlternativeCollectionMapEntry> CreateAlternativeCollectionMapEntry(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::String> key = 0,
    flatbuffers::Offset<flatbuffers::String> value = 0) {
  AlternativeCollectionMapEntryBuilder builder_(_fbb);
  builder_.add_value(value);
  builder_.add_key(key);
  return builder_.Finish();
}

inline flatbuffers::Offset<AlternativeCollectionMapEntry> CreateAlternativeCollectionMapEntryDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const char *key = nullptr,
    const char *value = nullptr) {
  return libtextclassifier2::FeatureProcessorOptions_::CreateAlternativeCollectionMapEntry(
      _fbb,
      key ? _fbb.CreateString(key) : 0,
      value ? _fbb.CreateString(value) : 0);
}

flatbuffers::Offset<AlternativeCollectionMapEntry> CreateAlternativeCollectionMapEntry(flatbuffers::FlatBufferBuilder &_fbb, const AlternativeCollectionMapEntryT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

}  // namespace FeatureProcessorOptions_

struct FeatureProcessorOptionsT : public flatbuffers::NativeTable {
  typedef FeatureProcessorOptions TableType;
  int32_t num_buckets;
  int32_t embedding_size;
  int32_t embedding_quantization_bits;
  int32_t context_size;
  int32_t max_selection_span;
  std::vector<int32_t> chargram_orders;
  int32_t max_word_length;
  bool unicode_aware_features;
  bool extract_case_feature;
  bool extract_selection_mask_feature;
  std::vector<std::string> regexp_feature;
  bool remap_digits;
  bool lowercase_tokens;
  bool selection_reduced_output_space;
  std::vector<std::string> collections;
  int32_t default_collection;
  bool only_use_line_with_click;
  bool split_tokens_on_selection_boundaries;
  std::vector<std::unique_ptr<TokenizationCodepointRangeT>> tokenization_codepoint_config;
  libtextclassifier2::FeatureProcessorOptions_::CenterTokenSelectionMethod center_token_selection_method;
  bool snap_label_span_boundaries_to_containing_tokens;
  std::vector<std::unique_ptr<libtextclassifier2::FeatureProcessorOptions_::CodepointRangeT>> supported_codepoint_ranges;
  std::vector<std::unique_ptr<libtextclassifier2::FeatureProcessorOptions_::CodepointRangeT>> internal_tokenizer_codepoint_ranges;
  float min_supported_codepoint_ratio;
  int32_t feature_version;
  libtextclassifier2::FeatureProcessorOptions_::TokenizationType tokenization_type;
  bool icu_preserve_whitespace_tokens;
  std::vector<int32_t> ignored_span_boundary_codepoints;
  std::unique_ptr<libtextclassifier2::FeatureProcessorOptions_::BoundsSensitiveFeaturesT> bounds_sensitive_features;
  std::vector<std::string> allowed_chargrams;
  bool tokenize_on_script_change;
  FeatureProcessorOptionsT()
      : num_buckets(-1),
        embedding_size(-1),
        embedding_quantization_bits(8),
        context_size(-1),
        max_selection_span(-1),
        max_word_length(20),
        unicode_aware_features(false),
        extract_case_feature(false),
        extract_selection_mask_feature(false),
        remap_digits(false),
        lowercase_tokens(false),
        selection_reduced_output_space(true),
        default_collection(-1),
        only_use_line_with_click(false),
        split_tokens_on_selection_boundaries(false),
        center_token_selection_method(libtextclassifier2::FeatureProcessorOptions_::CenterTokenSelectionMethod_DEFAULT_CENTER_TOKEN_METHOD),
        snap_label_span_boundaries_to_containing_tokens(false),
        min_supported_codepoint_ratio(0.0f),
        feature_version(0),
        tokenization_type(libtextclassifier2::FeatureProcessorOptions_::TokenizationType_INTERNAL_TOKENIZER),
        icu_preserve_whitespace_tokens(false),
        tokenize_on_script_change(false) {
  }
};

struct FeatureProcessorOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  typedef FeatureProcessorOptionsT NativeTableType;
  enum {
    VT_NUM_BUCKETS = 4,
    VT_EMBEDDING_SIZE = 6,
    VT_EMBEDDING_QUANTIZATION_BITS = 8,
    VT_CONTEXT_SIZE = 10,
    VT_MAX_SELECTION_SPAN = 12,
    VT_CHARGRAM_ORDERS = 14,
    VT_MAX_WORD_LENGTH = 16,
    VT_UNICODE_AWARE_FEATURES = 18,
    VT_EXTRACT_CASE_FEATURE = 20,
    VT_EXTRACT_SELECTION_MASK_FEATURE = 22,
    VT_REGEXP_FEATURE = 24,
    VT_REMAP_DIGITS = 26,
    VT_LOWERCASE_TOKENS = 28,
    VT_SELECTION_REDUCED_OUTPUT_SPACE = 30,
    VT_COLLECTIONS = 32,
    VT_DEFAULT_COLLECTION = 34,
    VT_ONLY_USE_LINE_WITH_CLICK = 36,
    VT_SPLIT_TOKENS_ON_SELECTION_BOUNDARIES = 38,
    VT_TOKENIZATION_CODEPOINT_CONFIG = 40,
    VT_CENTER_TOKEN_SELECTION_METHOD = 42,
    VT_SNAP_LABEL_SPAN_BOUNDARIES_TO_CONTAINING_TOKENS = 44,
    VT_SUPPORTED_CODEPOINT_RANGES = 46,
    VT_INTERNAL_TOKENIZER_CODEPOINT_RANGES = 48,
    VT_MIN_SUPPORTED_CODEPOINT_RATIO = 50,
    VT_FEATURE_VERSION = 52,
    VT_TOKENIZATION_TYPE = 54,
    VT_ICU_PRESERVE_WHITESPACE_TOKENS = 56,
    VT_IGNORED_SPAN_BOUNDARY_CODEPOINTS = 58,
    VT_BOUNDS_SENSITIVE_FEATURES = 60,
    VT_ALLOWED_CHARGRAMS = 62,
    VT_TOKENIZE_ON_SCRIPT_CHANGE = 64
  };
  int32_t num_buckets() const {
    return GetField<int32_t>(VT_NUM_BUCKETS, -1);
  }
  int32_t embedding_size() const {
    return GetField<int32_t>(VT_EMBEDDING_SIZE, -1);
  }
  int32_t embedding_quantization_bits() const {
    return GetField<int32_t>(VT_EMBEDDING_QUANTIZATION_BITS, 8);
  }
  int32_t context_size() const {
    return GetField<int32_t>(VT_CONTEXT_SIZE, -1);
  }
  int32_t max_selection_span() const {
    return GetField<int32_t>(VT_MAX_SELECTION_SPAN, -1);
  }
  const flatbuffers::Vector<int32_t> *chargram_orders() const {
    return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_CHARGRAM_ORDERS);
  }
  int32_t max_word_length() const {
    return GetField<int32_t>(VT_MAX_WORD_LENGTH, 20);
  }
  bool unicode_aware_features() const {
    return GetField<uint8_t>(VT_UNICODE_AWARE_FEATURES, 0) != 0;
  }
  bool extract_case_feature() const {
    return GetField<uint8_t>(VT_EXTRACT_CASE_FEATURE, 0) != 0;
  }
  bool extract_selection_mask_feature() const {
    return GetField<uint8_t>(VT_EXTRACT_SELECTION_MASK_FEATURE, 0) != 0;
  }
  const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *regexp_feature() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_REGEXP_FEATURE);
  }
  bool remap_digits() const {
    return GetField<uint8_t>(VT_REMAP_DIGITS, 0) != 0;
  }
  bool lowercase_tokens() const {
    return GetField<uint8_t>(VT_LOWERCASE_TOKENS, 0) != 0;
  }
  bool selection_reduced_output_space() const {
    return GetField<uint8_t>(VT_SELECTION_REDUCED_OUTPUT_SPACE, 1) != 0;
  }
  const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *collections() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_COLLECTIONS);
  }
  int32_t default_collection() const {
    return GetField<int32_t>(VT_DEFAULT_COLLECTION, -1);
  }
  bool only_use_line_with_click() const {
    return GetField<uint8_t>(VT_ONLY_USE_LINE_WITH_CLICK, 0) != 0;
  }
  bool split_tokens_on_selection_boundaries() const {
    return GetField<uint8_t>(VT_SPLIT_TOKENS_ON_SELECTION_BOUNDARIES, 0) != 0;
  }
  const flatbuffers::Vector<flatbuffers::Offset<TokenizationCodepointRange>> *tokenization_codepoint_config() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<TokenizationCodepointRange>> *>(VT_TOKENIZATION_CODEPOINT_CONFIG);
  }
  libtextclassifier2::FeatureProcessorOptions_::CenterTokenSelectionMethod center_token_selection_method() const {
    return static_cast<libtextclassifier2::FeatureProcessorOptions_::CenterTokenSelectionMethod>(GetField<int32_t>(VT_CENTER_TOKEN_SELECTION_METHOD, 0));
  }
  bool snap_label_span_boundaries_to_containing_tokens() const {
    return GetField<uint8_t>(VT_SNAP_LABEL_SPAN_BOUNDARIES_TO_CONTAINING_TOKENS, 0) != 0;
  }
  const flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>> *supported_codepoint_ranges() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>> *>(VT_SUPPORTED_CODEPOINT_RANGES);
  }
  const flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>> *internal_tokenizer_codepoint_ranges() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>> *>(VT_INTERNAL_TOKENIZER_CODEPOINT_RANGES);
  }
  float min_supported_codepoint_ratio() const {
    return GetField<float>(VT_MIN_SUPPORTED_CODEPOINT_RATIO, 0.0f);
  }
  int32_t feature_version() const {
    return GetField<int32_t>(VT_FEATURE_VERSION, 0);
  }
  libtextclassifier2::FeatureProcessorOptions_::TokenizationType tokenization_type() const {
    return static_cast<libtextclassifier2::FeatureProcessorOptions_::TokenizationType>(GetField<int32_t>(VT_TOKENIZATION_TYPE, 1));
  }
  bool icu_preserve_whitespace_tokens() const {
    return GetField<uint8_t>(VT_ICU_PRESERVE_WHITESPACE_TOKENS, 0) != 0;
  }
  const flatbuffers::Vector<int32_t> *ignored_span_boundary_codepoints() const {
    return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_IGNORED_SPAN_BOUNDARY_CODEPOINTS);
  }
  const libtextclassifier2::FeatureProcessorOptions_::BoundsSensitiveFeatures *bounds_sensitive_features() const {
    return GetPointer<const libtextclassifier2::FeatureProcessorOptions_::BoundsSensitiveFeatures *>(VT_BOUNDS_SENSITIVE_FEATURES);
  }
  const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *allowed_chargrams() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_ALLOWED_CHARGRAMS);
  }
  bool tokenize_on_script_change() const {
    return GetField<uint8_t>(VT_TOKENIZE_ON_SCRIPT_CHANGE, 0) != 0;
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<int32_t>(verifier, VT_NUM_BUCKETS) &&
           VerifyField<int32_t>(verifier, VT_EMBEDDING_SIZE) &&
           VerifyField<int32_t>(verifier, VT_EMBEDDING_QUANTIZATION_BITS) &&
           VerifyField<int32_t>(verifier, VT_CONTEXT_SIZE) &&
           VerifyField<int32_t>(verifier, VT_MAX_SELECTION_SPAN) &&
           VerifyOffset(verifier, VT_CHARGRAM_ORDERS) &&
           verifier.Verify(chargram_orders()) &&
           VerifyField<int32_t>(verifier, VT_MAX_WORD_LENGTH) &&
           VerifyField<uint8_t>(verifier, VT_UNICODE_AWARE_FEATURES) &&
           VerifyField<uint8_t>(verifier, VT_EXTRACT_CASE_FEATURE) &&
           VerifyField<uint8_t>(verifier, VT_EXTRACT_SELECTION_MASK_FEATURE) &&
           VerifyOffset(verifier, VT_REGEXP_FEATURE) &&
           verifier.Verify(regexp_feature()) &&
           verifier.VerifyVectorOfStrings(regexp_feature()) &&
           VerifyField<uint8_t>(verifier, VT_REMAP_DIGITS) &&
           VerifyField<uint8_t>(verifier, VT_LOWERCASE_TOKENS) &&
           VerifyField<uint8_t>(verifier, VT_SELECTION_REDUCED_OUTPUT_SPACE) &&
           VerifyOffset(verifier, VT_COLLECTIONS) &&
           verifier.Verify(collections()) &&
           verifier.VerifyVectorOfStrings(collections()) &&
           VerifyField<int32_t>(verifier, VT_DEFAULT_COLLECTION) &&
           VerifyField<uint8_t>(verifier, VT_ONLY_USE_LINE_WITH_CLICK) &&
           VerifyField<uint8_t>(verifier, VT_SPLIT_TOKENS_ON_SELECTION_BOUNDARIES) &&
           VerifyOffset(verifier, VT_TOKENIZATION_CODEPOINT_CONFIG) &&
           verifier.Verify(tokenization_codepoint_config()) &&
           verifier.VerifyVectorOfTables(tokenization_codepoint_config()) &&
           VerifyField<int32_t>(verifier, VT_CENTER_TOKEN_SELECTION_METHOD) &&
           VerifyField<uint8_t>(verifier, VT_SNAP_LABEL_SPAN_BOUNDARIES_TO_CONTAINING_TOKENS) &&
           VerifyOffset(verifier, VT_SUPPORTED_CODEPOINT_RANGES) &&
           verifier.Verify(supported_codepoint_ranges()) &&
           verifier.VerifyVectorOfTables(supported_codepoint_ranges()) &&
           VerifyOffset(verifier, VT_INTERNAL_TOKENIZER_CODEPOINT_RANGES) &&
           verifier.Verify(internal_tokenizer_codepoint_ranges()) &&
           verifier.VerifyVectorOfTables(internal_tokenizer_codepoint_ranges()) &&
           VerifyField<float>(verifier, VT_MIN_SUPPORTED_CODEPOINT_RATIO) &&
           VerifyField<int32_t>(verifier, VT_FEATURE_VERSION) &&
           VerifyField<int32_t>(verifier, VT_TOKENIZATION_TYPE) &&
           VerifyField<uint8_t>(verifier, VT_ICU_PRESERVE_WHITESPACE_TOKENS) &&
           VerifyOffset(verifier, VT_IGNORED_SPAN_BOUNDARY_CODEPOINTS) &&
           verifier.Verify(ignored_span_boundary_codepoints()) &&
           VerifyOffset(verifier, VT_BOUNDS_SENSITIVE_FEATURES) &&
           verifier.VerifyTable(bounds_sensitive_features()) &&
           VerifyOffset(verifier, VT_ALLOWED_CHARGRAMS) &&
           verifier.Verify(allowed_chargrams()) &&
           verifier.VerifyVectorOfStrings(allowed_chargrams()) &&
           VerifyField<uint8_t>(verifier, VT_TOKENIZE_ON_SCRIPT_CHANGE) &&
           verifier.EndTable();
  }
  FeatureProcessorOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(FeatureProcessorOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static flatbuffers::Offset<FeatureProcessorOptions> Pack(flatbuffers::FlatBufferBuilder &_fbb, const FeatureProcessorOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct FeatureProcessorOptionsBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_num_buckets(int32_t num_buckets) {
    fbb_.AddElement<int32_t>(FeatureProcessorOptions::VT_NUM_BUCKETS, num_buckets, -1);
  }
  void add_embedding_size(int32_t embedding_size) {
    fbb_.AddElement<int32_t>(FeatureProcessorOptions::VT_EMBEDDING_SIZE, embedding_size, -1);
  }
  void add_embedding_quantization_bits(int32_t embedding_quantization_bits) {
    fbb_.AddElement<int32_t>(FeatureProcessorOptions::VT_EMBEDDING_QUANTIZATION_BITS, embedding_quantization_bits, 8);
  }
  void add_context_size(int32_t context_size) {
    fbb_.AddElement<int32_t>(FeatureProcessorOptions::VT_CONTEXT_SIZE, context_size, -1);
  }
  void add_max_selection_span(int32_t max_selection_span) {
    fbb_.AddElement<int32_t>(FeatureProcessorOptions::VT_MAX_SELECTION_SPAN, max_selection_span, -1);
  }
  void add_chargram_orders(flatbuffers::Offset<flatbuffers::Vector<int32_t>> chargram_orders) {
    fbb_.AddOffset(FeatureProcessorOptions::VT_CHARGRAM_ORDERS, chargram_orders);
  }
  void add_max_word_length(int32_t max_word_length) {
    fbb_.AddElement<int32_t>(FeatureProcessorOptions::VT_MAX_WORD_LENGTH, max_word_length, 20);
  }
  void add_unicode_aware_features(bool unicode_aware_features) {
    fbb_.AddElement<uint8_t>(FeatureProcessorOptions::VT_UNICODE_AWARE_FEATURES, static_cast<uint8_t>(unicode_aware_features), 0);
  }
  void add_extract_case_feature(bool extract_case_feature) {
    fbb_.AddElement<uint8_t>(FeatureProcessorOptions::VT_EXTRACT_CASE_FEATURE, static_cast<uint8_t>(extract_case_feature), 0);
  }
  void add_extract_selection_mask_feature(bool extract_selection_mask_feature) {
    fbb_.AddElement<uint8_t>(FeatureProcessorOptions::VT_EXTRACT_SELECTION_MASK_FEATURE, static_cast<uint8_t>(extract_selection_mask_feature), 0);
  }
  void add_regexp_feature(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> regexp_feature) {
    fbb_.AddOffset(FeatureProcessorOptions::VT_REGEXP_FEATURE, regexp_feature);
  }
  void add_remap_digits(bool remap_digits) {
    fbb_.AddElement<uint8_t>(FeatureProcessorOptions::VT_REMAP_DIGITS, static_cast<uint8_t>(remap_digits), 0);
  }
  void add_lowercase_tokens(bool lowercase_tokens) {
    fbb_.AddElement<uint8_t>(FeatureProcessorOptions::VT_LOWERCASE_TOKENS, static_cast<uint8_t>(lowercase_tokens), 0);
  }
  void add_selection_reduced_output_space(bool selection_reduced_output_space) {
    fbb_.AddElement<uint8_t>(FeatureProcessorOptions::VT_SELECTION_REDUCED_OUTPUT_SPACE, static_cast<uint8_t>(selection_reduced_output_space), 1);
  }
  void add_collections(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> collections) {
    fbb_.AddOffset(FeatureProcessorOptions::VT_COLLECTIONS, collections);
  }
  void add_default_collection(int32_t default_collection) {
    fbb_.AddElement<int32_t>(FeatureProcessorOptions::VT_DEFAULT_COLLECTION, default_collection, -1);
  }
  void add_only_use_line_with_click(bool only_use_line_with_click) {
    fbb_.AddElement<uint8_t>(FeatureProcessorOptions::VT_ONLY_USE_LINE_WITH_CLICK, static_cast<uint8_t>(only_use_line_with_click), 0);
  }
  void add_split_tokens_on_selection_boundaries(bool split_tokens_on_selection_boundaries) {
    fbb_.AddElement<uint8_t>(FeatureProcessorOptions::VT_SPLIT_TOKENS_ON_SELECTION_BOUNDARIES, static_cast<uint8_t>(split_tokens_on_selection_boundaries), 0);
  }
  void add_tokenization_codepoint_config(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<TokenizationCodepointRange>>> tokenization_codepoint_config) {
    fbb_.AddOffset(FeatureProcessorOptions::VT_TOKENIZATION_CODEPOINT_CONFIG, tokenization_codepoint_config);
  }
  void add_center_token_selection_method(libtextclassifier2::FeatureProcessorOptions_::CenterTokenSelectionMethod center_token_selection_method) {
    fbb_.AddElement<int32_t>(FeatureProcessorOptions::VT_CENTER_TOKEN_SELECTION_METHOD, static_cast<int32_t>(center_token_selection_method), 0);
  }
  void add_snap_label_span_boundaries_to_containing_tokens(bool snap_label_span_boundaries_to_containing_tokens) {
    fbb_.AddElement<uint8_t>(FeatureProcessorOptions::VT_SNAP_LABEL_SPAN_BOUNDARIES_TO_CONTAINING_TOKENS, static_cast<uint8_t>(snap_label_span_boundaries_to_containing_tokens), 0);
  }
  void add_supported_codepoint_ranges(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>>> supported_codepoint_ranges) {
    fbb_.AddOffset(FeatureProcessorOptions::VT_SUPPORTED_CODEPOINT_RANGES, supported_codepoint_ranges);
  }
  void add_internal_tokenizer_codepoint_ranges(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>>> internal_tokenizer_codepoint_ranges) {
    fbb_.AddOffset(FeatureProcessorOptions::VT_INTERNAL_TOKENIZER_CODEPOINT_RANGES, internal_tokenizer_codepoint_ranges);
  }
  void add_min_supported_codepoint_ratio(float min_supported_codepoint_ratio) {
    fbb_.AddElement<float>(FeatureProcessorOptions::VT_MIN_SUPPORTED_CODEPOINT_RATIO, min_supported_codepoint_ratio, 0.0f);
  }
  void add_feature_version(int32_t feature_version) {
    fbb_.AddElement<int32_t>(FeatureProcessorOptions::VT_FEATURE_VERSION, feature_version, 0);
  }
  void add_tokenization_type(libtextclassifier2::FeatureProcessorOptions_::TokenizationType tokenization_type) {
    fbb_.AddElement<int32_t>(FeatureProcessorOptions::VT_TOKENIZATION_TYPE, static_cast<int32_t>(tokenization_type), 1);
  }
  void add_icu_preserve_whitespace_tokens(bool icu_preserve_whitespace_tokens) {
    fbb_.AddElement<uint8_t>(FeatureProcessorOptions::VT_ICU_PRESERVE_WHITESPACE_TOKENS, static_cast<uint8_t>(icu_preserve_whitespace_tokens), 0);
  }
  void add_ignored_span_boundary_codepoints(flatbuffers::Offset<flatbuffers::Vector<int32_t>> ignored_span_boundary_codepoints) {
    fbb_.AddOffset(FeatureProcessorOptions::VT_IGNORED_SPAN_BOUNDARY_CODEPOINTS, ignored_span_boundary_codepoints);
  }
  void add_bounds_sensitive_features(flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::BoundsSensitiveFeatures> bounds_sensitive_features) {
    fbb_.AddOffset(FeatureProcessorOptions::VT_BOUNDS_SENSITIVE_FEATURES, bounds_sensitive_features);
  }
  void add_allowed_chargrams(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> allowed_chargrams) {
    fbb_.AddOffset(FeatureProcessorOptions::VT_ALLOWED_CHARGRAMS, allowed_chargrams);
  }
  void add_tokenize_on_script_change(bool tokenize_on_script_change) {
    fbb_.AddElement<uint8_t>(FeatureProcessorOptions::VT_TOKENIZE_ON_SCRIPT_CHANGE, static_cast<uint8_t>(tokenize_on_script_change), 0);
  }
  explicit FeatureProcessorOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  FeatureProcessorOptionsBuilder &operator=(const FeatureProcessorOptionsBuilder &);
  flatbuffers::Offset<FeatureProcessorOptions> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<FeatureProcessorOptions>(end);
    return o;
  }
};

inline flatbuffers::Offset<FeatureProcessorOptions> CreateFeatureProcessorOptions(
    flatbuffers::FlatBufferBuilder &_fbb,
    int32_t num_buckets = -1,
    int32_t embedding_size = -1,
    int32_t embedding_quantization_bits = 8,
    int32_t context_size = -1,
    int32_t max_selection_span = -1,
    flatbuffers::Offset<flatbuffers::Vector<int32_t>> chargram_orders = 0,
    int32_t max_word_length = 20,
    bool unicode_aware_features = false,
    bool extract_case_feature = false,
    bool extract_selection_mask_feature = false,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> regexp_feature = 0,
    bool remap_digits = false,
    bool lowercase_tokens = false,
    bool selection_reduced_output_space = true,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> collections = 0,
    int32_t default_collection = -1,
    bool only_use_line_with_click = false,
    bool split_tokens_on_selection_boundaries = false,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<TokenizationCodepointRange>>> tokenization_codepoint_config = 0,
    libtextclassifier2::FeatureProcessorOptions_::CenterTokenSelectionMethod center_token_selection_method = libtextclassifier2::FeatureProcessorOptions_::CenterTokenSelectionMethod_DEFAULT_CENTER_TOKEN_METHOD,
    bool snap_label_span_boundaries_to_containing_tokens = false,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>>> supported_codepoint_ranges = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>>> internal_tokenizer_codepoint_ranges = 0,
    float min_supported_codepoint_ratio = 0.0f,
    int32_t feature_version = 0,
    libtextclassifier2::FeatureProcessorOptions_::TokenizationType tokenization_type = libtextclassifier2::FeatureProcessorOptions_::TokenizationType_INTERNAL_TOKENIZER,
    bool icu_preserve_whitespace_tokens = false,
    flatbuffers::Offset<flatbuffers::Vector<int32_t>> ignored_span_boundary_codepoints = 0,
    flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::BoundsSensitiveFeatures> bounds_sensitive_features = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> allowed_chargrams = 0,
    bool tokenize_on_script_change = false) {
  FeatureProcessorOptionsBuilder builder_(_fbb);
  builder_.add_allowed_chargrams(allowed_chargrams);
  builder_.add_bounds_sensitive_features(bounds_sensitive_features);
  builder_.add_ignored_span_boundary_codepoints(ignored_span_boundary_codepoints);
  builder_.add_tokenization_type(tokenization_type);
  builder_.add_feature_version(feature_version);
  builder_.add_min_supported_codepoint_ratio(min_supported_codepoint_ratio);
  builder_.add_internal_tokenizer_codepoint_ranges(internal_tokenizer_codepoint_ranges);
  builder_.add_supported_codepoint_ranges(supported_codepoint_ranges);
  builder_.add_center_token_selection_method(center_token_selection_method);
  builder_.add_tokenization_codepoint_config(tokenization_codepoint_config);
  builder_.add_default_collection(default_collection);
  builder_.add_collections(collections);
  builder_.add_regexp_feature(regexp_feature);
  builder_.add_max_word_length(max_word_length);
  builder_.add_chargram_orders(chargram_orders);
  builder_.add_max_selection_span(max_selection_span);
  builder_.add_context_size(context_size);
  builder_.add_embedding_quantization_bits(embedding_quantization_bits);
  builder_.add_embedding_size(embedding_size);
  builder_.add_num_buckets(num_buckets);
  builder_.add_tokenize_on_script_change(tokenize_on_script_change);
  builder_.add_icu_preserve_whitespace_tokens(icu_preserve_whitespace_tokens);
  builder_.add_snap_label_span_boundaries_to_containing_tokens(snap_label_span_boundaries_to_containing_tokens);
  builder_.add_split_tokens_on_selection_boundaries(split_tokens_on_selection_boundaries);
  builder_.add_only_use_line_with_click(only_use_line_with_click);
  builder_.add_selection_reduced_output_space(selection_reduced_output_space);
  builder_.add_lowercase_tokens(lowercase_tokens);
  builder_.add_remap_digits(remap_digits);
  builder_.add_extract_selection_mask_feature(extract_selection_mask_feature);
  builder_.add_extract_case_feature(extract_case_feature);
  builder_.add_unicode_aware_features(unicode_aware_features);
  return builder_.Finish();
}

inline flatbuffers::Offset<FeatureProcessorOptions> CreateFeatureProcessorOptionsDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    int32_t num_buckets = -1,
    int32_t embedding_size = -1,
    int32_t embedding_quantization_bits = 8,
    int32_t context_size = -1,
    int32_t max_selection_span = -1,
    const std::vector<int32_t> *chargram_orders = nullptr,
    int32_t max_word_length = 20,
    bool unicode_aware_features = false,
    bool extract_case_feature = false,
    bool extract_selection_mask_feature = false,
    const std::vector<flatbuffers::Offset<flatbuffers::String>> *regexp_feature = nullptr,
    bool remap_digits = false,
    bool lowercase_tokens = false,
    bool selection_reduced_output_space = true,
    const std::vector<flatbuffers::Offset<flatbuffers::String>> *collections = nullptr,
    int32_t default_collection = -1,
    bool only_use_line_with_click = false,
    bool split_tokens_on_selection_boundaries = false,
    const std::vector<flatbuffers::Offset<TokenizationCodepointRange>> *tokenization_codepoint_config = nullptr,
    libtextclassifier2::FeatureProcessorOptions_::CenterTokenSelectionMethod center_token_selection_method = libtextclassifier2::FeatureProcessorOptions_::CenterTokenSelectionMethod_DEFAULT_CENTER_TOKEN_METHOD,
    bool snap_label_span_boundaries_to_containing_tokens = false,
    const std::vector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>> *supported_codepoint_ranges = nullptr,
    const std::vector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>> *internal_tokenizer_codepoint_ranges = nullptr,
    float min_supported_codepoint_ratio = 0.0f,
    int32_t feature_version = 0,
    libtextclassifier2::FeatureProcessorOptions_::TokenizationType tokenization_type = libtextclassifier2::FeatureProcessorOptions_::TokenizationType_INTERNAL_TOKENIZER,
    bool icu_preserve_whitespace_tokens = false,
    const std::vector<int32_t> *ignored_span_boundary_codepoints = nullptr,
    flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::BoundsSensitiveFeatures> bounds_sensitive_features = 0,
    const std::vector<flatbuffers::Offset<flatbuffers::String>> *allowed_chargrams = nullptr,
    bool tokenize_on_script_change = false) {
  return libtextclassifier2::CreateFeatureProcessorOptions(
      _fbb,
      num_buckets,
      embedding_size,
      embedding_quantization_bits,
      context_size,
      max_selection_span,
      chargram_orders ? _fbb.CreateVector<int32_t>(*chargram_orders) : 0,
      max_word_length,
      unicode_aware_features,
      extract_case_feature,
      extract_selection_mask_feature,
      regexp_feature ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*regexp_feature) : 0,
      remap_digits,
      lowercase_tokens,
      selection_reduced_output_space,
      collections ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*collections) : 0,
      default_collection,
      only_use_line_with_click,
      split_tokens_on_selection_boundaries,
      tokenization_codepoint_config ? _fbb.CreateVector<flatbuffers::Offset<TokenizationCodepointRange>>(*tokenization_codepoint_config) : 0,
      center_token_selection_method,
      snap_label_span_boundaries_to_containing_tokens,
      supported_codepoint_ranges ? _fbb.CreateVector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>>(*supported_codepoint_ranges) : 0,
      internal_tokenizer_codepoint_ranges ? _fbb.CreateVector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>>(*internal_tokenizer_codepoint_ranges) : 0,
      min_supported_codepoint_ratio,
      feature_version,
      tokenization_type,
      icu_preserve_whitespace_tokens,
      ignored_span_boundary_codepoints ? _fbb.CreateVector<int32_t>(*ignored_span_boundary_codepoints) : 0,
      bounds_sensitive_features,
      allowed_chargrams ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*allowed_chargrams) : 0,
      tokenize_on_script_change);
}

flatbuffers::Offset<FeatureProcessorOptions> CreateFeatureProcessorOptions(flatbuffers::FlatBufferBuilder &_fbb, const FeatureProcessorOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

inline CompressedBufferT *CompressedBuffer::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new CompressedBufferT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void CompressedBuffer::UnPackTo(CompressedBufferT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = buffer(); if (_e) { _o->buffer.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->buffer[_i] = _e->Get(_i); } } };
  { auto _e = uncompressed_size(); _o->uncompressed_size = _e; };
}

inline flatbuffers::Offset<CompressedBuffer> CompressedBuffer::Pack(flatbuffers::FlatBufferBuilder &_fbb, const CompressedBufferT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateCompressedBuffer(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<CompressedBuffer> CreateCompressedBuffer(flatbuffers::FlatBufferBuilder &_fbb, const CompressedBufferT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const CompressedBufferT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _buffer = _o->buffer.size() ? _fbb.CreateVector(_o->buffer) : 0;
  auto _uncompressed_size = _o->uncompressed_size;
  return libtextclassifier2::CreateCompressedBuffer(
      _fbb,
      _buffer,
      _uncompressed_size);
}

inline SelectionModelOptionsT *SelectionModelOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new SelectionModelOptionsT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void SelectionModelOptions::UnPackTo(SelectionModelOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = strip_unpaired_brackets(); _o->strip_unpaired_brackets = _e; };
  { auto _e = symmetry_context_size(); _o->symmetry_context_size = _e; };
  { auto _e = batch_size(); _o->batch_size = _e; };
  { auto _e = always_classify_suggested_selection(); _o->always_classify_suggested_selection = _e; };
}

inline flatbuffers::Offset<SelectionModelOptions> SelectionModelOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SelectionModelOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateSelectionModelOptions(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<SelectionModelOptions> CreateSelectionModelOptions(flatbuffers::FlatBufferBuilder &_fbb, const SelectionModelOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SelectionModelOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _strip_unpaired_brackets = _o->strip_unpaired_brackets;
  auto _symmetry_context_size = _o->symmetry_context_size;
  auto _batch_size = _o->batch_size;
  auto _always_classify_suggested_selection = _o->always_classify_suggested_selection;
  return libtextclassifier2::CreateSelectionModelOptions(
      _fbb,
      _strip_unpaired_brackets,
      _symmetry_context_size,
      _batch_size,
      _always_classify_suggested_selection);
}

inline ClassificationModelOptionsT *ClassificationModelOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new ClassificationModelOptionsT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void ClassificationModelOptions::UnPackTo(ClassificationModelOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = phone_min_num_digits(); _o->phone_min_num_digits = _e; };
  { auto _e = phone_max_num_digits(); _o->phone_max_num_digits = _e; };
  { auto _e = address_min_num_tokens(); _o->address_min_num_tokens = _e; };
  { auto _e = max_num_tokens(); _o->max_num_tokens = _e; };
}

inline flatbuffers::Offset<ClassificationModelOptions> ClassificationModelOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ClassificationModelOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateClassificationModelOptions(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<ClassificationModelOptions> CreateClassificationModelOptions(flatbuffers::FlatBufferBuilder &_fbb, const ClassificationModelOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ClassificationModelOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _phone_min_num_digits = _o->phone_min_num_digits;
  auto _phone_max_num_digits = _o->phone_max_num_digits;
  auto _address_min_num_tokens = _o->address_min_num_tokens;
  auto _max_num_tokens = _o->max_num_tokens;
  return libtextclassifier2::CreateClassificationModelOptions(
      _fbb,
      _phone_min_num_digits,
      _phone_max_num_digits,
      _address_min_num_tokens,
      _max_num_tokens);
}

namespace RegexModel_ {

inline PatternT *Pattern::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new PatternT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void Pattern::UnPackTo(PatternT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = collection_name(); if (_e) _o->collection_name = _e->str(); };
  { auto _e = pattern(); if (_e) _o->pattern = _e->str(); };
  { auto _e = enabled_modes(); _o->enabled_modes = _e; };
  { auto _e = target_classification_score(); _o->target_classification_score = _e; };
  { auto _e = priority_score(); _o->priority_score = _e; };
  { auto _e = use_approximate_matching(); _o->use_approximate_matching = _e; };
  { auto _e = compressed_pattern(); if (_e) _o->compressed_pattern = std::unique_ptr<libtextclassifier2::CompressedBufferT>(_e->UnPack(_resolver)); };
}

inline flatbuffers::Offset<Pattern> Pattern::Pack(flatbuffers::FlatBufferBuilder &_fbb, const PatternT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreatePattern(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<Pattern> CreatePattern(flatbuffers::FlatBufferBuilder &_fbb, const PatternT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const PatternT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _collection_name = _o->collection_name.empty() ? 0 : _fbb.CreateString(_o->collection_name);
  auto _pattern = _o->pattern.empty() ? 0 : _fbb.CreateString(_o->pattern);
  auto _enabled_modes = _o->enabled_modes;
  auto _target_classification_score = _o->target_classification_score;
  auto _priority_score = _o->priority_score;
  auto _use_approximate_matching = _o->use_approximate_matching;
  auto _compressed_pattern = _o->compressed_pattern ? CreateCompressedBuffer(_fbb, _o->compressed_pattern.get(), _rehasher) : 0;
  return libtextclassifier2::RegexModel_::CreatePattern(
      _fbb,
      _collection_name,
      _pattern,
      _enabled_modes,
      _target_classification_score,
      _priority_score,
      _use_approximate_matching,
      _compressed_pattern);
}

}  // namespace RegexModel_

inline RegexModelT *RegexModel::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new RegexModelT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void RegexModel::UnPackTo(RegexModelT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = patterns(); if (_e) { _o->patterns.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->patterns[_i] = std::unique_ptr<libtextclassifier2::RegexModel_::PatternT>(_e->Get(_i)->UnPack(_resolver)); } } };
}

inline flatbuffers::Offset<RegexModel> RegexModel::Pack(flatbuffers::FlatBufferBuilder &_fbb, const RegexModelT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateRegexModel(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<RegexModel> CreateRegexModel(flatbuffers::FlatBufferBuilder &_fbb, const RegexModelT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const RegexModelT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _patterns = _o->patterns.size() ? _fbb.CreateVector<flatbuffers::Offset<libtextclassifier2::RegexModel_::Pattern>> (_o->patterns.size(), [](size_t i, _VectorArgs *__va) { return CreatePattern(*__va->__fbb, __va->__o->patterns[i].get(), __va->__rehasher); }, &_va ) : 0;
  return libtextclassifier2::CreateRegexModel(
      _fbb,
      _patterns);
}

namespace DatetimeModelPattern_ {

inline RegexT *Regex::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new RegexT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void Regex::UnPackTo(RegexT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = pattern(); if (_e) _o->pattern = _e->str(); };
  { auto _e = groups(); if (_e) { _o->groups.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->groups[_i] = (DatetimeGroupType)_e->Get(_i); } } };
  { auto _e = compressed_pattern(); if (_e) _o->compressed_pattern = std::unique_ptr<libtextclassifier2::CompressedBufferT>(_e->UnPack(_resolver)); };
}

inline flatbuffers::Offset<Regex> Regex::Pack(flatbuffers::FlatBufferBuilder &_fbb, const RegexT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateRegex(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<Regex> CreateRegex(flatbuffers::FlatBufferBuilder &_fbb, const RegexT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const RegexT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _pattern = _o->pattern.empty() ? 0 : _fbb.CreateString(_o->pattern);
  auto _groups = _o->groups.size() ? _fbb.CreateVector((const int32_t*)_o->groups.data(), _o->groups.size()) : 0;
  auto _compressed_pattern = _o->compressed_pattern ? CreateCompressedBuffer(_fbb, _o->compressed_pattern.get(), _rehasher) : 0;
  return libtextclassifier2::DatetimeModelPattern_::CreateRegex(
      _fbb,
      _pattern,
      _groups,
      _compressed_pattern);
}

}  // namespace DatetimeModelPattern_

inline DatetimeModelPatternT *DatetimeModelPattern::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new DatetimeModelPatternT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void DatetimeModelPattern::UnPackTo(DatetimeModelPatternT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = regexes(); if (_e) { _o->regexes.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->regexes[_i] = std::unique_ptr<libtextclassifier2::DatetimeModelPattern_::RegexT>(_e->Get(_i)->UnPack(_resolver)); } } };
  { auto _e = locales(); if (_e) { _o->locales.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->locales[_i] = _e->Get(_i); } } };
  { auto _e = target_classification_score(); _o->target_classification_score = _e; };
  { auto _e = priority_score(); _o->priority_score = _e; };
  { auto _e = enabled_modes(); _o->enabled_modes = _e; };
}

inline flatbuffers::Offset<DatetimeModelPattern> DatetimeModelPattern::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelPatternT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateDatetimeModelPattern(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<DatetimeModelPattern> CreateDatetimeModelPattern(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelPatternT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const DatetimeModelPatternT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _regexes = _o->regexes.size() ? _fbb.CreateVector<flatbuffers::Offset<libtextclassifier2::DatetimeModelPattern_::Regex>> (_o->regexes.size(), [](size_t i, _VectorArgs *__va) { return CreateRegex(*__va->__fbb, __va->__o->regexes[i].get(), __va->__rehasher); }, &_va ) : 0;
  auto _locales = _o->locales.size() ? _fbb.CreateVector(_o->locales) : 0;
  auto _target_classification_score = _o->target_classification_score;
  auto _priority_score = _o->priority_score;
  auto _enabled_modes = _o->enabled_modes;
  return libtextclassifier2::CreateDatetimeModelPattern(
      _fbb,
      _regexes,
      _locales,
      _target_classification_score,
      _priority_score,
      _enabled_modes);
}

inline DatetimeModelExtractorT *DatetimeModelExtractor::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new DatetimeModelExtractorT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void DatetimeModelExtractor::UnPackTo(DatetimeModelExtractorT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = extractor(); _o->extractor = _e; };
  { auto _e = pattern(); if (_e) _o->pattern = _e->str(); };
  { auto _e = locales(); if (_e) { _o->locales.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->locales[_i] = _e->Get(_i); } } };
  { auto _e = compressed_pattern(); if (_e) _o->compressed_pattern = std::unique_ptr<CompressedBufferT>(_e->UnPack(_resolver)); };
}

inline flatbuffers::Offset<DatetimeModelExtractor> DatetimeModelExtractor::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelExtractorT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateDatetimeModelExtractor(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<DatetimeModelExtractor> CreateDatetimeModelExtractor(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelExtractorT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const DatetimeModelExtractorT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _extractor = _o->extractor;
  auto _pattern = _o->pattern.empty() ? 0 : _fbb.CreateString(_o->pattern);
  auto _locales = _o->locales.size() ? _fbb.CreateVector(_o->locales) : 0;
  auto _compressed_pattern = _o->compressed_pattern ? CreateCompressedBuffer(_fbb, _o->compressed_pattern.get(), _rehasher) : 0;
  return libtextclassifier2::CreateDatetimeModelExtractor(
      _fbb,
      _extractor,
      _pattern,
      _locales,
      _compressed_pattern);
}

inline DatetimeModelT *DatetimeModel::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new DatetimeModelT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void DatetimeModel::UnPackTo(DatetimeModelT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = locales(); if (_e) { _o->locales.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->locales[_i] = _e->Get(_i)->str(); } } };
  { auto _e = patterns(); if (_e) { _o->patterns.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->patterns[_i] = std::unique_ptr<DatetimeModelPatternT>(_e->Get(_i)->UnPack(_resolver)); } } };
  { auto _e = extractors(); if (_e) { _o->extractors.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->extractors[_i] = std::unique_ptr<DatetimeModelExtractorT>(_e->Get(_i)->UnPack(_resolver)); } } };
  { auto _e = use_extractors_for_locating(); _o->use_extractors_for_locating = _e; };
  { auto _e = default_locales(); if (_e) { _o->default_locales.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->default_locales[_i] = _e->Get(_i); } } };
}

inline flatbuffers::Offset<DatetimeModel> DatetimeModel::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateDatetimeModel(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<DatetimeModel> CreateDatetimeModel(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const DatetimeModelT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _locales = _o->locales.size() ? _fbb.CreateVectorOfStrings(_o->locales) : 0;
  auto _patterns = _o->patterns.size() ? _fbb.CreateVector<flatbuffers::Offset<DatetimeModelPattern>> (_o->patterns.size(), [](size_t i, _VectorArgs *__va) { return CreateDatetimeModelPattern(*__va->__fbb, __va->__o->patterns[i].get(), __va->__rehasher); }, &_va ) : 0;
  auto _extractors = _o->extractors.size() ? _fbb.CreateVector<flatbuffers::Offset<DatetimeModelExtractor>> (_o->extractors.size(), [](size_t i, _VectorArgs *__va) { return CreateDatetimeModelExtractor(*__va->__fbb, __va->__o->extractors[i].get(), __va->__rehasher); }, &_va ) : 0;
  auto _use_extractors_for_locating = _o->use_extractors_for_locating;
  auto _default_locales = _o->default_locales.size() ? _fbb.CreateVector(_o->default_locales) : 0;
  return libtextclassifier2::CreateDatetimeModel(
      _fbb,
      _locales,
      _patterns,
      _extractors,
      _use_extractors_for_locating,
      _default_locales);
}

namespace DatetimeModelLibrary_ {

inline ItemT *Item::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new ItemT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void Item::UnPackTo(ItemT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = key(); if (_e) _o->key = _e->str(); };
  { auto _e = value(); if (_e) _o->value = std::unique_ptr<libtextclassifier2::DatetimeModelT>(_e->UnPack(_resolver)); };
}

inline flatbuffers::Offset<Item> Item::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ItemT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateItem(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<Item> CreateItem(flatbuffers::FlatBufferBuilder &_fbb, const ItemT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ItemT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _key = _o->key.empty() ? 0 : _fbb.CreateString(_o->key);
  auto _value = _o->value ? CreateDatetimeModel(_fbb, _o->value.get(), _rehasher) : 0;
  return libtextclassifier2::DatetimeModelLibrary_::CreateItem(
      _fbb,
      _key,
      _value);
}

}  // namespace DatetimeModelLibrary_

inline DatetimeModelLibraryT *DatetimeModelLibrary::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new DatetimeModelLibraryT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void DatetimeModelLibrary::UnPackTo(DatetimeModelLibraryT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = models(); if (_e) { _o->models.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->models[_i] = std::unique_ptr<libtextclassifier2::DatetimeModelLibrary_::ItemT>(_e->Get(_i)->UnPack(_resolver)); } } };
}

inline flatbuffers::Offset<DatetimeModelLibrary> DatetimeModelLibrary::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelLibraryT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateDatetimeModelLibrary(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<DatetimeModelLibrary> CreateDatetimeModelLibrary(flatbuffers::FlatBufferBuilder &_fbb, const DatetimeModelLibraryT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const DatetimeModelLibraryT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _models = _o->models.size() ? _fbb.CreateVector<flatbuffers::Offset<libtextclassifier2::DatetimeModelLibrary_::Item>> (_o->models.size(), [](size_t i, _VectorArgs *__va) { return CreateItem(*__va->__fbb, __va->__o->models[i].get(), __va->__rehasher); }, &_va ) : 0;
  return libtextclassifier2::CreateDatetimeModelLibrary(
      _fbb,
      _models);
}

inline ModelTriggeringOptionsT *ModelTriggeringOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new ModelTriggeringOptionsT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void ModelTriggeringOptions::UnPackTo(ModelTriggeringOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = min_annotate_confidence(); _o->min_annotate_confidence = _e; };
  { auto _e = enabled_modes(); _o->enabled_modes = _e; };
}

inline flatbuffers::Offset<ModelTriggeringOptions> ModelTriggeringOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ModelTriggeringOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateModelTriggeringOptions(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<ModelTriggeringOptions> CreateModelTriggeringOptions(flatbuffers::FlatBufferBuilder &_fbb, const ModelTriggeringOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ModelTriggeringOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _min_annotate_confidence = _o->min_annotate_confidence;
  auto _enabled_modes = _o->enabled_modes;
  return libtextclassifier2::CreateModelTriggeringOptions(
      _fbb,
      _min_annotate_confidence,
      _enabled_modes);
}

inline OutputOptionsT *OutputOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new OutputOptionsT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void OutputOptions::UnPackTo(OutputOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = filtered_collections_annotation(); if (_e) { _o->filtered_collections_annotation.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->filtered_collections_annotation[_i] = _e->Get(_i)->str(); } } };
  { auto _e = filtered_collections_classification(); if (_e) { _o->filtered_collections_classification.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->filtered_collections_classification[_i] = _e->Get(_i)->str(); } } };
  { auto _e = filtered_collections_selection(); if (_e) { _o->filtered_collections_selection.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->filtered_collections_selection[_i] = _e->Get(_i)->str(); } } };
}

inline flatbuffers::Offset<OutputOptions> OutputOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const OutputOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateOutputOptions(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<OutputOptions> CreateOutputOptions(flatbuffers::FlatBufferBuilder &_fbb, const OutputOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const OutputOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _filtered_collections_annotation = _o->filtered_collections_annotation.size() ? _fbb.CreateVectorOfStrings(_o->filtered_collections_annotation) : 0;
  auto _filtered_collections_classification = _o->filtered_collections_classification.size() ? _fbb.CreateVectorOfStrings(_o->filtered_collections_classification) : 0;
  auto _filtered_collections_selection = _o->filtered_collections_selection.size() ? _fbb.CreateVectorOfStrings(_o->filtered_collections_selection) : 0;
  return libtextclassifier2::CreateOutputOptions(
      _fbb,
      _filtered_collections_annotation,
      _filtered_collections_classification,
      _filtered_collections_selection);
}

inline ModelT *Model::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new ModelT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void Model::UnPackTo(ModelT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = locales(); if (_e) _o->locales = _e->str(); };
  { auto _e = version(); _o->version = _e; };
  { auto _e = name(); if (_e) _o->name = _e->str(); };
  { auto _e = selection_feature_options(); if (_e) _o->selection_feature_options = std::unique_ptr<FeatureProcessorOptionsT>(_e->UnPack(_resolver)); };
  { auto _e = classification_feature_options(); if (_e) _o->classification_feature_options = std::unique_ptr<FeatureProcessorOptionsT>(_e->UnPack(_resolver)); };
  { auto _e = selection_model(); if (_e) { _o->selection_model.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->selection_model[_i] = _e->Get(_i); } } };
  { auto _e = classification_model(); if (_e) { _o->classification_model.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->classification_model[_i] = _e->Get(_i); } } };
  { auto _e = embedding_model(); if (_e) { _o->embedding_model.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->embedding_model[_i] = _e->Get(_i); } } };
  { auto _e = selection_options(); if (_e) _o->selection_options = std::unique_ptr<SelectionModelOptionsT>(_e->UnPack(_resolver)); };
  { auto _e = classification_options(); if (_e) _o->classification_options = std::unique_ptr<ClassificationModelOptionsT>(_e->UnPack(_resolver)); };
  { auto _e = regex_model(); if (_e) _o->regex_model = std::unique_ptr<RegexModelT>(_e->UnPack(_resolver)); };
  { auto _e = datetime_model(); if (_e) _o->datetime_model = std::unique_ptr<DatetimeModelT>(_e->UnPack(_resolver)); };
  { auto _e = triggering_options(); if (_e) _o->triggering_options = std::unique_ptr<ModelTriggeringOptionsT>(_e->UnPack(_resolver)); };
  { auto _e = enabled_modes(); _o->enabled_modes = _e; };
  { auto _e = snap_whitespace_selections(); _o->snap_whitespace_selections = _e; };
  { auto _e = output_options(); if (_e) _o->output_options = std::unique_ptr<OutputOptionsT>(_e->UnPack(_resolver)); };
}

inline flatbuffers::Offset<Model> Model::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ModelT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateModel(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<Model> CreateModel(flatbuffers::FlatBufferBuilder &_fbb, const ModelT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ModelT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _locales = _o->locales.empty() ? 0 : _fbb.CreateString(_o->locales);
  auto _version = _o->version;
  auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name);
  auto _selection_feature_options = _o->selection_feature_options ? CreateFeatureProcessorOptions(_fbb, _o->selection_feature_options.get(), _rehasher) : 0;
  auto _classification_feature_options = _o->classification_feature_options ? CreateFeatureProcessorOptions(_fbb, _o->classification_feature_options.get(), _rehasher) : 0;
  auto _selection_model = _o->selection_model.size() ? _fbb.CreateVector(_o->selection_model) : 0;
  auto _classification_model = _o->classification_model.size() ? _fbb.CreateVector(_o->classification_model) : 0;
  auto _embedding_model = _o->embedding_model.size() ? _fbb.CreateVector(_o->embedding_model) : 0;
  auto _selection_options = _o->selection_options ? CreateSelectionModelOptions(_fbb, _o->selection_options.get(), _rehasher) : 0;
  auto _classification_options = _o->classification_options ? CreateClassificationModelOptions(_fbb, _o->classification_options.get(), _rehasher) : 0;
  auto _regex_model = _o->regex_model ? CreateRegexModel(_fbb, _o->regex_model.get(), _rehasher) : 0;
  auto _datetime_model = _o->datetime_model ? CreateDatetimeModel(_fbb, _o->datetime_model.get(), _rehasher) : 0;
  auto _triggering_options = _o->triggering_options ? CreateModelTriggeringOptions(_fbb, _o->triggering_options.get(), _rehasher) : 0;
  auto _enabled_modes = _o->enabled_modes;
  auto _snap_whitespace_selections = _o->snap_whitespace_selections;
  auto _output_options = _o->output_options ? CreateOutputOptions(_fbb, _o->output_options.get(), _rehasher) : 0;
  return libtextclassifier2::CreateModel(
      _fbb,
      _locales,
      _version,
      _name,
      _selection_feature_options,
      _classification_feature_options,
      _selection_model,
      _classification_model,
      _embedding_model,
      _selection_options,
      _classification_options,
      _regex_model,
      _datetime_model,
      _triggering_options,
      _enabled_modes,
      _snap_whitespace_selections,
      _output_options);
}

inline TokenizationCodepointRangeT *TokenizationCodepointRange::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new TokenizationCodepointRangeT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void TokenizationCodepointRange::UnPackTo(TokenizationCodepointRangeT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = start(); _o->start = _e; };
  { auto _e = end(); _o->end = _e; };
  { auto _e = role(); _o->role = _e; };
  { auto _e = script_id(); _o->script_id = _e; };
}

inline flatbuffers::Offset<TokenizationCodepointRange> TokenizationCodepointRange::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TokenizationCodepointRangeT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateTokenizationCodepointRange(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<TokenizationCodepointRange> CreateTokenizationCodepointRange(flatbuffers::FlatBufferBuilder &_fbb, const TokenizationCodepointRangeT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const TokenizationCodepointRangeT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _start = _o->start;
  auto _end = _o->end;
  auto _role = _o->role;
  auto _script_id = _o->script_id;
  return libtextclassifier2::CreateTokenizationCodepointRange(
      _fbb,
      _start,
      _end,
      _role,
      _script_id);
}

namespace FeatureProcessorOptions_ {

inline CodepointRangeT *CodepointRange::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new CodepointRangeT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void CodepointRange::UnPackTo(CodepointRangeT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = start(); _o->start = _e; };
  { auto _e = end(); _o->end = _e; };
}

inline flatbuffers::Offset<CodepointRange> CodepointRange::Pack(flatbuffers::FlatBufferBuilder &_fbb, const CodepointRangeT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateCodepointRange(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<CodepointRange> CreateCodepointRange(flatbuffers::FlatBufferBuilder &_fbb, const CodepointRangeT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const CodepointRangeT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _start = _o->start;
  auto _end = _o->end;
  return libtextclassifier2::FeatureProcessorOptions_::CreateCodepointRange(
      _fbb,
      _start,
      _end);
}

inline BoundsSensitiveFeaturesT *BoundsSensitiveFeatures::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new BoundsSensitiveFeaturesT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void BoundsSensitiveFeatures::UnPackTo(BoundsSensitiveFeaturesT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = enabled(); _o->enabled = _e; };
  { auto _e = num_tokens_before(); _o->num_tokens_before = _e; };
  { auto _e = num_tokens_inside_left(); _o->num_tokens_inside_left = _e; };
  { auto _e = num_tokens_inside_right(); _o->num_tokens_inside_right = _e; };
  { auto _e = num_tokens_after(); _o->num_tokens_after = _e; };
  { auto _e = include_inside_bag(); _o->include_inside_bag = _e; };
  { auto _e = include_inside_length(); _o->include_inside_length = _e; };
  { auto _e = score_single_token_spans_as_zero(); _o->score_single_token_spans_as_zero = _e; };
}

inline flatbuffers::Offset<BoundsSensitiveFeatures> BoundsSensitiveFeatures::Pack(flatbuffers::FlatBufferBuilder &_fbb, const BoundsSensitiveFeaturesT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateBoundsSensitiveFeatures(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<BoundsSensitiveFeatures> CreateBoundsSensitiveFeatures(flatbuffers::FlatBufferBuilder &_fbb, const BoundsSensitiveFeaturesT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const BoundsSensitiveFeaturesT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _enabled = _o->enabled;
  auto _num_tokens_before = _o->num_tokens_before;
  auto _num_tokens_inside_left = _o->num_tokens_inside_left;
  auto _num_tokens_inside_right = _o->num_tokens_inside_right;
  auto _num_tokens_after = _o->num_tokens_after;
  auto _include_inside_bag = _o->include_inside_bag;
  auto _include_inside_length = _o->include_inside_length;
  auto _score_single_token_spans_as_zero = _o->score_single_token_spans_as_zero;
  return libtextclassifier2::FeatureProcessorOptions_::CreateBoundsSensitiveFeatures(
      _fbb,
      _enabled,
      _num_tokens_before,
      _num_tokens_inside_left,
      _num_tokens_inside_right,
      _num_tokens_after,
      _include_inside_bag,
      _include_inside_length,
      _score_single_token_spans_as_zero);
}

inline AlternativeCollectionMapEntryT *AlternativeCollectionMapEntry::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new AlternativeCollectionMapEntryT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void AlternativeCollectionMapEntry::UnPackTo(AlternativeCollectionMapEntryT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = key(); if (_e) _o->key = _e->str(); };
  { auto _e = value(); if (_e) _o->value = _e->str(); };
}

inline flatbuffers::Offset<AlternativeCollectionMapEntry> AlternativeCollectionMapEntry::Pack(flatbuffers::FlatBufferBuilder &_fbb, const AlternativeCollectionMapEntryT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateAlternativeCollectionMapEntry(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<AlternativeCollectionMapEntry> CreateAlternativeCollectionMapEntry(flatbuffers::FlatBufferBuilder &_fbb, const AlternativeCollectionMapEntryT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const AlternativeCollectionMapEntryT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _key = _o->key.empty() ? 0 : _fbb.CreateString(_o->key);
  auto _value = _o->value.empty() ? 0 : _fbb.CreateString(_o->value);
  return libtextclassifier2::FeatureProcessorOptions_::CreateAlternativeCollectionMapEntry(
      _fbb,
      _key,
      _value);
}

}  // namespace FeatureProcessorOptions_

inline FeatureProcessorOptionsT *FeatureProcessorOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
  auto _o = new FeatureProcessorOptionsT();
  UnPackTo(_o, _resolver);
  return _o;
}

inline void FeatureProcessorOptions::UnPackTo(FeatureProcessorOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = num_buckets(); _o->num_buckets = _e; };
  { auto _e = embedding_size(); _o->embedding_size = _e; };
  { auto _e = embedding_quantization_bits(); _o->embedding_quantization_bits = _e; };
  { auto _e = context_size(); _o->context_size = _e; };
  { auto _e = max_selection_span(); _o->max_selection_span = _e; };
  { auto _e = chargram_orders(); if (_e) { _o->chargram_orders.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->chargram_orders[_i] = _e->Get(_i); } } };
  { auto _e = max_word_length(); _o->max_word_length = _e; };
  { auto _e = unicode_aware_features(); _o->unicode_aware_features = _e; };
  { auto _e = extract_case_feature(); _o->extract_case_feature = _e; };
  { auto _e = extract_selection_mask_feature(); _o->extract_selection_mask_feature = _e; };
  { auto _e = regexp_feature(); if (_e) { _o->regexp_feature.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->regexp_feature[_i] = _e->Get(_i)->str(); } } };
  { auto _e = remap_digits(); _o->remap_digits = _e; };
  { auto _e = lowercase_tokens(); _o->lowercase_tokens = _e; };
  { auto _e = selection_reduced_output_space(); _o->selection_reduced_output_space = _e; };
  { auto _e = collections(); if (_e) { _o->collections.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->collections[_i] = _e->Get(_i)->str(); } } };
  { auto _e = default_collection(); _o->default_collection = _e; };
  { auto _e = only_use_line_with_click(); _o->only_use_line_with_click = _e; };
  { auto _e = split_tokens_on_selection_boundaries(); _o->split_tokens_on_selection_boundaries = _e; };
  { auto _e = tokenization_codepoint_config(); if (_e) { _o->tokenization_codepoint_config.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->tokenization_codepoint_config[_i] = std::unique_ptr<TokenizationCodepointRangeT>(_e->Get(_i)->UnPack(_resolver)); } } };
  { auto _e = center_token_selection_method(); _o->center_token_selection_method = _e; };
  { auto _e = snap_label_span_boundaries_to_containing_tokens(); _o->snap_label_span_boundaries_to_containing_tokens = _e; };
  { auto _e = supported_codepoint_ranges(); if (_e) { _o->supported_codepoint_ranges.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->supported_codepoint_ranges[_i] = std::unique_ptr<libtextclassifier2::FeatureProcessorOptions_::CodepointRangeT>(_e->Get(_i)->UnPack(_resolver)); } } };
  { auto _e = internal_tokenizer_codepoint_ranges(); if (_e) { _o->internal_tokenizer_codepoint_ranges.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->internal_tokenizer_codepoint_ranges[_i] = std::unique_ptr<libtextclassifier2::FeatureProcessorOptions_::CodepointRangeT>(_e->Get(_i)->UnPack(_resolver)); } } };
  { auto _e = min_supported_codepoint_ratio(); _o->min_supported_codepoint_ratio = _e; };
  { auto _e = feature_version(); _o->feature_version = _e; };
  { auto _e = tokenization_type(); _o->tokenization_type = _e; };
  { auto _e = icu_preserve_whitespace_tokens(); _o->icu_preserve_whitespace_tokens = _e; };
  { auto _e = ignored_span_boundary_codepoints(); if (_e) { _o->ignored_span_boundary_codepoints.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->ignored_span_boundary_codepoints[_i] = _e->Get(_i); } } };
  { auto _e = bounds_sensitive_features(); if (_e) _o->bounds_sensitive_features = std::unique_ptr<libtextclassifier2::FeatureProcessorOptions_::BoundsSensitiveFeaturesT>(_e->UnPack(_resolver)); };
  { auto _e = allowed_chargrams(); if (_e) { _o->allowed_chargrams.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->allowed_chargrams[_i] = _e->Get(_i)->str(); } } };
  { auto _e = tokenize_on_script_change(); _o->tokenize_on_script_change = _e; };
}

inline flatbuffers::Offset<FeatureProcessorOptions> FeatureProcessorOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const FeatureProcessorOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
  return CreateFeatureProcessorOptions(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<FeatureProcessorOptions> CreateFeatureProcessorOptions(flatbuffers::FlatBufferBuilder &_fbb, const FeatureProcessorOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const FeatureProcessorOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _num_buckets = _o->num_buckets;
  auto _embedding_size = _o->embedding_size;
  auto _embedding_quantization_bits = _o->embedding_quantization_bits;
  auto _context_size = _o->context_size;
  auto _max_selection_span = _o->max_selection_span;
  auto _chargram_orders = _o->chargram_orders.size() ? _fbb.CreateVector(_o->chargram_orders) : 0;
  auto _max_word_length = _o->max_word_length;
  auto _unicode_aware_features = _o->unicode_aware_features;
  auto _extract_case_feature = _o->extract_case_feature;
  auto _extract_selection_mask_feature = _o->extract_selection_mask_feature;
  auto _regexp_feature = _o->regexp_feature.size() ? _fbb.CreateVectorOfStrings(_o->regexp_feature) : 0;
  auto _remap_digits = _o->remap_digits;
  auto _lowercase_tokens = _o->lowercase_tokens;
  auto _selection_reduced_output_space = _o->selection_reduced_output_space;
  auto _collections = _o->collections.size() ? _fbb.CreateVectorOfStrings(_o->collections) : 0;
  auto _default_collection = _o->default_collection;
  auto _only_use_line_with_click = _o->only_use_line_with_click;
  auto _split_tokens_on_selection_boundaries = _o->split_tokens_on_selection_boundaries;
  auto _tokenization_codepoint_config = _o->tokenization_codepoint_config.size() ? _fbb.CreateVector<flatbuffers::Offset<TokenizationCodepointRange>> (_o->tokenization_codepoint_config.size(), [](size_t i, _VectorArgs *__va) { return CreateTokenizationCodepointRange(*__va->__fbb, __va->__o->tokenization_codepoint_config[i].get(), __va->__rehasher); }, &_va ) : 0;
  auto _center_token_selection_method = _o->center_token_selection_method;
  auto _snap_label_span_boundaries_to_containing_tokens = _o->snap_label_span_boundaries_to_containing_tokens;
  auto _supported_codepoint_ranges = _o->supported_codepoint_ranges.size() ? _fbb.CreateVector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>> (_o->supported_codepoint_ranges.size(), [](size_t i, _VectorArgs *__va) { return CreateCodepointRange(*__va->__fbb, __va->__o->supported_codepoint_ranges[i].get(), __va->__rehasher); }, &_va ) : 0;
  auto _internal_tokenizer_codepoint_ranges = _o->internal_tokenizer_codepoint_ranges.size() ? _fbb.CreateVector<flatbuffers::Offset<libtextclassifier2::FeatureProcessorOptions_::CodepointRange>> (_o->internal_tokenizer_codepoint_ranges.size(), [](size_t i, _VectorArgs *__va) { return CreateCodepointRange(*__va->__fbb, __va->__o->internal_tokenizer_codepoint_ranges[i].get(), __va->__rehasher); }, &_va ) : 0;
  auto _min_supported_codepoint_ratio = _o->min_supported_codepoint_ratio;
  auto _feature_version = _o->feature_version;
  auto _tokenization_type = _o->tokenization_type;
  auto _icu_preserve_whitespace_tokens = _o->icu_preserve_whitespace_tokens;
  auto _ignored_span_boundary_codepoints = _o->ignored_span_boundary_codepoints.size() ? _fbb.CreateVector(_o->ignored_span_boundary_codepoints) : 0;
  auto _bounds_sensitive_features = _o->bounds_sensitive_features ? CreateBoundsSensitiveFeatures(_fbb, _o->bounds_sensitive_features.get(), _rehasher) : 0;
  auto _allowed_chargrams = _o->allowed_chargrams.size() ? _fbb.CreateVectorOfStrings(_o->allowed_chargrams) : 0;
  auto _tokenize_on_script_change = _o->tokenize_on_script_change;
  return libtextclassifier2::CreateFeatureProcessorOptions(
      _fbb,
      _num_buckets,
      _embedding_size,
      _embedding_quantization_bits,
      _context_size,
      _max_selection_span,
      _chargram_orders,
      _max_word_length,
      _unicode_aware_features,
      _extract_case_feature,
      _extract_selection_mask_feature,
      _regexp_feature,
      _remap_digits,
      _lowercase_tokens,
      _selection_reduced_output_space,
      _collections,
      _default_collection,
      _only_use_line_with_click,
      _split_tokens_on_selection_boundaries,
      _tokenization_codepoint_config,
      _center_token_selection_method,
      _snap_label_span_boundaries_to_containing_tokens,
      _supported_codepoint_ranges,
      _internal_tokenizer_codepoint_ranges,
      _min_supported_codepoint_ratio,
      _feature_version,
      _tokenization_type,
      _icu_preserve_whitespace_tokens,
      _ignored_span_boundary_codepoints,
      _bounds_sensitive_features,
      _allowed_chargrams,
      _tokenize_on_script_change);
}

inline const libtextclassifier2::Model *GetModel(const void *buf) {
  return flatbuffers::GetRoot<libtextclassifier2::Model>(buf);
}

inline const char *ModelIdentifier() {
  return "TC2 ";
}

inline bool ModelBufferHasIdentifier(const void *buf) {
  return flatbuffers::BufferHasIdentifier(
      buf, ModelIdentifier());
}

inline bool VerifyModelBuffer(
    flatbuffers::Verifier &verifier) {
  return verifier.VerifyBuffer<libtextclassifier2::Model>(ModelIdentifier());
}

inline void FinishModelBuffer(
    flatbuffers::FlatBufferBuilder &fbb,
    flatbuffers::Offset<libtextclassifier2::Model> root) {
  fbb.Finish(root, ModelIdentifier());
}

inline std::unique_ptr<ModelT> UnPackModel(
    const void *buf,
    const flatbuffers::resolver_function_t *res = nullptr) {
  return std::unique_ptr<ModelT>(GetModel(buf)->UnPack(res));
}

}  // namespace libtextclassifier2

#endif  // FLATBUFFERS_GENERATED_MODEL_LIBTEXTCLASSIFIER2_H_