list.h
来自「基于sip协议的网络电话源码」· C头文件 代码 · 共 274 行
H
274 行
/* $Id: list.h 974 2007-02-19 01:13:53Z bennylp $ *//* * Copyright (C)2003-2007 Benny Prijono <benny@prijono.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#ifndef __PJ_LIST_H__#define __PJ_LIST_H__/** * @file list.h * @brief Linked List data structure. */#include <pj/types.h>PJ_BEGIN_DECL/* * @defgroup PJ_DS Data Structure. * @ingroup PJ *//** * @defgroup PJ_LIST Linked List * @ingroup PJ_DS * @{ * * List in PJLIB is implemented as doubly-linked list, and it won't require * dynamic memory allocation (just as all PJLIB data structures). The list here * should be viewed more like a low level C list instead of high level C++ list * (which normally are easier to use but require dynamic memory allocations), * therefore all caveats with C list apply here too (such as you can NOT put * a node in more than one lists). * * \section pj_list_example_sec Examples * * See below for examples on how to manipulate linked list: * - @ref page_pjlib_samples_list_c * - @ref page_pjlib_list_test *//** * Use this macro in the start of the structure declaration to declare that * the structure can be used in the linked list operation. This macro simply * declares additional member @a prev and @a next to the structure. * @hideinitializer */#define PJ_DECL_LIST_MEMBER(type) \ /** List @a prev. */ \ type *prev; \ /** List @a next. */ \ type *next /** * This structure describes generic list node and list. The owner of this list * must initialize the 'value' member to an appropriate value (typically the * owner itself). */struct pj_list{ PJ_DECL_LIST_MEMBER(void);};/** * Initialize the list. * Initially, the list will have no member, and function pj_list_empty() will * always return nonzero (which indicates TRUE) for the newly initialized * list. * * @param node The list head. */PJ_INLINE(void) pj_list_init(pj_list_type * node){ ((pj_list*)node)->next = ((pj_list*)node)->prev = node;}/** * Check that the list is empty. * * @param node The list head. * * @return Non-zero if the list is not-empty, or zero if it is empty. * */PJ_INLINE(int) pj_list_empty(const pj_list_type * node){ return ((pj_list*)node)->next == node;}/** * Insert the node to the list before the specified element position. * * @param pos The element to which the node will be inserted before. * @param node The element to be inserted. * * @return void. */PJ_IDECL(void) pj_list_insert_before(pj_list_type *pos, pj_list_type *node);/** * Insert the node to the back of the list. This is just an alias for * #pj_list_insert_before(). * * @param list The list. * @param node The element to be inserted. */PJ_INLINE(void) pj_list_push_back(pj_list_type *list, pj_list_type *node){ pj_list_insert_before(list, node);}/** * Inserts all nodes in \a nodes to the target list. * * @param lst The target list. * @param nodes Nodes list. */PJ_IDECL(void) pj_list_insert_nodes_before(pj_list_type *lst, pj_list_type *nodes);/** * Insert a node to the list after the specified element position. * * @param pos The element in the list which will precede the inserted * element. * @param node The element to be inserted after the position element. * * @return void. */PJ_IDECL(void) pj_list_insert_after(pj_list_type *pos, pj_list_type *node);/** * Insert the node to the front of the list. This is just an alias for * #pj_list_insert_after(). * * @param list The list. * @param node The element to be inserted. */PJ_INLINE(void) pj_list_push_front(pj_list_type *list, pj_list_type *node){ pj_list_insert_after(list, node);}/** * Insert all nodes in \a nodes to the target list. * * @param lst The target list. * @param nodes Nodes list. */PJ_IDECL(void) pj_list_insert_nodes_after(pj_list_type *lst, pj_list_type *nodes);/** * Remove elements from the source list, and insert them to the destination * list. The elements of the source list will occupy the * front elements of the target list. Note that the node pointed by \a list2 * itself is not considered as a node, but rather as the list descriptor, so * it will not be inserted to the \a list1. The elements to be inserted starts * at \a list2->next. If \a list2 is to be included in the operation, use * \a pj_list_insert_nodes_before. * * @param list1 The destination list. * @param list2 The source list. * * @return void. */PJ_IDECL(void) pj_list_merge_first(pj_list_type *list1, pj_list_type *list2);/** * Remove elements from the second list argument, and insert them to the list * in the first argument. The elements from the second list will be appended * to the first list. Note that the node pointed by \a list2 * itself is not considered as a node, but rather as the list descriptor, so * it will not be inserted to the \a list1. The elements to be inserted starts * at \a list2->next. If \a list2 is to be included in the operation, use * \a pj_list_insert_nodes_before. * * @param list1 The element in the list which will precede the inserted * element. * @param list2 The element in the list to be inserted. * * @return void. */PJ_IDECL(void) pj_list_merge_last( pj_list_type *list1, pj_list_type *list2);/** * Erase the node from the list it currently belongs. * * @param node The element to be erased. */PJ_IDECL(void) pj_list_erase(pj_list_type *node);/** * Find node in the list. * * @param list The list head. * @param node The node element to be searched. * * @return The node itself if it is found in the list, or NULL if it is not * found in the list. */PJ_IDECL(pj_list_type*) pj_list_find_node(pj_list_type *list, pj_list_type *node);/** * Search the list for the specified value, using the specified comparison * function. This function iterates on nodes in the list, started with the * first node, and call the user supplied comparison function until the * comparison function returns ZERO. * * @param list The list head. * @param value The user defined value to be passed in the comparison * function * @param comp The comparison function, which should return ZERO to * indicate that the searched value is found. * * @return The first node that matched, or NULL if it is not found. */PJ_IDECL(pj_list_type*) pj_list_search(pj_list_type *list, void *value, int (*comp)(void *value, const pj_list_type *node) );/** * Traverse the list to get the number of elements in the list. * * @param list The list head. * * @return Number of elements. */PJ_IDECL(pj_size_t) pj_list_size(pj_list_type *list);/** * @} */#if PJ_FUNCTIONS_ARE_INLINED# include "list_i.h"#endifPJ_END_DECL#endif /* __PJ_LIST_H__ */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?