/* Freetype GL - A C OpenGL Freetype engine * * Distributed under the OSI-approved BSD 2-Clause License. See accompanying * file `LICENSE` for more details. */ #ifndef __VECTOR_H__ #define __VECTOR_H__ #include #ifdef __cplusplus extern "C" { #endif #include #ifdef __cplusplus namespace ftgl { #endif /** * @file vector.h * @author Nicolas Rougier (Nicolas.Rougier@inria.fr) * * @defgroup vector Vector * * The vector structure and accompanying functions loosely mimic the STL C++ * vector class. It is used by @ref texture-atlas (for storing nodes), @ref * texture-font (for storing glyphs) and @ref font-manager (for storing fonts). * More information at http://www.cppreference.com/wiki/container/vector/start * * Example Usage: * @code * #include "vector.h" * * int main( int arrgc, char *argv[] ) * { * int i,j = 1; * vector_t * vector = vector_new( sizeof(int) ); * vector_push_back( &i ); * * j = * (int *) vector_get( vector, 0 ); * vector_delete( vector); * * return 0; * } * @endcode * * @{ */ /** * Generic vector structure. * * @memberof vector */ typedef struct vector_t { /** Pointer to dynamically allocated items. */ void * items; /** Number of items that can be held in currently allocated storage. */ size_t capacity; /** Number of items. */ size_t size; /** Size (in bytes) of a single item. */ size_t item_size; } vector_t; /** * Creates a new empty vector. * * @param item_size item size in bytes * @return a new empty vector * */ vector_t * vector_new( size_t item_size ); /** * Deletes a vector. * * @param self a vector structure * */ void vector_delete( vector_t *self ); /** * Returns a pointer to the item located at specified index. * * @param self a vector structure * @param index the index of the item to be returned * @return pointer on the specified item */ const void * vector_get( const vector_t *self, size_t index ); /** * Returns a pointer to the first item. * * @param self a vector structure * @return pointer on the first item */ const void * vector_front( const vector_t *self ); /** * Returns a pointer to the last item * * @param self a vector structure * @return pointer on the last item */ const void * vector_back( const vector_t *self ); /** * Check if an item is contained within the vector. * * @param self a vector structure * @param item item to be searched in the vector * @param cmp a pointer a comparison function * @return 1 if item is contained within the vector, 0 otherwise */ int vector_contains( const vector_t *self, const void *item, int (*cmp)(const void *, const void *) ); /** * Checks whether the vector is empty. * * @param self a vector structure * @return 1 if the vector is empty, 0 otherwise */ int vector_empty( const vector_t *self ); /** * Returns the number of items * * @param self a vector structure * @return number of items */ size_t vector_size( const vector_t *self ); /** * Reserve storage such that it can hold at last size items. * * @param self a vector structure * @param size the new storage capacity */ void vector_reserve( vector_t *self, const size_t size ); /** * Returns current storage capacity * * @param self a vector structure * @return storage capacity */ size_t vector_capacity( const vector_t *self ); /** * Decrease capacity to fit actual size. * * @param self a vector structure */ void vector_shrink( vector_t *self ); /** * Removes all items. * * @param self a vector structure */ void vector_clear( vector_t *self ); /** * Replace an item. * * @param self a vector structure * @param index the index of the item to be replaced * @param item the new item */ void vector_set( vector_t *self, const size_t index, const void *item ); /** * Erase an item. * * @param self a vector structure * @param index the index of the item to be erased */ void vector_erase( vector_t *self, const size_t index ); /** * Erase a range of items. * * @param self a vector structure * @param first the index of the first item to be erased * @param last the index of the last item to be erased */ void vector_erase_range( vector_t *self, const size_t first, const size_t last ); /** * Appends given item to the end of the vector. * * @param self a vector structure * @param item the item to be inserted */ void vector_push_back( vector_t *self, const void *item ); /** * Removes the last item of the vector. * * @param self a vector structure */ void vector_pop_back( vector_t *self ); /** * Resizes the vector to contain size items * * If the current size is less than size, additional items are appended and * initialized with value. If the current size is greater than size, the * vector is reduced to its first size elements. * * @param self a vector structure * @param size the new size */ void vector_resize( vector_t *self, const size_t size ); /** * Insert a single item at specified index. * * @param self a vector structure * @param index location before which to insert item * @param item the item to be inserted */ void vector_insert( vector_t *self, const size_t index, const void *item ); /** * Insert raw data at specified index. * * @param self a vector structure * @param index location before which to insert item * @param data a pointer to the items to be inserted * @param count the number of items to be inserted */ void vector_insert_data( vector_t *self, const size_t index, const void * data, const size_t count ); /** * Append raw data to the end of the vector. * * @param self a vector structure * @param data a pointer to the items to be inserted * @param count the number of items to be inserted */ void vector_push_back_data( vector_t *self, const void * data, const size_t count ); /** * Sort vector items according to cmp function. * * @param self a vector structure * @param cmp a pointer a comparison function */ void vector_sort( vector_t *self, int (*cmp)(const void *, const void *) ); /** @} */ #ifdef __cplusplus } } #endif #endif /* __VECTOR_H__ */