/*
index.h - compact version of famous library mpg123
Copyright (C) 2017 Uncle Mike

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
*/

#ifndef INDEX_H
#define INDEX_H

typedef struct frame_index_s
{
	mpg_off_t	*data;	// actual data, the frame positions
	mpg_off_t	step;	// advancement in frame number per index point
	mpg_off_t	next;	// frame offset supposed to come next into the index
	size_t	size;	// total number of possible entries
	size_t	fill;	// number of used entries
	size_t	grow_size;// if > 0: index allowed to grow on need with these steps, instead of lowering resolution
} frame_index_t;

// the condition for a framenum to be appended to the index.
#define FI_NEXT( fi, framenum )	((fi).size && framenum == (fi).next)

// initialize stuff, set things to zero and NULL...
void fi_init( frame_index_t *fi );
// deallocate/zero things.
void fi_exit( frame_index_t *fi );
// prepare a given size, preserving current fill, if possible.
int fi_resize( frame_index_t *fi, size_t newsize );
// append a frame position, reducing index density if needed.
void fi_add( frame_index_t *fi, mpg_off_t pos );
// replace the frame index
int fi_set( frame_index_t *fi, mpg_off_t *offsets, mpg_off_t step, size_t fill );
// empty the index (setting fill=0 and step=1), but keep current size.
void fi_reset( frame_index_t *fi );

#endif//INDEX_H