#include "KinoSearch/Util/ToolSet.h"

#define KINO_WANT_SCOREDOC_VTABLE
#include "KinoSearch/Search/ScoreDoc.r"

ScoreDoc*
ScoreDoc_new(u32_t doc_num, float score)
{
    CREATE(self, ScoreDoc, SCOREDOC);
    self->doc_num     = doc_num;
    self->score       = score;
    return self;
}

void
ScoreDoc_serialize(ScoreDoc *self, ByteBuf *target)
{
    char *ptr;
    size_t new_len = target->len + sizeof(u32_t) + sizeof(float);

    /* add space */
    BB_GROW(target, new_len);
    ptr = BBEND(target);
    target->len = new_len;

    /* doc_num */
    MATH_ENCODE_U32(self->doc_num, ptr);
    ptr += sizeof(u32_t);

    /* score */
    /* NOTE: This is NOT PORTABLE. */
    memcpy(ptr, &self->score, sizeof(float));
}

ScoreDoc*
ScoreDoc_deserialize(ViewByteBuf *serialized)
{
    CREATE(self, ScoreDoc, SCOREDOC);

    /* sanity check */
    if (serialized->len < sizeof(u32_t) + sizeof(float))
        CONFESS("Not enough chars in serialization: %d", serialized->len);

    /* decode doc_num */
    MATH_DECODE_U32(self->doc_num, serialized->ptr);
    serialized->ptr += sizeof(u32_t);
    serialized->len -= sizeof(u32_t);

    /* decode score */
    memcpy(&self->score, serialized->ptr, sizeof(float));
    serialized->ptr += sizeof(float);
    serialized->len -= sizeof(float);

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