Program Listing for File GraphAccess.h#
↰ Return to documentation for file (src/util/graphs/GraphAccess.h)
/* Qing Yi: This file defines a graph access interface that is used
in several graph analysis/processing algorithms defined in this directory
*/
#ifndef GRAPH_ACCESS_H
#define GRAPH_ACCESS_H
#include <IteratorTmpl.h>
class GraphAccess {
public:
typedef enum {EdgeOut = 1, EdgeIn = 2, BiEdge = 3} EdgeDirection;
static EdgeDirection Reverse(EdgeDirection d)
{ switch (d) {
case EdgeOut: return EdgeIn;
case EdgeIn: return EdgeOut;
case BiEdge: return BiEdge;
}
//ROSE_ABORT();
}
};
// The graph access template
template <class NodeImpl, class EdgeImpl>
class GraphAccessTemplate : public GraphAccess
{
public:
typedef NodeImpl Node;
typedef EdgeImpl Edge;
typedef IteratorWrap<Edge*,IteratorImpl<Edge*> > EdgeIterator;
typedef IteratorWrap<Node*,IteratorImpl<Node*> > NodeIterator;
virtual ~GraphAccessTemplate() {}
virtual NodeIterator GetNodeIterator() const = 0; // iterator to all nodes
virtual EdgeIterator // the iterator to all edges incident to node n
GetNodeEdgeIterator(const Node* n, EdgeDirection dir) const=0;
virtual Node* // the source or sink of edge e
GetEdgeEndPoint( const Edge* e, EdgeDirection dir) const = 0;
virtual bool ContainNode(const Node* n) const = 0; // whether graph contains n
virtual bool ContainEdge(const Edge* e) const = 0; // whether graph contains e
virtual std::string nodeToString(Node* n) const { return ""; }
virtual std::string edgeToString(Edge* n) const { return ""; }
};
// this template class builds a bridge to GraphAccess interface
// from a concrete graph implementaion.
template <class NodeBase, class EdgeBase, class GraphImpl>
class GraphAccessWrapTemplate : public GraphAccessTemplate<NodeBase,EdgeBase>
{
protected:
GraphImpl* impl;
public:
typedef NodeBase Node;
typedef EdgeBase Edge;
typedef typename GraphAccessTemplate<Node,Edge>::NodeIterator NodeIterator;
typedef typename GraphAccessTemplate<Node,Edge>::EdgeIterator EdgeIterator;
GraphAccessWrapTemplate(GraphImpl* _impl) : impl(_impl) {}
~GraphAccessWrapTemplate() {}
NodeIterator GetNodeIterator() const
{ return new IteratorImplTemplate<Node*,typename GraphImpl::NodeIterator>
(impl->GetNodeIterator()); }
EdgeIterator
GetNodeEdgeIterator(const Node* n, GraphAccess::EdgeDirection dir) const
{ return new IteratorImplTemplate<Edge*,typename GraphImpl::EdgeIterator>
(impl->GetNodeEdgeIterator(static_cast<const typename GraphImpl::Node*>(n),dir)); }
Node* GetEdgeEndPoint( const Edge* e, GraphAccess::EdgeDirection dir) const
{ return impl->GetEdgeEndPoint(static_cast<const typename GraphImpl::Edge*>(e), dir); }
bool ContainNode(const Node* n) const
{ return (n == 0)? false :
impl->ContainNode(static_cast<const typename GraphImpl::Node*>(n)); }
bool ContainEdge(const Edge* e) const
{ return (e == 0)? false :
impl->ContainEdge(static_cast<const typename GraphImpl::Edge*>(e)); }
};
// the graph access interface used in various graph processing algorithms
typedef GraphAccessTemplate<void, void> GraphAccessInterface;
#endif