/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */



#define C_LUCY_REGEXTOKENIZER
#define C_LUCY_DOC
#define C_LUCY_DOCREADER
#define C_LUCY_DEFAULTDOCREADER
#define C_LUCY_INVERTER
#define C_LUCY_INVERTERENTRY
#define CFISH_USE_SHORT_NAMES
#define LUCY_USE_SHORT_NAMES



#include <string.h>

#include "charmony.h"

#include "Lucy/Analysis/RegexTokenizer.h"
#include "Lucy/Document/Doc.h"
#include "Lucy/Index/DocReader.h"
#include "Lucy/Index/Inverter.h"
#include "Clownfish/Blob.h"
#include "Clownfish/String.h"
#include "Clownfish/Err.h"
#include "Clownfish/Hash.h"
#include "Clownfish/HashIterator.h"
#include "Clownfish/Num.h"
#include "Clownfish/Vector.h"
#include "Clownfish/Class.h"
#include "Clownfish/Util/Memory.h"
#include "Clownfish/Util/StringHelper.h"
#include "Lucy/Analysis/Token.h"
#include "Lucy/Analysis/Inversion.h"
#include "Lucy/Document/HitDoc.h"
#include "Lucy/Index/Segment.h"
#include "Lucy/Plan/FieldType.h"
#include "Lucy/Plan/Schema.h"
#include "Lucy/Store/InStream.h"
#include "Lucy/Store/OutStream.h"
#include "Lucy/Util/Freezer.h"

bool
RegexTokenizer_is_available(void) {
    return false;
}

RegexTokenizer*
(*GOLUCY_RegexTokenizer_init_BRIDGE)(RegexTokenizer *self, String *pattern);

RegexTokenizer*
RegexTokenizer_init(RegexTokenizer *self, String *pattern) {
    return GOLUCY_RegexTokenizer_init_BRIDGE(self, pattern);
}

RegexTokenizer_Destroy_t GOLUCY_RegexTokenizer_Destroy_BRIDGE;

void
RegexTokenizer_Destroy_IMP(RegexTokenizer *self) {
    GOLUCY_RegexTokenizer_Destroy_BRIDGE(self);
}

RegexTokenizer_Tokenize_Utf8_t GOLUCY_RegexTokenizer_Tokenize_Utf8_BRIDGE;

void
RegexTokenizer_Tokenize_Utf8_IMP(RegexTokenizer *self, const char *string,
                                 size_t string_len, Inversion *inversion) {
    GOLUCY_RegexTokenizer_Tokenize_Utf8_BRIDGE(self, string, string_len, inversion);
}

/********************************** Doc ********************************/

Doc*
(*GOLUCY_Doc_init_BRIDGE)(Doc *self, void *fields, int32_t doc_id);

Doc*
Doc_init(Doc *self, void *fields, int32_t doc_id) {
    return GOLUCY_Doc_init_BRIDGE(self, fields, doc_id);
}

Doc_Set_Fields_t GOLUCY_Doc_Set_Fields_BRIDGE;

void
Doc_Set_Fields_IMP(Doc *self, void *fields) {
    GOLUCY_Doc_Set_Fields_BRIDGE(self, fields);
}

Doc_Get_Size_t GOLUCY_Doc_Get_Size_BRIDGE;

uint32_t
Doc_Get_Size_IMP(Doc *self) {
    return GOLUCY_Doc_Get_Size_BRIDGE(self);
}

Doc_Store_t GOLUCY_Doc_Store_BRIDGE;

void
Doc_Store_IMP(Doc *self, String *field, Obj *value) {
    GOLUCY_Doc_Store_BRIDGE(self, field, value);
}

Doc_Serialize_t GOLUCY_Doc_Serialize_BRIDGE;

void
Doc_Serialize_IMP(Doc *self, OutStream *outstream) {
    GOLUCY_Doc_Serialize_BRIDGE(self, outstream);
}

Doc_Deserialize_t GOLUCY_Doc_Deserialize_BRIDGE;

Doc*
Doc_Deserialize_IMP(Doc *self, InStream *instream) {
    return GOLUCY_Doc_Deserialize_BRIDGE(self, instream);
}

Doc_Extract_t GOLUCY_Doc_Extract_BRIDGE;

Obj*
Doc_Extract_IMP(Doc *self, String *field) {
    return GOLUCY_Doc_Extract_BRIDGE(self, field);
}

Doc_Field_Names_t GOLUCY_Doc_Field_Names_BRIDGE;

Vector*
Doc_Field_Names_IMP(Doc *self) {
    return GOLUCY_Doc_Field_Names_BRIDGE(self);
}

Hash*
Doc_Dump_IMP(Doc *self) {
    UNUSED_VAR(self);
    THROW(ERR, "TODO");
    UNREACHABLE_RETURN(Hash*);
}

Doc*
Doc_Load_IMP(Doc *self, Obj *dump) {
    UNUSED_VAR(self);
    UNUSED_VAR(dump);
    THROW(ERR, "TODO");
    UNREACHABLE_RETURN(Doc*);
}

Doc_Equals_t GOLUCY_Doc_Equals_BRIDGE;

bool
Doc_Equals_IMP(Doc *self, Obj *other) {
    return GOLUCY_Doc_Equals_BRIDGE(self, other);
}

Doc_Destroy_t GOLUCY_Doc_Destroy_BRIDGE;

void
Doc_Destroy_IMP(Doc *self) {
    GOLUCY_Doc_Destroy_BRIDGE(self);
}

/**************************** DocReader *****************************/

DefDocReader_Fetch_Doc_t GOLUCY_DefDocReader_Fetch_Doc_BRIDGE;

HitDoc*
DefDocReader_Fetch_Doc_IMP(DefaultDocReader *self, int32_t doc_id) {
    return GOLUCY_DefDocReader_Fetch_Doc_BRIDGE(self, doc_id);
}

/**************************** Inverter *****************************/

Inverter_Invert_Doc_t GOLUCY_Inverter_Invert_Doc_BRIDGE;

void
Inverter_Invert_Doc_IMP(Inverter *self, Doc *doc) {
    GOLUCY_Inverter_Invert_Doc_BRIDGE(self, doc);
}


