bsd-list.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1991, 1993
  3.  * The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the University of
  16.  * California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * @(#)queue.h 8.5 (Berkeley) 8/20/94
  34.  * $Id: bsd-list.h,v 1.2 2008/03/25 04:28:30 tom_henderson Exp $
  35.  */
  36. // Copied from sys/queue.h in FreeBSD
  37. // Include this only if _SYS_QUEUE_H_ has not already been defined
  38. #if !defined(_NS_BSD_LIST_H_) && !defined(_SYS_QUEUE_H_)
  39. #define _NS_BSD_LIST_H_
  40. // define _SYS_QUEUE_H_ so /usr/include/sys/queue.h does not redefine
  41. #define _SYS_QUEUE_H_
  42. /*
  43.  * This file defines five types of data structures: singly-linked lists,
  44.  * slingly-linked tail queues, lists, tail queues, and circular queues.
  45.  *
  46.  * A singly-linked list is headed by a single forward pointer. The elements
  47.  * are singly linked for minimum space and pointer manipulation overhead at
  48.  * the expense of O(n) removal for arbitrary elements. New elements can be
  49.  * added to the list after an existing element or at the head of the list.
  50.  * Elements being removed from the head of the list should use the explicit
  51.  * macro for this purpose for optimum efficiency. A singly-linked list may
  52.  * only be traversed in the forward direction.  Singly-linked lists are ideal
  53.  * for applications with large datasets and few or no removals or for
  54.  * implementing a LIFO queue.
  55.  *
  56.  * A singly-linked tail queue is headed by a pair of pointers, one to the
  57.  * head of the list and the other to the tail of the list. The elements are
  58.  * singly linked for minimum space and pointer manipulation overhead at the
  59.  * expense of O(n) removal for arbitrary elements. New elements can be added
  60.  * to the list after an existing element, at the head of the list, or at the
  61.  * end of the list. Elements being removed from the head of the tail queue
  62.  * should use the explicit macro for this purpose for optimum efficiency.
  63.  * A singly-linked tail queue may only be traversed in the forward direction.
  64.  * Singly-linked tail queues are ideal for applications with large datasets
  65.  * and few or no removals or for implementing a FIFO queue.
  66.  *
  67.  * A list is headed by a single forward pointer (or an array of forward
  68.  * pointers for a hash table header). The elements are doubly linked
  69.  * so that an arbitrary element can be removed without a need to
  70.  * traverse the list. New elements can be added to the list before
  71.  * or after an existing element or at the head of the list. A list
  72.  * may only be traversed in the forward direction.
  73.  *
  74.  * A tail queue is headed by a pair of pointers, one to the head of the
  75.  * list and the other to the tail of the list. The elements are doubly
  76.  * linked so that an arbitrary element can be removed without a need to
  77.  * traverse the list. New elements can be added to the list before or
  78.  * after an existing element, at the head of the list, or at the end of
  79.  * the list. A tail queue may only be traversed in the forward direction.
  80.  *
  81.  * A circle queue is headed by a pair of pointers, one to the head of the
  82.  * list and the other to the tail of the list. The elements are doubly
  83.  * linked so that an arbitrary element can be removed without a need to
  84.  * traverse the list. New elements can be added to the list before or after
  85.  * an existing element, at the head of the list, or at the end of the list.
  86.  * A circle queue may be traversed in either direction, but has a more
  87.  * complex end of list detection.
  88.  *
  89.  * For details on the use of these macros, see the queue(3) manual page.
  90.  */
  91. /*
  92.  * List definitions.
  93.  */
  94. #define LIST_HEAD(name, type)
  95. struct name {
  96. type *lh_first; /* first element */
  97. }
  98. #define LIST_ENTRY(type)
  99. struct {
  100. type *le_next; /* next element */
  101. type **le_prev; /* address of previous next element */
  102. }
  103. /*
  104.  * List functions.
  105.  */
  106. #define LIST_INIT(head) {
  107. (head)->lh_first = NULL;
  108. }
  109. #define LIST_INSERT_AFTER(listelm, elm, field) {
  110. if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)
  111. (listelm)->field.le_next->field.le_prev =
  112.     &(elm)->field.le_next;
  113. (listelm)->field.le_next = (elm);
  114. (elm)->field.le_prev = &(listelm)->field.le_next;
  115. }
  116. #define LIST_INSERT_BEFORE(listelm, elm, field) {
  117. (elm)->field.le_prev = (listelm)->field.le_prev;
  118. (elm)->field.le_next = (listelm);
  119. *(listelm)->field.le_prev = (elm);
  120. (listelm)->field.le_prev = &(elm)->field.le_next;
  121. }
  122. #define LIST_INSERT_HEAD(head, elm, field) {
  123. if (((elm)->field.le_next = (head)->lh_first) != NULL)
  124. (head)->lh_first->field.le_prev = &(elm)->field.le_next;
  125. (head)->lh_first = (elm);
  126. (elm)->field.le_prev = &(head)->lh_first;
  127. }
  128. #define LIST_REMOVE(elm, field) {
  129. if ((elm)->field.le_next != NULL)
  130. (elm)->field.le_next->field.le_prev = 
  131.     (elm)->field.le_prev;
  132. *(elm)->field.le_prev = (elm)->field.le_next;
  133. }
  134. #endif /* !_NS_BSD_LIST_H_ */