/* paged_array.h PUBLIC DOMAIN 2007,8,10 tom.viza@gmail.com */ /* I, Tom Vajzovic, am the author of this software and its documentation */ /* and permanently abandon all copyright and other intellectual property */ /* rights in them, including the right to be identified as the author. */ /* I am fairly certain that this software does what the documentation */ /* says it does, but I do not guarantee that it does, or that it does */ /* what you think it should. I do not guarantee that it will not have */ /* undesirable side effects. */ /* You are free to use, modify and distribute this software as you */ /* please, but you do so at your own risk. If you remove or hide this */ /* warning then you may be responsible for any problems that are */ /* encountered by those who obtain the software through you. */ #ifndef PAGED_ARRAY_H_INCLUDED #define PAGED_ARRAY_H_INCLUDED #include /* for size_t, ptrdiff_t, NULL */ struct paged_array_s { size_t len; size_t elem_size; size_t elems_page; union { char *page; struct paged_array_s *pages; } ptr; }; typedef struct paged_array_s paged_array_t; #define PAGED_ARRAY_INIT_EMPTY(elem_size,elems_page) { 0, (elem_size), (elems_page), {NULL} } void paged_array_init_empty ( paged_array_t *pa, size_t elem_size, size_t elems_page); void paged_array_init ( paged_array_t *pa, size_t elem_size, size_t elems_page, const void *input_array, size_t len); void paged_array_destroy ( paged_array_t *pa); paged_array_t *paged_array_new_empty ( size_t elem_size, size_t elems_page); paged_array_t *paged_array_new ( size_t elem_size, size_t elems_page, const void *input_array, size_t len); void paged_array_delete ( paged_array_t *pa); size_t paged_array_length (const paged_array_t *pa); void *paged_array_index (const paged_array_t *pa, size_t index); void paged_array_extract (const paged_array_t *pa, void *output_array, size_t first, size_t num); void *paged_array_new_array_all (const paged_array_t *pa); void *paged_array_new_array (const paged_array_t *pa, size_t first, size_t num); ptrdiff_t paged_array_find (const paged_array_t *pa, int (*comp_fn)(const void*,const void*,size_t), const void *user); void paged_array_callback_all (const paged_array_t *pa, void (*callback)(void*,void*), void *user); void paged_array_callback (const paged_array_t *pa, void (*callback)(void*,void*), void *user, size_t first, size_t num); void paged_array_set_length ( paged_array_t *pa, size_t len); void *paged_array_extend1 ( paged_array_t *pa); void *paged_array_append1 ( paged_array_t *pa, const void *elem); void paged_array_append ( paged_array_t *pa, const void *input_array, size_t num); void *paged_array_overwrite1 ( paged_array_t *pa, size_t index, const void *elem); void paged_array_overwrite ( paged_array_t *pa, const void *input_array, size_t first, size_t num); #endif /* PAGED_ARRAY_H_INCLUDED */