Program Listing for File BaseGraphCreate.h#
↰ Return to documentation for file (src/util/graphs/BaseGraphCreate.h)
#ifndef BASE_GRAPH_CREATE
#define BASE_GRAPH_CREATE
#include <MultiGraphCreate.h>
#include <GraphAccess.h>
#include "mlog.h"
typedef MultiGraphElemTemplate<void*> BaseGraphNode;
typedef MultiGraphElemTemplate<void*> BaseGraphEdge;
class BaseGraphCreate
: public MultiGraphCreate,
public
GraphAccessTemplate<BaseGraphNode,BaseGraphEdge>
{
protected:
typedef GraphAccessTemplate<BaseGraphNode,BaseGraphEdge>
GraphAccessBase;
public:
typedef void* NodeContent;
typedef void* EdgeContent;
typedef GraphAccessBase::Node Node;
typedef GraphAccessBase::Edge Edge;
typedef GraphAccessBase::NodeIterator NodeIterator;
typedef GraphAccessBase::EdgeIterator EdgeIterator;
virtual ~BaseGraphCreate() {}
virtual BaseGraphNode* CreateNode(NodeContent _id) =0;
virtual BaseGraphEdge*
CreateEdge(BaseGraphNode* src, BaseGraphNode *snk, EdgeContent _id)=0;
virtual void
MoveEdgeEndPoint( BaseGraphEdge *e, BaseGraphNode *n, EdgeDirection dir)=0;
virtual void DeleteNode( BaseGraphNode *n)=0;
virtual void DeleteEdge( BaseGraphEdge *n)=0;
using GraphAccessBase::GetNodeIterator;
using GraphAccessBase::GetNodeEdgeIterator;
using GraphAccessBase::GetEdgeEndPoint;
using GraphAccessBase::ContainNode;
using GraphAccessBase::ContainEdge;
};
template <class GraphImpl>
class BaseGraphCreateWrap : public BaseGraphCreate
{
public:
BaseGraphCreateWrap() { impl = new GraphImpl(); }
virtual ~BaseGraphCreateWrap() { delete impl; }
virtual BaseGraphNode* CreateNode(NodeContent _id)
{ return new typename GraphImpl::Node( impl, this, _id); }
virtual BaseGraphEdge*
CreateEdge(BaseGraphNode* src, BaseGraphNode *snk, EdgeContent _id)
{
assert( ContainNode(src) && ContainNode(snk));
return new typename GraphImpl::Edge( this,
static_cast<typename GraphImpl::Node*>(src),
static_cast<typename GraphImpl::Node*>(snk), _id);
}
virtual void
MoveEdgeEndPoint( BaseGraphEdge *e, BaseGraphNode *n,
GraphAccess::EdgeDirection dir)
{
assert( ContainEdge(e) && ContainNode(n));
static_cast<typename GraphImpl::Edge*>(e)->MoveEndPoint( static_cast<typename GraphImpl::Node*>(n),
TranslateDirection(dir));
}
virtual void DeleteNode( BaseGraphNode *n)
{ delete static_cast<typename GraphImpl::Node*>(n); }
virtual void DeleteEdge( BaseGraphEdge *n)
{ delete static_cast<typename GraphImpl::Edge*>(n); }
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),
TranslateDirection(dir))); }
Node* GetEdgeEndPoint( const BaseGraphEdge* e,
GraphAccess::EdgeDirection dir) const
{ return impl->GetEdgeEndPoint(static_cast<const typename GraphImpl::Edge*>(e),
TranslateDirection(dir)); }
bool ContainNode( const BaseGraphNode* n) const
{ return impl->ContainNode(static_cast<const typename GraphImpl::Node*>(n)); }
bool ContainEdge( const BaseGraphEdge* n) const
{ return impl->ContainEdge(static_cast<const typename GraphImpl::Edge*>(n)); }
protected:
GraphImpl* impl;
typename GraphImpl::EdgeDirection
TranslateDirection( GraphAccess::EdgeDirection dir) const
{ switch (dir) {
case GraphAccess::EdgeOut: return GraphImpl::EdgeOut;
case GraphAccess::EdgeIn: return GraphImpl::EdgeIn;
default:
ROSE_ABORT();
}
}
};
#endif