Annotation of embedaddon/strongswan/src/libstrongswan/collections/array.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2014 Tobias Brunner
        !             3:  * HSR Hochschule fuer Technik Rapperswil
        !             4:  *
        !             5:  * Copyright (C) 2013 Martin Willi
        !             6:  * Copyright (C) 2013 revosec AG
        !             7:  *
        !             8:  * This program is free software; you can redistribute it and/or modify it
        !             9:  * under the terms of the GNU General Public License as published by the
        !            10:  * Free Software Foundation; either version 2 of the License, or (at your
        !            11:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
        !            12:  *
        !            13:  * This program is distributed in the hope that it will be useful, but
        !            14:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            15:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            16:  * for more details.
        !            17:  */
        !            18: 
        !            19: /**
        !            20:  * @defgroup array array
        !            21:  * @{ @ingroup collections
        !            22:  */
        !            23: 
        !            24: #ifndef ARRAY_H_
        !            25: #define ARRAY_H_
        !            26: 
        !            27: #include <collections/enumerator.h>
        !            28: 
        !            29: /**
        !            30:  * Variable sized array with fixed size elements.
        !            31:  *
        !            32:  * An array is a primitive object with associated functions to avoid the
        !            33:  * overhead of an object with methods. It is efficient in memory usage, but
        !            34:  * less efficient than a linked list in manipulating elements.
        !            35:  */
        !            36: typedef struct array_t array_t;
        !            37: 
        !            38: typedef enum array_idx_t array_idx_t;
        !            39: 
        !            40: /**
        !            41:  * Special array index values for insert/remove.
        !            42:  */
        !            43: enum array_idx_t {
        !            44:        ARRAY_HEAD = 0,
        !            45:        ARRAY_TAIL = -1,
        !            46: };
        !            47: 
        !            48: /**
        !            49:  * Callback function invoked for each array element.
        !            50:  *
        !            51:  * Data is a pointer to the array element. If this is a pointer based array,
        !            52:  * (esize is zero), data is the pointer itself.
        !            53:  *
        !            54:  * @param data                 pointer to array data, or the pointer itself
        !            55:  * @param idx                  array index
        !            56:  * @param user                 user data passed with callback
        !            57:  */
        !            58: typedef void (*array_callback_t)(void *data, int idx, void *user);
        !            59: 
        !            60: /**
        !            61:  * Create a array instance.
        !            62:  *
        !            63:  * Elements get tight packed to each other. If any alignment is required, pass
        !            64:  * appropriate padding to each element. The reserved space does not affect
        !            65:  * array_count(), but just preallocates buffer space.
        !            66:  *
        !            67:  * @param esize                        element size for this array, use 0 for a pointer array
        !            68:  * @param reserve              number of items to allocate space for
        !            69:  * @return                             array instance
        !            70:  */
        !            71: array_t *array_create(u_int esize, uint8_t reserve);
        !            72: 
        !            73: /**
        !            74:  * Get the number of elements currently in the array.
        !            75:  *
        !            76:  * @return                             number of elements
        !            77:  */
        !            78: int array_count(array_t *array);
        !            79: 
        !            80: /**
        !            81:  * Compress an array, remove unused head/tail space.
        !            82:  *
        !            83:  * @param array                        array to compress, or NULL
        !            84:  */
        !            85: void array_compress(array_t *array);
        !            86: 
        !            87: /**
        !            88:  * Create an enumerator over an array.
        !            89:  *
        !            90:  * The enumerator enumerates directly over the array element (pass a pointer to
        !            91:  * element types), unless the array is pointer based. If zero is passed as
        !            92:  * element size during construction, the enumerator enumerates over the
        !            93:  * dereferenced pointer values.
        !            94:  *
        !            95:  * @param array                        array to create enumerator for, or NULL
        !            96:  * @return                             enumerator, over elements or pointers
        !            97:  */
        !            98: enumerator_t* array_create_enumerator(array_t *array);
        !            99: 
        !           100: /**
        !           101:  * Remove an element at enumerator position.
        !           102:  *
        !           103:  * @warning For **value based** arrays don't use the pointer returned by
        !           104:  * enumerate() anymore after calling this function.  For performance reasons
        !           105:  * that pointer will point to internal data structures that get modified when
        !           106:  * this function is called.
        !           107:  *
        !           108:  * @param array                        array to remove element in
        !           109:  * @param enumerator   enumerator position, from array_create_enumerator()
        !           110:  */
        !           111: void array_remove_at(array_t *array, enumerator_t *enumerator);
        !           112: 
        !           113: /**
        !           114:  * Insert an element to an array.
        !           115:  *
        !           116:  * If the array is pointer based (esize = 0), the pointer itself is appended.
        !           117:  * Otherwise the element gets copied from the pointer.
        !           118:  * The idx must be either within array_count() or one above to append the item.
        !           119:  * Passing -1 has the same effect as passing array_count(), i.e. appends the
        !           120:  * item. It is always valid to pass idx 0 to prepend the item.
        !           121:  *
        !           122:  * @param array                        array to append element to
        !           123:  * @param idx                  index to insert item at
        !           124:  * @param data                 pointer to array element to copy
        !           125:  */
        !           126: void array_insert(array_t *array, int idx, void *data);
        !           127: 
        !           128: /**
        !           129:  * Create an pointer based array if it does not exist, insert pointer.
        !           130:  *
        !           131:  * This is a convenience function for insert a pointer and implicitly
        !           132:  * create a pointer based array if array is NULL. Array is set the the newly
        !           133:  * created array, if any.
        !           134:  *
        !           135:  * @param array                        pointer to array reference, potentially NULL
        !           136:  * @param idx                  index to insert item at
        !           137:  * @param ptr                  pointer to append
        !           138:  */
        !           139: void array_insert_create(array_t **array, int idx, void *ptr);
        !           140: 
        !           141: /**
        !           142:  * Create a value based array if it does not exist, insert value.
        !           143:  *
        !           144:  * This is a convenience function to insert a value and implicitly
        !           145:  * create a value based array if array is NULL. Array is set the the newly
        !           146:  * created array, if any.
        !           147:  *
        !           148:  * @param array                        pointer to array reference, potentially NULL
        !           149:  * @param esize                        element size of this array
        !           150:  * @param idx                  index to insert item at
        !           151:  * @param val                  pointer to value to insert
        !           152:  */
        !           153: void array_insert_create_value(array_t **array, u_int esize,
        !           154:                                                           int idx, void *val);
        !           155: 
        !           156: /**
        !           157:  * Insert all items from an enumerator to an array.
        !           158:  *
        !           159:  * @param array                        array to add items to
        !           160:  * @param idx                  index to insert each item with
        !           161:  * @param enumerator   enumerator over void*, gets destroyed
        !           162:  */
        !           163: void array_insert_enumerator(array_t *array, int idx, enumerator_t *enumerator);
        !           164: 
        !           165: /**
        !           166:  * Get an element from the array.
        !           167:  *
        !           168:  * If data is given, the element is copied to that position.
        !           169:  *
        !           170:  * @param array                        array to get element from, or NULL
        !           171:  * @param idx                  index of the item to get
        !           172:  * @param data                 data to copy element to, or NULL
        !           173:  * @return                             TRUE if idx valid and item returned
        !           174:  */
        !           175: bool array_get(array_t *array, int idx, void *data);
        !           176: 
        !           177: /**
        !           178:  * Remove an element from the array.
        !           179:  *
        !           180:  * If data is given, the element is copied to that position.
        !           181:  *
        !           182:  * @param array                        array to remove element from, or NULL
        !           183:  * @param idx                  index of the item to remove
        !           184:  * @param data                 data to copy element to, or NULL
        !           185:  * @return                             TRUE if idx existed and item removed
        !           186:  */
        !           187: bool array_remove(array_t *array, int idx, void *data);
        !           188: 
        !           189: /**
        !           190:  * Sort the array.
        !           191:  *
        !           192:  * The comparison function must return an integer less than, equal to, or
        !           193:  * greater than zero if the first argument is considered to be respectively less
        !           194:  * than, equal to, or greater than the second.  If two elements compare as
        !           195:  * equal, their order in the sorted array is undefined.
        !           196:  *
        !           197:  * The comparison function receives pointers to the array elements (esize != 0)
        !           198:  * or the actual pointers (esize = 0). The third argument is the user data
        !           199:  * supplied to this function.
        !           200:  *
        !           201:  * @param array                        array to sort, or NULL
        !           202:  * @param cmp                  comparison function
        !           203:  * @param user                 user data to pass to comparison function
        !           204:  */
        !           205: void array_sort(array_t *array, int (*cmp)(const void*,const void*,void*),
        !           206:                                void *user);
        !           207: 
        !           208: /**
        !           209:  * Binary search of a sorted array.
        !           210:  *
        !           211:  * The array should be sorted in ascending order according to the given
        !           212:  * comparison function.
        !           213:  *
        !           214:  * The comparison function must return an integer less than, equal to, or
        !           215:  * greater than zero if the first argument (the key) is considered to be
        !           216:  * respectively less than, equal to, or greater than the second.
        !           217:  *
        !           218:  * If there are multiple elements that match the key it is not specified which
        !           219:  * element is returned.
        !           220:  *
        !           221:  * The comparison function receives the key object and a pointer to an array
        !           222:  * element (esize != 0) or an actual pointer (esize = 0).
        !           223:  *
        !           224:  * @param array                        array to search, or NULL
        !           225:  * @param key                  key to search for
        !           226:  * @param cmp                  comparison function
        !           227:  * @param data                 data to copy element to, or NULL
        !           228:  * @return                             index of the element if found, -1 if not
        !           229:  */
        !           230: int array_bsearch(array_t *array, const void *key,
        !           231:                                  int (*cmp)(const void*,const void*), void *data);
        !           232: 
        !           233: /**
        !           234:  * Invoke a callback for all array members.
        !           235:  *
        !           236:  * @param array                        array to traverse, or NULL
        !           237:  * @param cb                   callback function to invoke each element with
        !           238:  * @param user                 user data to pass to callback
        !           239:  */
        !           240: void array_invoke(array_t *array, array_callback_t cb, void *user);
        !           241: 
        !           242: /**
        !           243:  * Invoke a method of each element defined with offset.
        !           244:  *
        !           245:  * @param array                        array to traverse, or NULL
        !           246:  * @param offset               offset of element method, use offsetof()
        !           247:  */
        !           248: void array_invoke_offset(array_t *array, size_t offset);
        !           249: 
        !           250: /**
        !           251:  * Destroy an array.
        !           252:  *
        !           253:  * @param array                        array to destroy, or NULL
        !           254:  */
        !           255: void array_destroy(array_t *array);
        !           256: 
        !           257: /**
        !           258:  * Destroy an array, call a function to clean up all elements.
        !           259:  *
        !           260:  * @param array                        array to destroy, or NULL
        !           261:  * @param cb                   callback function to free element data
        !           262:  * @param user                 user data to pass to callback
        !           263:  */
        !           264: void array_destroy_function(array_t *array, array_callback_t cb, void *user);
        !           265: 
        !           266: /**
        !           267:  * Destroy an array, call element method defined with offset.
        !           268:  *
        !           269:  * @param array                        array to destroy, or NULL
        !           270:  * @param offset               offset of element method, use offsetof()
        !           271:  */
        !           272: void array_destroy_offset(array_t *array, size_t offset);
        !           273: 
        !           274: 
        !           275: /**
        !           276:  * Required on some platforms to initialize thread local value to implement
        !           277:  * array_sort().
        !           278:  */
        !           279: void arrays_init();
        !           280: 
        !           281: /**
        !           282:  * Destroys the thread local value if required.
        !           283:  */
        !           284: void arrays_deinit();
        !           285: 
        !           286: #endif /** ARRAY_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>