149 lines
3.9 KiB
C
149 lines
3.9 KiB
C
/**
|
|
* Copyright (C) 2008 Happy Fish / YuQing
|
|
*
|
|
* FastDFS may be copied only under the terms of the GNU General
|
|
* Public License V3, which may be found in the FastDFS source kit.
|
|
* Please visit the FastDFS Home Page http://www.csource.org/ for more detail.
|
|
**/
|
|
|
|
#ifndef CHAIN_H
|
|
#define CHAIN_H
|
|
|
|
#include "common_define.h"
|
|
|
|
#define CHAIN_TYPE_INSERT 0 //insert new node before head
|
|
#define CHAIN_TYPE_APPEND 1 //insert new node after tail
|
|
#define CHAIN_TYPE_SORTED 2 //sorted chain
|
|
|
|
typedef struct tagChainNode
|
|
{
|
|
void *data;
|
|
struct tagChainNode *next;
|
|
} ChainNode;
|
|
|
|
typedef struct
|
|
{
|
|
int type;
|
|
ChainNode *head;
|
|
ChainNode *tail;
|
|
FreeDataFunc freeDataFunc;
|
|
CompareFunc compareFunc;
|
|
} ChainList;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/** chain init function
|
|
* parameters:
|
|
* pList: the chain list
|
|
* type: chain type, value is one of following:
|
|
* CHAIN_TYPE_INSERT: insert new node before head
|
|
* CHAIN_TYPE_APPEND: insert new node after tail
|
|
* CHAIN_TYPE_SORTED: sorted chain
|
|
* freeDataFunc: free data function pointer, can be NULL
|
|
* compareFunc: compare data function pointer, can be NULL,
|
|
* must set when type is CHAIN_TYPE_SORTED
|
|
* return: none
|
|
*/
|
|
void chain_init(ChainList *pList, const int type, FreeDataFunc freeDataFunc, \
|
|
CompareFunc compareFunc);
|
|
|
|
/** destroy chain
|
|
* parameters:
|
|
* pList: the chain list
|
|
* return: none
|
|
*/
|
|
void chain_destroy(ChainList *pList);
|
|
|
|
|
|
/** get the chain node count
|
|
* parameters:
|
|
* pList: the chain list
|
|
* return: chain node count
|
|
*/
|
|
int chain_count(ChainList *pList);
|
|
|
|
/** add a new node to the chain
|
|
* parameters:
|
|
* pList: the chain list
|
|
* data: the data to add
|
|
* return: error no, 0 for success, != 0 fail
|
|
*/
|
|
int addNode(ChainList *pList, void *data);
|
|
|
|
/** free the chain node
|
|
* parameters:
|
|
* pList: the chain list
|
|
* pChainNode: the chain node to free
|
|
* return: none
|
|
*/
|
|
void freeChainNode(ChainList *pList, ChainNode *pChainNode);
|
|
|
|
/** delete the chain node
|
|
* parameters:
|
|
* pList: the chain list
|
|
* pPreviousNode: the previous chain node
|
|
* pDeletedNode: the chain node to delete
|
|
* return: none
|
|
*/
|
|
void deleteNodeEx(ChainList *pList, ChainNode *pPreviousNode, \
|
|
ChainNode *pDeletedNode);
|
|
|
|
/** delete the chain nodes from pPreviousNode->next to pDeletedNext
|
|
* (not including pDeletedNext)
|
|
* parameters:
|
|
* pList: the chain list
|
|
* pPreviousNode: the previous chain node, delete from pPreviousNode->next
|
|
* pDeletedNext: the chain node after the deleted node
|
|
* return: none
|
|
*/
|
|
void deleteToNodePrevious(ChainList *pList, ChainNode *pPreviousNode, \
|
|
ChainNode *pDeletedNext);
|
|
|
|
/** delete the chain node using data compare function
|
|
* parameters:
|
|
* pList: the chain list
|
|
* data: the first node whose data equals this will be deleted
|
|
* return: delete chain node count, < 0 fail
|
|
*/
|
|
int deleteOne(ChainList *pList, void *data);
|
|
|
|
/** delete all chain nodes using data compare function
|
|
* parameters:
|
|
* pList: the chain list
|
|
* data: the node whose data equals this will be deleted
|
|
* return: delete chain node count, < 0 fail
|
|
*/
|
|
int deleteAll(ChainList *pList, void *data);
|
|
|
|
/** pop up a chain nodes from chain head
|
|
* parameters:
|
|
* pList: the chain list
|
|
* return: the head node, return NULL when the chain is empty
|
|
*/
|
|
void *chain_pop_head(ChainList *pList);
|
|
|
|
/** add a chain nodes before the chain head
|
|
* parameters:
|
|
* pList: the chain list
|
|
* data: the node to insert
|
|
* return: error no, 0 for success, != 0 fail
|
|
*/
|
|
int insertNodePrior(ChainList *pList, void *data);
|
|
|
|
/** add a chain nodes after the chain tail
|
|
* parameters:
|
|
* pList: the chain list
|
|
* data: the node to insert
|
|
* return: error no, 0 for success, != 0 fail
|
|
*/
|
|
int appendNode(ChainList *pList, void *data);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|