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>