#include <stdio.h>

#define KINO_USE_SHORT_NAMES
#include "KinoSearch/Util/ToolSet.h"

#define KINO_WANT_SKIPSTEPPER_VTABLE
#include "KinoSearch/Index/SkipStepper.r"

#include "KinoSearch/Store/Folder.r"
#include "KinoSearch/Store/InStream.r"
#include "KinoSearch/Store/OutStream.r"

SkipStepper*
SkipStepper_new()
{
    CREATE(self, SkipStepper, SKIPSTEPPER);

    /* init */
    self->doc_num  = 0;
    self->filepos  = 0;

    return self;
}

void
SkipStepper_reset(SkipStepper *self, u32_t doc_num, u64_t filepos)
{
    self->doc_num = doc_num;
    self->filepos = filepos;
}

void
SkipStepper_read_record(SkipStepper *self, InStream *instream)
{
    self->doc_num  += InStream_Read_VInt(instream);
    self->filepos  += InStream_Read_VLong(instream);
}

ByteBuf*
SkipStepper_to_string(SkipStepper *self)
{
    char *ptr = MALLOCATE(60, char);
    sprintf(ptr, "skip doc: %u file pointer: %" U64P, self->doc_num,
        self->filepos);
    return BB_new_steal(ptr, strlen(ptr), 60);
}

void
SkipStepper_write_record(SkipStepper *self, OutStream *outstream, 
    u32_t last_doc_num, u64_t last_filepos)
{
    const u32_t delta_doc_num = self->doc_num - last_doc_num;
    const u64_t delta_filepos = self->filepos - last_filepos;

    /* write delta doc num */
    OutStream_Write_VInt(outstream, delta_doc_num);

    /* write delta file pointer */
    OutStream_Write_VLong(outstream, (u64_t)delta_filepos);
}

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