#include "KinoSearch/Util/ToolSet.h"

#define KINO_WANT_TERM_VTABLE
#include "KinoSearch/Index/Term.r"

Term*
Term_new(const ByteBuf *field, const ByteBuf *text) 
{
    CREATE(self, Term, TERM);

    /* assign */
    self->field = BB_CLONE(field);
    self->text  = BB_CLONE(text);

    return self;
}

Term*
Term_new_str(const char *field, const char *text) 
{
    CREATE(self, Term, TERM);

    /* assign */
    self->field = BB_new_str(field, strlen(field));
    self->text  = BB_new_str(text,  strlen(text));

    return self;
}

void
Term_serialize(Term *self, ByteBuf *target)
{
    BB_Serialize(self->field, target);
    BB_Serialize(self->text, target);
}

Term*
Term_deserialize(ViewByteBuf *serialized)
{
    CREATE(self, Term, TERM);

    self->field = BB_deserialize(serialized);
    self->text  = BB_deserialize(serialized);

    return self;
}

ByteBuf*
Term_get_field(Term *self)
{
    return self->field;
}

ByteBuf*
Term_get_text(Term *self)
{
    return self->text;
}

void
Term_copy(Term *self, const Term *other)
{
    BB_Copy_BB(self->field, other->field);
    BB_Copy_BB(self->text,  other->text);
}

kino_Term*
Term_clone(Term *self)
{
    return Term_new(self->field, self->text);
}

ByteBuf*
Term_to_string(Term *self)
{
    ByteBuf *const field = self->field;
    ByteBuf *const text  = self->text;
    u32_t len = field->len + text->len + 1;
    ByteBuf *retval = BB_new(len);
    char *ptr = retval->ptr;

    memcpy(ptr, field->ptr, field->len);
    ptr += field->len;
    *ptr++ = ':';
    memcpy(ptr, text->ptr, text->len);
    ptr += text->len;
    *ptr++ = '\0';
    retval->len = len;

    return retval;
}

bool_t
Term_equals(Term *self, Term *other)
{
    if (   BB_Equals(self->field, (Obj*)other->field)
        && BB_Equals(self->text, (Obj*)other->text)
    ) {
        return true;
    }
    else {
        return false;
    }
}

void
Term_destroy(Term *self)
{
    REFCOUNT_DEC(self->field);
    REFCOUNT_DEC(self->text);
    free(self);
}

/* Copyright 2006-2007 Marvin Humphrey
 *
 * This program is free software; you can redistribute it and/or modify
 * under the same terms as Perl itself.
 */