libglez/ftgl/vector.h
2017-12-07 17:07:55 +03:00

271 lines
6.2 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__ */