#include "KinoSearch/Util/ToolSet.h"

#include <string.h>

#define KINO_WANT_RAWPOSTING_VTABLE
#include "KinoSearch/Posting/RawPosting.r"
#include "KinoSearch/Store/OutStream.r"
#include "KinoSearch/Util/StringHelper.h"

RawPosting KINO_RAWPOSTING_BLANK = { 
    &RAWPOSTING, 
    1, 
    NULL,                  /* sim */
    0,                     /* doc_num */
    1,                     /* freq */
    0,                     /* content_len */
    0,                     /* aux_len */
    { '\0' }               /* blob */
};


RawPosting*
RawPost_new(void *pre_allocated_memory, u32_t doc_num, u32_t freq, 
            char *term_text, size_t term_text_len)
{
    RawPosting *self    = (RawPosting*)pre_allocated_memory;
    self->_             = &RAWPOSTING;
    self->refcount      = 1;
    self->doc_num       = doc_num;
    self->freq          = freq;
    self->content_len   = term_text_len;
    self->aux_len       = 0;
    memcpy(&self->blob, term_text, term_text_len);

    return self;
}

void
RawPost_destroy(RawPosting *self)
{
    UNUSED_VAR(self);
    CONFESS("Illegal attempt to destroy RawPosting object");
}

void
RawPost_write_record(RawPosting *self, OutStream *outstream, 
                     u32_t last_doc_num)
{
    const u32_t delta_doc = self->doc_num - last_doc_num;
    char  *const aux_content = self->blob + self->content_len;
    if (self->freq == 1) {
        const u32_t doc_code = (delta_doc << 1) | 1;
        OutStream_Write_VInt(outstream, doc_code);
    }
    else {
        const u32_t doc_code = delta_doc << 1;
        OutStream_Write_VInt(outstream, doc_code);
        OutStream_Write_VInt(outstream, self->freq);
    }
    OutStream_Write_Bytes(outstream, aux_content, self->aux_len);
}

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