rvgraph.h

来自「h.248协议源码」· C头文件 代码 · 共 112 行

H
112
字号
/******************************************************************************
Filename:    rvgraph.h
Description: graph class
*******************************************************************************
                Copyright (c) 2000 RADVision Inc.
*******************************************************************************
NOTICE:
This document contains information that is proprietary to RADVision LTD.
No part of this publication may be reproduced in any form whatsoever 
without written prior approval by RADVision LTD..

RADVision LTD. reserves the right to revise this publication and make 
changes without obligation to notify any person of such revisions or 
changes.
******************************************************************************/

#ifndef RV_GRAPH_H
#define RV_GRAPH_H

#include "rvlist.h"

#if defined(__cplusplus)
extern "C" {
#endif

struct RvGraphNode_;

typedef struct
{
	struct RvGraphNode_ *node;	
	void *data;
} RvGraphLink;

rvDeclareList(RvGraphLink)

typedef struct RvGraphNode_
{
	void *item;
	RvList(RvGraphLink) out, in;
} RvGraphNode;

rvDeclareList(RvGraphNode)

typedef struct
{
	RvList(RvGraphNode) nodes;
} RvGraph;

typedef RvBool (*RvGraphLinkCmpFunc)(void *link, void *data);
/* return rvTrue from callbacks to terminate for-each loops */
typedef RvBool (*RvGraphNodeFunc)(void *node, void *data);
typedef RvBool (*RvGraphLinkFunc)(void *head, void *tail, void *link, void *data);

RvGraph *rvGraphConstructA(RvGraph *graph, RvAlloc *alloc);
RvGraph *rvGraphConstructCopy(RvGraph *d, const RvGraph *s, RvAlloc *alloc);
void rvGraphDestruct(RvGraph *graph);
RvGraph *rvGraphCopy(RvGraph *d, const RvGraph *s);
void rvGraphAddNode(RvGraph *graph, void *node);
void rvGraphRemoveNode(RvGraph *graph, void *node);
void rvGraphRemoveNodeExt(RvGraph *graph, void *node,RvGraphLinkFunc f,void * data);
void rvGraphClear(RvGraph *graph); /* remove all nodes and links */
void rvGraphAddLink(RvGraph *graph, void *head, void *tail, void *data);
void rvGraphRemoveLink(RvGraph *graph, void *head, void *tail, void *data);
void rvGraphRemoveLinkCmp(RvGraph *graph, void *head, void *tail,RvGraphLinkCmpFunc f,void *data);
void rvGraphClearLinks(RvGraph *graph);
size_t rvGraphGetNumNodes(RvGraph *graph);

typedef RvListIter(RvGraphNode) RvGraphNodeIter;
#define rvGraphNodeIterGetNode(i) (rvListIterData(i)->item)
#define rvGraphNodeIterNext rvListIterNext
#define rvGraphNodeIterPrev rvListIterPrev

typedef RvListIter(RvGraphLink) RvGraphLinkIter;
#define rvGraphLinkIterGetData(i) (rvListIterData(i)->data)
#define rvGraphLinkIterGetNode(i) (rvListIterData(i)->node->item)
#define rvGraphLinkIterNext rvListIterNext
#define rvGraphLinkIterPrev rvListIterPrev


RvGraphNodeIter rvGraphBegin(RvGraph *graph);
RvGraphNodeIter rvGraphTail(RvGraph *graph);
RvGraphNodeIter rvGraphEnd(RvGraph *graph);
RvGraphNodeIter rvGraphFindNode(RvGraph *graph, void *node);
RvGraphNodeIter	rvGraphFindNodeIterCmp(RvGraph *graph, RvGraphNodeFunc f,void * data);
void *      	rvGraphFindNodeCmp(RvGraph *graph, RvGraphNodeFunc f,void * data);
void			rvGraphRemoveNodeIter(RvGraph *graph, RvGraphNodeIter iter,RvGraphLinkFunc f,void * data);
RvGraphLinkIter rvGraphNodeOutLinksBegin(RvGraphNodeIter i);
RvGraphLinkIter rvGraphNodeOutLinksEnd(RvGraphNodeIter i);
RvGraphLinkIter rvGraphNodeInLinksBegin(RvGraphNodeIter i);
RvGraphLinkIter rvGraphNodeInLinksEnd(RvGraphNodeIter i);
size_t rvGraphNodeGetNumOutLinks(RvGraphNodeIter i);
size_t rvGraphNodeGetNumInLinks(RvGraphNodeIter i);


/* for-each functions return rvTrue if loop was terminated */
RvBool rvGraphForEachNode(RvGraph *graph, RvGraphNodeFunc f, void *data);
RvBool rvGraphForEachLink(RvGraph *graph, RvGraphLinkFunc f, void *data);
RvBool rvGraphForEachLinkFromNode(RvGraph *graph, void *node, RvGraphLinkFunc f, void *data);
RvBool rvGraphForEachLinkToNode(RvGraph *graph, void *node, RvGraphLinkFunc f, void *data);

void * rvGraphFindLinkFromNodeIter(RvGraph *graph, RvGraphNodeIter nodeIter,RvGraphNodeIter tailIter,RvGraphLinkCmpFunc f, void *data);
void * rvGraphFindLinkFromNode(RvGraph *graph, void *node,void * tail,RvGraphLinkCmpFunc f, void *data);
void * rvGraphFindLinkToNode(RvGraph *graph, RvGraphNodeIter nodeIter,RvGraphNodeIter headIter,RvGraphLinkCmpFunc f, void *data);

RvAlloc *rvGraphGetAllocator(const RvGraph *graph);

#if defined(__cplusplus)
}
#endif

#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?