#include "KinoSearch/Util/ToolSet.h"

#define KINO_WANT_TERMSCORER_VTABLE
#include "KinoSearch/Search/TermScorer.r"

#include "KinoSearch/Posting.r"
#include "KinoSearch/Index/PostingList.r"
#include "KinoSearch/Search/Similarity.r"
#include "KinoSearch/Search/ScoreProx.r"
#include "KinoSearch/Search/Tally.r"
#include "KinoSearch/Util/Native.r"

void
TermScorer_destroy(TermScorer *self) 
{
    REFCOUNT_DEC(self->sim);
    REFCOUNT_DEC(self->tally);
    REFCOUNT_DEC(self->sprox);
    REFCOUNT_DEC(self->plist);
    REFCOUNT_DEC(self->weight);
    free(self->score_cache);
    free(self);
}

bool_t
TermScorer_next(TermScorer* self) 
{
    if (PList_Next(self->plist)) {
        self->posting = PList_Get_Posting(self->plist);
        return true;
    }
    else {
        /* Reclaim resources a little early. */
        REFCOUNT_DEC(self->plist);
        self->plist = NULL;
        return false;
    }
}

bool_t
TermScorer_skip_to(TermScorer *self, u32_t target)
{
    if (PList_Skip_To(self->plist, target)) {
        self->posting = PList_Get_Posting(self->plist);
        return true;
    }
    else {
        return false;
    }
}

u32_t 
TermScorer_doc(TermScorer* self) 
{
    return self->posting->doc_num;
}

Tally*
TermScorer_tally(TermScorer* self) 
{
    return self->tally;
}

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