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>