From f9957c2960f385f2b2d999320412b376e0c15d50 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 30 Mar 2002 09:13:23 +0000 Subject: [PATCH] Initial checkin of file: Define an iterator to operate over data structure outgoing links and graph implementation so generic graph functions can be used. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2057 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/DSGraphTraits.h | 67 +++++++++++++++++++ .../Analysis/DataStructure/DSGraphTraits.h | 67 +++++++++++++++++++ include/llvm/Analysis/DataStructureGraph.h | 67 +++++++++++++++++++ 3 files changed, 201 insertions(+) create mode 100644 include/llvm/Analysis/DSGraphTraits.h create mode 100644 include/llvm/Analysis/DataStructure/DSGraphTraits.h create mode 100644 include/llvm/Analysis/DataStructureGraph.h diff --git a/include/llvm/Analysis/DSGraphTraits.h b/include/llvm/Analysis/DSGraphTraits.h new file mode 100644 index 00000000000..67989697504 --- /dev/null +++ b/include/llvm/Analysis/DSGraphTraits.h @@ -0,0 +1,67 @@ +//===- DataStructureGraph.h - Provide graph classes --------------*- C++ -*--=// +// +// This file provides GraphTraits specializations for the DataStructure graph +// nodes, allowing datastructure graphs to be processed by generic graph +// algorithms. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_ANALYSIS_DATASTRUCTURE_GRAPH_H +#define LLVM_ANALYSIS_DATASTRUCTURE_GRAPH_H + +#include "Support/GraphTraits.h" +#include "llvm/Analysis/DataStructure.h" +#include "llvm/Value.h" // FIXME: Move cast/dyn_cast out to Support + +class DSNodeIterator : public std::forward_iterator { + DSNode * const Node; + unsigned Link; + unsigned LinkIdx; + + typedef DSNodeIterator _Self; +public: + DSNodeIterator(DSNode *N) : Node(N), Link(0), LinkIdx(0) {} // begin iterator + DSNodeIterator(DSNode *N, bool) // Create end iterator + : Node(N), Link(N->getNumOutgoingLinks()), LinkIdx(0) { + } + + bool operator==(const _Self& x) const { + return Link == x.Link && LinkIdx == x.LinkIdx; + } + bool operator!=(const _Self& x) const { return !operator==(x); } + + pointer operator*() const { + return Node->getOutgoingLink(Link)[LinkIdx].getNode(); + } + pointer operator->() const { return operator*(); } + + _Self& operator++() { // Preincrement + if (LinkIdx < Node->getOutgoingLink(Link).size()-1) + ++LinkIdx; + else { + ++Link; + LinkIdx = 0; + } + return *this; + } + _Self operator++(int) { // Postincrement + _Self tmp = *this; ++*this; return tmp; + } +}; + + +template <> struct GraphTraits { + typedef DSNode NodeType; + typedef DSNodeIterator ChildIteratorType; + + static NodeType *getEntryNode(DSNode *N) { return N; } + static ChildIteratorType child_begin(NodeType *N) { + return DSNodeIterator(N); + } + static ChildIteratorType child_end(NodeType *N) { + return DSNodeIterator(N, true); + } +}; + + +#endif diff --git a/include/llvm/Analysis/DataStructure/DSGraphTraits.h b/include/llvm/Analysis/DataStructure/DSGraphTraits.h new file mode 100644 index 00000000000..67989697504 --- /dev/null +++ b/include/llvm/Analysis/DataStructure/DSGraphTraits.h @@ -0,0 +1,67 @@ +//===- DataStructureGraph.h - Provide graph classes --------------*- C++ -*--=// +// +// This file provides GraphTraits specializations for the DataStructure graph +// nodes, allowing datastructure graphs to be processed by generic graph +// algorithms. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_ANALYSIS_DATASTRUCTURE_GRAPH_H +#define LLVM_ANALYSIS_DATASTRUCTURE_GRAPH_H + +#include "Support/GraphTraits.h" +#include "llvm/Analysis/DataStructure.h" +#include "llvm/Value.h" // FIXME: Move cast/dyn_cast out to Support + +class DSNodeIterator : public std::forward_iterator { + DSNode * const Node; + unsigned Link; + unsigned LinkIdx; + + typedef DSNodeIterator _Self; +public: + DSNodeIterator(DSNode *N) : Node(N), Link(0), LinkIdx(0) {} // begin iterator + DSNodeIterator(DSNode *N, bool) // Create end iterator + : Node(N), Link(N->getNumOutgoingLinks()), LinkIdx(0) { + } + + bool operator==(const _Self& x) const { + return Link == x.Link && LinkIdx == x.LinkIdx; + } + bool operator!=(const _Self& x) const { return !operator==(x); } + + pointer operator*() const { + return Node->getOutgoingLink(Link)[LinkIdx].getNode(); + } + pointer operator->() const { return operator*(); } + + _Self& operator++() { // Preincrement + if (LinkIdx < Node->getOutgoingLink(Link).size()-1) + ++LinkIdx; + else { + ++Link; + LinkIdx = 0; + } + return *this; + } + _Self operator++(int) { // Postincrement + _Self tmp = *this; ++*this; return tmp; + } +}; + + +template <> struct GraphTraits { + typedef DSNode NodeType; + typedef DSNodeIterator ChildIteratorType; + + static NodeType *getEntryNode(DSNode *N) { return N; } + static ChildIteratorType child_begin(NodeType *N) { + return DSNodeIterator(N); + } + static ChildIteratorType child_end(NodeType *N) { + return DSNodeIterator(N, true); + } +}; + + +#endif diff --git a/include/llvm/Analysis/DataStructureGraph.h b/include/llvm/Analysis/DataStructureGraph.h new file mode 100644 index 00000000000..67989697504 --- /dev/null +++ b/include/llvm/Analysis/DataStructureGraph.h @@ -0,0 +1,67 @@ +//===- DataStructureGraph.h - Provide graph classes --------------*- C++ -*--=// +// +// This file provides GraphTraits specializations for the DataStructure graph +// nodes, allowing datastructure graphs to be processed by generic graph +// algorithms. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_ANALYSIS_DATASTRUCTURE_GRAPH_H +#define LLVM_ANALYSIS_DATASTRUCTURE_GRAPH_H + +#include "Support/GraphTraits.h" +#include "llvm/Analysis/DataStructure.h" +#include "llvm/Value.h" // FIXME: Move cast/dyn_cast out to Support + +class DSNodeIterator : public std::forward_iterator { + DSNode * const Node; + unsigned Link; + unsigned LinkIdx; + + typedef DSNodeIterator _Self; +public: + DSNodeIterator(DSNode *N) : Node(N), Link(0), LinkIdx(0) {} // begin iterator + DSNodeIterator(DSNode *N, bool) // Create end iterator + : Node(N), Link(N->getNumOutgoingLinks()), LinkIdx(0) { + } + + bool operator==(const _Self& x) const { + return Link == x.Link && LinkIdx == x.LinkIdx; + } + bool operator!=(const _Self& x) const { return !operator==(x); } + + pointer operator*() const { + return Node->getOutgoingLink(Link)[LinkIdx].getNode(); + } + pointer operator->() const { return operator*(); } + + _Self& operator++() { // Preincrement + if (LinkIdx < Node->getOutgoingLink(Link).size()-1) + ++LinkIdx; + else { + ++Link; + LinkIdx = 0; + } + return *this; + } + _Self operator++(int) { // Postincrement + _Self tmp = *this; ++*this; return tmp; + } +}; + + +template <> struct GraphTraits { + typedef DSNode NodeType; + typedef DSNodeIterator ChildIteratorType; + + static NodeType *getEntryNode(DSNode *N) { return N; } + static ChildIteratorType child_begin(NodeType *N) { + return DSNodeIterator(N); + } + static ChildIteratorType child_end(NodeType *N) { + return DSNodeIterator(N, true); + } +}; + + +#endif