331 lines
6.7 KiB
C++
331 lines
6.7 KiB
C++
/* 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 <stdlib.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <stddef.h>
|
|
|
|
#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
|
|
*
|
|
* <b>Example Usage</b>:
|
|
* @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__ */
|