The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Git::PurePerl::PackIndex;
use Moose;
use MooseX::StrictConstructor;
use IO::File;
use namespace::autoclean;

has 'filename' =>
    ( is => 'ro', isa => 'Path::Class::File', required => 1, coerce => 1 );

has 'fh' => ( is => 'rw', isa => 'IO::File', required => 0 );

has 'offsets' =>
    ( is => 'rw', isa => 'ArrayRef[Int]', required => 0, auto_deref => 1, );
has 'size' => ( is => 'rw', isa => 'Int', required => 0 );

my $FanOutCount   = 256;
my $SHA1Size      = 20;
my $IdxOffsetSize = 4;
my $OffsetSize    = 4;
my $CrcSize       = 4;
my $OffsetStart   = $FanOutCount * $IdxOffsetSize;
my $SHA1Start     = $OffsetStart + $OffsetSize;
my $EntrySize     = $OffsetSize + $SHA1Size;
my $EntrySizeV2   = $SHA1Size + $CrcSize + $OffsetSize;

sub BUILD {
    my $self     = shift;
    my $filename = $self->filename;

    my $fh = IO::File->new($filename) || confess($!);
    $self->fh($fh);

    my @offsets = (0);
    $fh->seek( $self->global_offset, 0 );
    foreach my $i ( 0 .. $FanOutCount - 1 ) {
        $fh->read( my $data, $IdxOffsetSize );
        my $offset = unpack( 'N', $data );
        confess("pack has discontinuous index") if $offset < $offsets[-1];
        push @offsets, $offset;
    }
    $self->offsets( \@offsets );
    $self->size( $offsets[-1] );
}

__PACKAGE__->meta->make_immutable;