dequeof.h
来自「Sun公司Dream项目」· C头文件 代码 · 共 269 行
H
269 行
/*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the "License"). You may not use this file except
* in compliance with the License.
*
* You can obtain a copy of the license at
* http://www.opensource.org/licenses/cddl1.php
* See the License for the specific language governing
* permissions and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* HEADER in each file and include the License file at
* http://www.opensource.org/licenses/cddl1.php. If
* applicable, add the following below this CDDL HEADER,
* with the fields enclosed by brackets "[]" replaced
* with your own identifying information:
* Portions Copyright [yyyy]
* [name of copyright owner]
*/
/*
* $(@)DequeOf.h $Revision: 1.1.1.1 $ $Date: 2006/04/17 22:47:30 $
*
* Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
*/
/*
* Copyright (c) 1997 by Sun Microsystems, Inc.
*/
/*
* DequeOf.h -- A double-ended queue data structure.
*/
#ifndef _COBJS_DEQUEOF_H
#define _COBJS_DEQUEOF_H
#pragma ident "@(#)Deque.h 1.1 98/10/22 SMI"
/***********************************************************************
* Includes
***********************************************************************/
#include <stdlib.h>
#include "cobjs/Foreign.h"
#include "cobjs/Inline.h"
#include "cobjs/Macros.h"
#include "cobjs/Types.h"
_FOREIGN_START
/***********************************************************************
* Instance Types
***********************************************************************/
typedef struct _DequeOf *DequeOf;
typedef struct _DequeOfIter *DequeOfIter;
typedef Boolean (*DequeOfIsEqualFunc)(const void *item1p, const void *item2p,
size_t itemLen);
/***********************************************************************
* Inline Support
***********************************************************************/
#if defined(DO_INLINING) && ! defined(DEQUEOF_BODY)
#define DEQUEOF_INLINE static
#else /* defined(DO_INLINING) && ! defined(DEQUEOF_BODY) */
#define DEQUEOF_INLINE extern
#endif /* defined(DO_INLINING) && ! defined(DEQUEOF_BODY) */
/***********************************************************************
* Class Interface
***********************************************************************/
/*
* Create a deque. Initialize size is initSize (if 0, a default
* will be used), if deque must be grown, it will be grown by
* sizeIncr (if 0, a value proportional to the current size
* will be used). isEqualFunc is used to compare to deque items for
* equality. If null, a bitwise compare is used.
*/
extern DequeOf
dequeOfNew(size_t itemSize, int initSize, int sizeIncr,
DequeOfIsEqualFunc isEqualFunc);
#define NEW_DEQUEOF(type, initSize, sizeIncr, isEqualFunc) \
dequeOfNew(sizeof(type), initSize, sizeIncr, isEqualFunc)
/***********************************************************************
* Instance Interface
***********************************************************************/
/*
* Enqueues item on head of deque.
*/
DEQUEOF_INLINE void _dequeOfEnqueueHead(DequeOf dequeOf, void *item);
#define dequeOfEnqueueHead(dequeOf, item) _dequeOfEnqueueHead(dequeOf, &(item))
/*
* Enqueues item on tail of deque.
*/
DEQUEOF_INLINE void _dequeOfEnqueueTail(DequeOf dequeOf, void *item);
#define dequeOfEnqueueTail(dequeOf, item) _dequeOfEnqueueTail(dequeOf, &(item))
/*
* Dequeues item from head of deque, returns NULL if deque is empty.
*/
DEQUEOF_INLINE void *_dequeOfDequeueHead(DequeOf dequeOf);
#define dequeOfDequeueHead(dequeOf, type) \
(*(type *) _dequeOfDequeueHead(dequeOf))
/*
* Dequeues item from tail of deque, returns NULL if deque is empty.
*/
DEQUEOF_INLINE void *_dequeOfDequeueTail(DequeOf dequeOf);
#define dequeOfDequeueTail(dequeOf, type) \
(*(type *) _dequeOfDequeueTail(dequeOf))
/*
* Returns item at index position in deque. Index 0 refers to head,
* index dequeLength() - 1 refers to tail.
*
* Returns NULL if index outside of deque.
*/
DEQUEOF_INLINE void *_dequeOfItemAt(DequeOf dequeOf, int index);
#define dequeOfItemAt(dequeOf, type, index) \
(*(type *) _dequeOfItemAt(dequeOf, index))
/*
* Stores item into deque at index position. Overwrites item previously at
* index position. Index 0 refers to head, index dequeOfLength() - 1 refers
* to tail.
*
* Aborts if index outside of deque.
*/
DEQUEOF_INLINE void
_dequeOfSetItemAt(DequeOf dequeOf, int index, void *item);
#define dequeOfSetItemAt(dequeOf, index, item) \
_dequeOfSetItemAt(dequeOf, index, &(item))
/*
* Returns value at head (tail) of deque without dequeue of item.
*/
DEQUEOF_INLINE void *_dequeOfHead(DequeOf dequeOf);
DEQUEOF_INLINE void *_dequeOfTail(DequeOf dequeOf);
#define dequeOfHead(dequeOf, type) \
(*(type *) _dequeOfHead(dequeOf))
#define dequeOfTail(dequeOf, type) \
(*(type *) _dequeOfTail(dequeOf))
/*
* Returns number of items in deque
*/
DEQUEOF_INLINE int dequeOfLength(DequeOf dequeOf);
/*
* Returns TRUE if item is on deque, FALSE otherwise.
*/
extern Boolean _dequeOfIsMember(DequeOf dequeOf, void *item);
#define dequeOfIsMember(dequeOf, item) _dequeOfIsMember(dequeOf, &(item))
/*
* Finds item from deque and returns (but does not remove).
*
* NOTE: This is expensive.
*/
extern void *_dequeOfFind(DequeOf dequeOf, void *item);
#define dequeOfFind(dequeOf, type, item) \
(*(type *) _dequeOfFind(dequeOf, &(item)))
/*
* Finds and removes item from deque.
*
* NOTE: This is expensive.
*/
extern Boolean _dequeOfDelete(DequeOf dequeOf, void *item);
#define dequeOfDelete(dequeOf, item) _dequeOfDelete(dequeOf, &(item))
/*
* Frees DequeOf object. Does NOT free current contents of deque.
*/
extern void dequeOfFree(DequeOf dequeOf);
/************************************************************************
* OBJECT DequeOfIter Class Interface
************************************************************************/
/*
* Create a deque Iterator
*/
extern DequeOfIter dequeOfIterNew(const DequeOf dequeOf);
/************************************************************************
* OBJECT DequeOfIter Instance Interface
************************************************************************/
/*
* Position iterator at deque head Returns TRUE if deque is non-empty; FALSE if
* deque is empty.
*/
DEQUEOF_INLINE Boolean dequeOfIterHead(DequeOfIter di);
/*
* Position iterator at deque tail Returns TRUE if deque is non-empty; FALSE if
* deque is empty.
*/
DEQUEOF_INLINE Boolean dequeOfIterTail(DequeOfIter di);
/*
* Position iterator at next item in deque. Return TRUE if there is a next
* item; FALSE if wrapping around.
*
* NOTE: dequeIterNext moves from head towards tail.
*/
DEQUEOF_INLINE Boolean dequeOfIterNext(DequeOfIter di);
/*
* Position iterator at previous item in deque. Return TRUE if there is a next
* item; FALSE if wrapping around.
*
* NOTE: dequeIterPrev moves from tail towards head.
*/
DEQUEOF_INLINE Boolean dequeOfIterPrev(DequeOfIter di);
/*
* Return the item referenced by the iterator Returns NULL if iterator not
* positioned at item.
*/
DEQUEOF_INLINE void *_dequeOfIterItem(const DequeOfIter di);
#define dequeOfIterItem(di, type) (*(type *) _dequeOfIterItem(di))
/*
* Return TRUE if iterator points to valid item
*/
DEQUEOF_INLINE Boolean dequeOfIterIsValid(const DequeOfIter di);
/*
* Free an iterator
*/
extern void dequeOfIterFree(DequeOfIter di);
/***********************************************************************
* Inline Function Bodies
***********************************************************************/
#if defined(DO_INLINING) && !defined(DEQUEOF_BODY)
#define DEQUEOF_HEADER
#include "cobjs/DequeOf.c"
#undef DEQUEOF_HEADER
#endif /* defined(DO_INLINING) && !defined(DEQUEOF_BODY) */
_FOREIGN_END
#endif /* _COBJS_DEQUEOF_H */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?