Blame bibutils/vplist.h

Packit 89ede9
/*
Packit 89ede9
 * vplist.h
Packit 89ede9
 *
Packit 89ede9
 * generic container to hold a list of pointers to void
Packit 89ede9
 *
Packit 89ede9
 * Version: 1/9/2017
Packit 89ede9
 *
Packit 89ede9
 * Copyright (c) Chris Putnam 2011-2018
Packit 89ede9
 *
Packit 89ede9
 * Source code released under the GPL version 2
Packit 89ede9
 *
Packit 89ede9
 */
Packit 89ede9
Packit 89ede9
#ifndef VPLIST_H
Packit 89ede9
#define VPLIST_H
Packit 89ede9
Packit 89ede9
#define VPLIST_MEMERR (-1)
Packit 89ede9
#define VPLIST_OK     (0)
Packit 89ede9
Packit 89ede9
typedef int vplist_index;
Packit 89ede9
Packit 89ede9
typedef struct vplist {
Packit 89ede9
	vplist_index n, max;
Packit 89ede9
	void **data;
Packit 89ede9
} vplist;
Packit 89ede9
Packit 89ede9
#define vplist_found( vpl, n ) ( n!=-1 )
Packit 89ede9
#define vplist_notfound( vpl, n ) ( n==-1 )
Packit 89ede9
Packit 89ede9
typedef void (*vplist_ptrfree)(void*);
Packit 89ede9
Packit 89ede9
vplist *     vplist_new( void );
Packit 89ede9
Packit 89ede9
void   vplist_init          ( vplist *vpl );
Packit 89ede9
int    vplist_add           ( vplist *vpl, void *v );
Packit 89ede9
int    vplist_fill          ( vplist *vpl, vplist_index n, void *v );
Packit 89ede9
int    vplist_copy          ( vplist *to,  vplist *from );
Packit 89ede9
int    vplist_append        ( vplist *vpl, vplist *add );
Packit 89ede9
int    vplist_insert_list   ( vplist *vpl, vplist_index pos, vplist *add );
Packit 89ede9
void * vplist_get           ( vplist *vpl, vplist_index n );
Packit 89ede9
void   vplist_set           ( vplist *vpl, vplist_index n, void *v );
Packit 89ede9
void   vplist_swap          ( vplist *vpl, vplist_index n1, vplist_index n2 );
Packit 89ede9
int    vplist_remove        ( vplist *vpl, vplist_index n );
Packit 89ede9
int    vplist_removefn      ( vplist *vpl, vplist_index n, vplist_ptrfree vpf );
Packit 89ede9
int    vplist_removevp      ( vplist *vpl, void *v );
Packit 89ede9
int    vplist_removevpfn    ( vplist *vpl, void *v, vplist_ptrfree vpf );
Packit 89ede9
void   vplist_remove_rangefn( vplist *vpl, vplist_index start, vplist_index endplusone, vplist_ptrfree vpf );
Packit 89ede9
void   vplist_remove_range  ( vplist *vpl, vplist_index start, vplist_index endplusone );
Packit 89ede9
Packit 89ede9
vplist_index vplist_find( vplist *vpl, void *v );
Packit 89ede9
Packit 89ede9
/*
Packit 89ede9
 * vplist_empty does not free space
Packit 89ede9
 *
Packit 89ede9
 * if members require their own free calls, then call vplist_emptyfn()
Packit 89ede9
 *
Packit 89ede9
 * void
Packit 89ede9
 * member_free( void *v )
Packit 89ede9
 * {
Packit 89ede9
 *     member *m = ( member * ) v;
Packit 89ede9
 *     member_free( m );
Packit 89ede9
 *     free( m );
Packit 89ede9
 * }
Packit 89ede9
 * vplist_emptyfn( &vpl, member_free );
Packit 89ede9
 *
Packit 89ede9
 * if members are simply allocated with malloc(), then use free()
Packit 89ede9
 *
Packit 89ede9
 * vplist_emptyfn( &vpl, free );
Packit 89ede9
 */
Packit 89ede9
void   vplist_empty  ( vplist *vpl );
Packit 89ede9
void   vplist_emptyfn( vplist *vpl, vplist_ptrfree fn );
Packit 89ede9
/*
Packit 89ede9
 * vplist_free frees the space for the data array of void * elements.
Packit 89ede9
 *
Packit 89ede9
 * if members require their own free calls, then call vplist_freefn()
Packit 89ede9
 */
Packit 89ede9
void vplist_free  ( vplist *vpl );
Packit 89ede9
void vplist_freefn( vplist *vpl, vplist_ptrfree fn );
Packit 89ede9
/*
Packit 89ede9
 * vplist_delete does vplist_free and deallocates the struct
Packit 89ede9
 * vplist * and replaces with NULL.
Packit 89ede9
 */
Packit 89ede9
void vplist_delete  ( vplist **vpl );
Packit 89ede9
void vplist_deletefn( vplist **vpl, vplist_ptrfree fn );
Packit 89ede9
Packit 89ede9
#endif