package KinoSearch::Index::NormsReader;
use strict;
use warnings;
use KinoSearch::Util::ToolSet;
use base qw( KinoSearch::Util::Class );

our %instance_vars = __PACKAGE__->init_instance_vars(
    # constructor params / members
    instream => undef,
    max_doc  => undef,
    # members
    bytes => undef,
);

sub init_instance {
    my $self = shift;
    confess("Internal error: max_doc is required")
        unless defined $self->{max_doc};
}

# return a reference to a byte-array of norms
sub get_bytes {
    my $self = shift;
    $self->_ensure_read;
    return \$self->{bytes};
}

# Lazily read in the raw array of norms.
sub _ensure_read {
    my $self = shift;
    if ( !defined $self->{bytes} ) {
        $self->{bytes} = $self->{instream}->lu_read( 'a' . $self->{max_doc} );
    }
}

1;

__END__

=begin devdocs

=head1 NAME

KinoSearch::Index::NormsReader - read field normalization data

=head1 DESCRIPTION

NormsReader accesses the encoded norms which are built up, one byte per
document, for indexed fields.

=head1 SEE ALSO

L<KinoSearch::Search::Similarity|KinoSearch::Search::Similarity>

=head1 TODO

Make "fake" norms possible, for fields where the norm is useless, like unique
id fields.

=head1 COPYRIGHT

Copyright 2005-2006 Marvin Humphrey

=head1 LICENSE, DISCLAIMER, BUGS, etc.

See L<KinoSearch|KinoSearch> version 0.08.

=end devdocs
=cut