#ifndef H_KINO_TERMSTEPPER
#define H_KINO_TERMSTEPPER 1

#include "KinoSearch/Util/Stepper.r"

typedef struct kino_TermStepper kino_TermStepper;
typedef struct KINO_TERMSTEPPER_VTABLE KINO_TERMSTEPPER_VTABLE;

struct kino_ByteBuf;
struct kino_InStream;
struct kino_Term;
struct kino_TermInfo;

KINO_FINAL_CLASS("KinoSearch::Index::TermStepper", "TermStepper", 
    "KinoSearch::Util::Stepper");

struct kino_TermStepper {
    KINO_TERMSTEPPER_VTABLE *_;
    KINO_STEPPER_MEMBER_VARS;

    struct kino_Term             *term;
    struct kino_TermInfo         *tinfo;
    struct kino_ByteBuf          *field;
    chy_i32_t                     skip_interval;
    chy_bool_t                    is_index;
};

/* Constructor.
 */
kino_TermStepper*
kino_TermStepper_new(const struct kino_ByteBuf *field,
                     chy_u32_t skip_interval, chy_bool_t is_index);

void
kino_TermStepper_destroy(kino_TermStepper *self);
KINO_METHOD("Kino_TermStepper_Destroy");

struct kino_ByteBuf*
kino_TermStepper_to_string(kino_TermStepper *self);
KINO_METHOD("Kino_TermStepper_To_String");

void
kino_TermStepper_read_record(kino_TermStepper *self, 
                             struct kino_InStream *instream);
KINO_METHOD("Kino_TermStepper_Read_Record");

void 
kino_TermStepper_write_record(kino_TermStepper* self, 
                              struct kino_OutStream *outstream, 
                              const char *term_text, 
                              size_t term_text_len,
                              const char *last_text, 
                              size_t last_text_len,
                              struct kino_TermInfo* tinfo, 
                              struct kino_TermInfo *last_tinfo,
                              chy_u64_t lex_filepos, 
                              chy_u64_t last_lex_filepos); 
KINO_METHOD("Kino_TermStepper_Write_Record");

/* Initialize.
 */
void
kino_TermStepper_reset(kino_TermStepper* self);
KINO_METHOD("Kino_TermStepper_Reset");

/* Setters...
 */
void
kino_TermStepper_set_tinfo(kino_TermStepper *self, 
                           const struct kino_TermInfo *tinfo);
KINO_METHOD("Kino_TermStepper_Set_TInfo");

void
kino_TermStepper_set_term(kino_TermStepper *self, 
                          const struct kino_Term *term);
KINO_METHOD("Kino_TermStepper_Set_Term");

void
kino_TermStepper_copy(kino_TermStepper *self, kino_TermStepper *other);
KINO_METHOD("Kino_TermStepper_Copy");

KINO_END_CLASS

#endif /* H_KINO_TERMSTEPPER */

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