Annotation of embedaddon/strongswan/src/libstrongswan/collections/linked_list.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2007-2018 Tobias Brunner
! 3: * Copyright (C) 2005-2008 Martin Willi
! 4: * Copyright (C) 2005 Jan Hutter
! 5: * HSR Hochschule fuer Technik Rapperswil
! 6: *
! 7: * This program is free software; you can redistribute it and/or modify it
! 8: * under the terms of the GNU General Public License as published by the
! 9: * Free Software Foundation; either version 2 of the License, or (at your
! 10: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 11: *
! 12: * This program is distributed in the hope that it will be useful, but
! 13: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 14: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 15: * for more details.
! 16: */
! 17:
! 18: /**
! 19: * @defgroup linked_list linked_list
! 20: * @{ @ingroup collections
! 21: */
! 22:
! 23: #ifndef LINKED_LIST_H_
! 24: #define LINKED_LIST_H_
! 25:
! 26: typedef struct linked_list_t linked_list_t;
! 27:
! 28: #include <collections/enumerator.h>
! 29:
! 30: /**
! 31: * Function to match elements in a linked list
! 32: *
! 33: * @param item current list item
! 34: * @param args user supplied data
! 35: * @return TRUE, if the item matched, FALSE otherwise
! 36: */
! 37: typedef bool (*linked_list_match_t)(void *item, va_list args);
! 38:
! 39: /**
! 40: * Helper function to match a string in a linked list of strings
! 41: *
! 42: * @param item list item (char*)
! 43: * @param args user supplied data (char*)
! 44: * @return
! 45: */
! 46: bool linked_list_match_str(void *item, va_list args);
! 47:
! 48: /**
! 49: * Function to be invoked on elements in a linked list
! 50: *
! 51: * @param item current list item
! 52: * @param args user supplied data
! 53: */
! 54: typedef void (*linked_list_invoke_t)(void *item, va_list args);
! 55:
! 56: /**
! 57: * Class implementing a double linked list.
! 58: *
! 59: * General purpose linked list. This list is not synchronized.
! 60: */
! 61: struct linked_list_t {
! 62:
! 63: /**
! 64: * Gets the count of items in the list.
! 65: *
! 66: * @return number of items in list
! 67: */
! 68: int (*get_count) (linked_list_t *this);
! 69:
! 70: /**
! 71: * Create an enumerator over the list.
! 72: *
! 73: * @note The enumerator's position is invalid before the first call
! 74: * to enumerate().
! 75: *
! 76: * @return enumerator over list items
! 77: */
! 78: enumerator_t* (*create_enumerator)(linked_list_t *this);
! 79:
! 80: /**
! 81: * Resets the enumerator's current position to the beginning of the list.
! 82: *
! 83: * @param enumerator enumerator to reset
! 84: */
! 85: void (*reset_enumerator)(linked_list_t *this, enumerator_t *enumerator);
! 86:
! 87: /**
! 88: * Inserts a new item at the beginning of the list.
! 89: *
! 90: * @param item item value to insert in list
! 91: */
! 92: void (*insert_first) (linked_list_t *this, void *item);
! 93:
! 94: /**
! 95: * Removes the first item in the list and returns its value.
! 96: *
! 97: * @param item returned value of first item, or NULL
! 98: * @return SUCCESS, or NOT_FOUND if list is empty
! 99: */
! 100: status_t (*remove_first) (linked_list_t *this, void **item);
! 101:
! 102: /**
! 103: * Inserts a new item before the item the enumerator currently points to.
! 104: *
! 105: * If this method is called after all items have been enumerated, the item
! 106: * is inserted last. This is helpful when inserting items into a sorted
! 107: * list.
! 108: *
! 109: * @note The position of the enumerator is not changed. So it is safe to
! 110: * call this before or after remove_at() to replace the item at the current
! 111: * position (the enumerator will continue with the next item in the list).
! 112: * And in particular, when inserting an item before calling enumerate(),
! 113: * the enumeration will continue (or start) at the item that was first in
! 114: * the list before any items were inserted (enumerate() will return FALSE
! 115: * if the list was empty before).
! 116: *
! 117: * @param enumerator enumerator with position
! 118: * @param item item value to insert in list
! 119: */
! 120: void (*insert_before)(linked_list_t *this, enumerator_t *enumerator,
! 121: void *item);
! 122:
! 123: /**
! 124: * Remove an item from the list where the enumerator points to.
! 125: *
! 126: * If this method is called before calling enumerate() of the enumerator,
! 127: * the first item in the list, if any, will be removed. No item is removed,
! 128: * if the method is called after enumerating all items.
! 129: *
! 130: * @param enumerator enumerator with position
! 131: */
! 132: void (*remove_at)(linked_list_t *this, enumerator_t *enumerator);
! 133:
! 134: /**
! 135: * Remove items from the list matching the given item.
! 136: *
! 137: * If a compare function is given, it is called for each item, with the
! 138: * first parameter being the current list item and the second parameter
! 139: * being the supplied item. Return TRUE from the compare function to remove
! 140: * the item, return FALSE to keep it in the list.
! 141: *
! 142: * If compare is NULL, comparison is done by pointers.
! 143: *
! 144: * @param item item to remove/pass to comparator
! 145: * @param compare compare function, or NULL
! 146: * @return number of removed items
! 147: */
! 148: int (*remove)(linked_list_t *this, void *item, bool (*compare)(void*,void*));
! 149:
! 150: /**
! 151: * Returns the value of the first list item without removing it.
! 152: *
! 153: * @param item returned value of first item
! 154: * @return SUCCESS, NOT_FOUND if list is empty
! 155: */
! 156: status_t (*get_first) (linked_list_t *this, void **item);
! 157:
! 158: /**
! 159: * Inserts a new item at the end of the list.
! 160: *
! 161: * @param item value to insert into list
! 162: */
! 163: void (*insert_last) (linked_list_t *this, void *item);
! 164:
! 165: /**
! 166: * Removes the last item in the list and returns its value.
! 167: *
! 168: * @param item returned value of last item, or NULL
! 169: * @return SUCCESS, NOT_FOUND if list is empty
! 170: */
! 171: status_t (*remove_last) (linked_list_t *this, void **item);
! 172:
! 173: /**
! 174: * Returns the value of the last list item without removing it.
! 175: *
! 176: * @param item returned value of last item
! 177: * @return SUCCESS, NOT_FOUND if list is empty
! 178: */
! 179: status_t (*get_last) (linked_list_t *this, void **item);
! 180:
! 181: /**
! 182: * Find the first matching element in the list.
! 183: *
! 184: * The first object passed to the match function is the current list item,
! 185: * followed by the user supplied data.
! 186: * If the supplied function returns TRUE so does this function, and the
! 187: * current object is returned in the third parameter (if given), otherwise,
! 188: * the next item is checked.
! 189: *
! 190: * If match is NULL, *item and the current object are compared.
! 191: *
! 192: * @param match comparison function to call on each object, or NULL
! 193: * @param item the list item, if found, or NULL
! 194: * @param ... user data to supply to match function
! 195: * @return TRUE if found, FALSE otherwise (or if neither match,
! 196: * nor item is supplied)
! 197: */
! 198: bool (*find_first)(linked_list_t *this, linked_list_match_t match,
! 199: void **item, ...);
! 200:
! 201: /**
! 202: * Invoke a method on all of the contained objects.
! 203: *
! 204: * If a linked list contains objects with function pointers,
! 205: * invoke() can call a method on each of the objects. The
! 206: * method is specified by an offset of the function pointer,
! 207: * which can be evaluated at compile time using the offsetof
! 208: * macro, e.g.: list->invoke(list, offsetof(object_t, method));
! 209: *
! 210: * @param offset offset of the method to invoke on objects
! 211: */
! 212: void (*invoke_offset)(linked_list_t *this, size_t offset);
! 213:
! 214: /**
! 215: * Invoke a function on all of the contained objects.
! 216: *
! 217: * @param function function to call for each object
! 218: * @param ... user data to supply to called function
! 219: */
! 220: void (*invoke_function)(linked_list_t *this, linked_list_invoke_t function,
! 221: ...);
! 222:
! 223: /**
! 224: * Clones a list and its objects using the objects' clone method.
! 225: *
! 226: * @param offset offset to the objects clone function
! 227: * @return cloned list
! 228: */
! 229: linked_list_t *(*clone_offset) (linked_list_t *this, size_t offset);
! 230:
! 231: /**
! 232: * Compare two lists and their objects for equality using the given equals
! 233: * method.
! 234: *
! 235: * @param other list to compare
! 236: * @param offset offset of the objects equals method
! 237: * @return TRUE if lists and objects are equal, FALSE otherwise
! 238: */
! 239: bool (*equals_offset) (linked_list_t *this, linked_list_t *other,
! 240: size_t offset);
! 241:
! 242: /**
! 243: * Compare two lists and their objects for equality using the given function.
! 244: *
! 245: * @param other list to compare
! 246: * @param function function to compare the objects
! 247: * @return TRUE if lists and objects are equal, FALSE otherwise
! 248: */
! 249: bool (*equals_function) (linked_list_t *this, linked_list_t *other,
! 250: bool (*)(void*,void*));
! 251:
! 252: /**
! 253: * Destroys a linked_list object.
! 254: */
! 255: void (*destroy) (linked_list_t *this);
! 256:
! 257: /**
! 258: * Destroys a list and its objects using the destructor.
! 259: *
! 260: * If a linked list and the contained objects should be destroyed, use
! 261: * destroy_offset. The supplied offset specifies the destructor to
! 262: * call on each object. The offset may be calculated using the offsetof
! 263: * macro, e.g.: list->destroy_offset(list, offsetof(object_t, destroy));
! 264: *
! 265: * @param offset offset of the objects destructor
! 266: */
! 267: void (*destroy_offset) (linked_list_t *this, size_t offset);
! 268:
! 269: /**
! 270: * Destroys a list and its contents using a a cleanup function.
! 271: *
! 272: * If a linked list and its contents should get destroyed using a specific
! 273: * cleanup function, use destroy_function. This is useful when the
! 274: * list contains malloc()-ed blocks which should get freed,
! 275: * e.g.: list->destroy_function(list, free);
! 276: *
! 277: * @param function function to call on each object
! 278: */
! 279: void (*destroy_function) (linked_list_t *this, void (*)(void*));
! 280: };
! 281:
! 282: /**
! 283: * Creates an empty linked list object.
! 284: *
! 285: * @return linked_list_t object.
! 286: */
! 287: linked_list_t *linked_list_create(void);
! 288:
! 289: /**
! 290: * Creates a linked list from an enumerator.
! 291: *
! 292: * @param enumerator enumerator over void*, gets destroyed
! 293: * @return linked_list_t object, containing enumerated values
! 294: */
! 295: linked_list_t *linked_list_create_from_enumerator(enumerator_t *enumerator);
! 296:
! 297: /**
! 298: * Creates a linked list from a NULL terminated vararg list of items.
! 299: *
! 300: * @param first first item
! 301: * @param ... subsequent items, terminated by NULL
! 302: * @return linked_list_t object, containing passed items
! 303: */
! 304: linked_list_t *linked_list_create_with_items(void *first, ...);
! 305:
! 306: #endif /** LINKED_LIST_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>