diff --git a/include/llvm/Analysis/DSGraph.h b/include/llvm/Analysis/DSGraph.h index 121cce6fdbd..4995b11bdd3 100644 --- a/include/llvm/Analysis/DSGraph.h +++ b/include/llvm/Analysis/DSGraph.h @@ -157,8 +157,9 @@ public: // Iterator for graph interface... typedef DSNodeIterator iterator; - inline iterator begin(); // Defined in DSGraphTraits.h - inline iterator end(); + typedef DSNodeIterator const_iterator; + inline iterator begin() const; // Defined in DSGraphTraits.h + inline iterator end() const; //===-------------------------------------------------- // Accessors @@ -192,7 +193,7 @@ public: return 0; } - int getMergeMapLabel(unsigned i) { + int getMergeMapLabel(unsigned i) const { assert(i < MergeMap.size() && "MergeMap index out of range!"); return MergeMap[i]; } @@ -418,7 +419,7 @@ public: void print(std::ostream &O) const; void dump() const; - void writeGraphToFile(std::ostream &O, const std::string &GraphName); + void writeGraphToFile(std::ostream &O, const std::string &GraphName) const; // maskNodeTypes - Apply a mask to all of the node types in the graph. This // is useful for clearing out markers like Scalar or Incomplete. diff --git a/include/llvm/Analysis/DSGraphTraits.h b/include/llvm/Analysis/DSGraphTraits.h index d6ea1edac8c..bd5bf28e608 100644 --- a/include/llvm/Analysis/DSGraphTraits.h +++ b/include/llvm/Analysis/DSGraphTraits.h @@ -14,15 +14,15 @@ #include "Support/iterator" #include "Support/STLExtras.h" -class DSNodeIterator : public forward_iterator { +class DSNodeIterator : public forward_iterator { friend class DSNode; - DSNode * const Node; + const DSNode * const Node; unsigned Offset; typedef DSNodeIterator _Self; - DSNodeIterator(DSNode *N) : Node(N), Offset(0) {} // begin iterator - DSNodeIterator(DSNode *N, bool) // Create end iterator + DSNodeIterator(const DSNode *N) : Node(N), Offset(0) {} // begin iterator + DSNodeIterator(const DSNode *N, bool) // Create end iterator : Node(N), Offset(N->getSize()) { } public: @@ -41,7 +41,7 @@ public: } pointer operator*() const { - DSNodeHandle *NH = Node->getLink(Offset); + const DSNodeHandle *NH = Node->getLink(Offset); return NH ? NH->getNode() : 0; } pointer operator->() const { return operator*(); } @@ -55,12 +55,12 @@ public: } unsigned getOffset() const { return Offset; } - DSNode *getNode() const { return Node; } + const DSNode *getNode() const { return Node; } }; // Provide iterators for DSNode... -inline DSNode::iterator DSNode::begin() { return DSNodeIterator(this); } -inline DSNode::iterator DSNode::end() { return DSNodeIterator(this, false); } +inline DSNode::iterator DSNode::begin() const { return DSNodeIterator(this); } +inline DSNode::iterator DSNode::end() const { return DSNodeIterator(this, false); } template <> struct GraphTraits { typedef DSNode NodeType; @@ -71,7 +71,8 @@ template <> struct GraphTraits { static ChildIteratorType child_end(NodeType *N) { return N->end(); } }; -static DSNode &dereference(DSNode *N) { return *N; } +static DSNode &dereference ( DSNode *N) { return *N; } +static const DSNode &dereferenceC(const DSNode *N) { return *N; } template <> struct GraphTraits { typedef DSNode NodeType; @@ -82,11 +83,35 @@ template <> struct GraphTraits { // nodes_iterator/begin/end - Allow iteration over all nodes in the graph typedef mapped_iterator::iterator, DerefFun> nodes_iterator; - static nodes_iterator nodes_begin(DSGraph *G) { return map_iterator(G->getNodes().begin(), DerefFun(dereference));} - static nodes_iterator nodes_end (DSGraph *G) { return map_iterator(G->getNodes().end(), DerefFun(dereference)); } + static nodes_iterator nodes_begin(DSGraph *G) { + return map_iterator(G->getNodes().begin(), DerefFun(dereference)); + } + static nodes_iterator nodes_end(DSGraph *G) { + return map_iterator(G->getNodes().end(), DerefFun(dereference)); + } static ChildIteratorType child_begin(NodeType *N) { return N->begin(); } static ChildIteratorType child_end(NodeType *N) { return N->end(); } }; +template <> struct GraphTraits { + typedef const DSNode NodeType; + typedef DSNode::iterator ChildIteratorType; + + typedef std::pointer_to_unary_function DerefFun; + + // nodes_iterator/begin/end - Allow iteration over all nodes in the graph + typedef mapped_iterator::const_iterator, + DerefFun> nodes_iterator; + static nodes_iterator nodes_begin(const DSGraph *G) { + return map_iterator(G->getNodes().begin(), DerefFun(dereferenceC)); + } + static nodes_iterator nodes_end(const DSGraph *G) { + return map_iterator(G->getNodes().end(), DerefFun(dereferenceC)); + } + + static ChildIteratorType child_begin(const NodeType *N) { return N->begin(); } + static ChildIteratorType child_end(const NodeType *N) { return N->end(); } +}; + #endif diff --git a/include/llvm/Analysis/DataStructure/DSGraph.h b/include/llvm/Analysis/DataStructure/DSGraph.h index 121cce6fdbd..4995b11bdd3 100644 --- a/include/llvm/Analysis/DataStructure/DSGraph.h +++ b/include/llvm/Analysis/DataStructure/DSGraph.h @@ -157,8 +157,9 @@ public: // Iterator for graph interface... typedef DSNodeIterator iterator; - inline iterator begin(); // Defined in DSGraphTraits.h - inline iterator end(); + typedef DSNodeIterator const_iterator; + inline iterator begin() const; // Defined in DSGraphTraits.h + inline iterator end() const; //===-------------------------------------------------- // Accessors @@ -192,7 +193,7 @@ public: return 0; } - int getMergeMapLabel(unsigned i) { + int getMergeMapLabel(unsigned i) const { assert(i < MergeMap.size() && "MergeMap index out of range!"); return MergeMap[i]; } @@ -418,7 +419,7 @@ public: void print(std::ostream &O) const; void dump() const; - void writeGraphToFile(std::ostream &O, const std::string &GraphName); + void writeGraphToFile(std::ostream &O, const std::string &GraphName) const; // maskNodeTypes - Apply a mask to all of the node types in the graph. This // is useful for clearing out markers like Scalar or Incomplete. diff --git a/include/llvm/Analysis/DataStructure/DSGraphTraits.h b/include/llvm/Analysis/DataStructure/DSGraphTraits.h index d6ea1edac8c..bd5bf28e608 100644 --- a/include/llvm/Analysis/DataStructure/DSGraphTraits.h +++ b/include/llvm/Analysis/DataStructure/DSGraphTraits.h @@ -14,15 +14,15 @@ #include "Support/iterator" #include "Support/STLExtras.h" -class DSNodeIterator : public forward_iterator { +class DSNodeIterator : public forward_iterator { friend class DSNode; - DSNode * const Node; + const DSNode * const Node; unsigned Offset; typedef DSNodeIterator _Self; - DSNodeIterator(DSNode *N) : Node(N), Offset(0) {} // begin iterator - DSNodeIterator(DSNode *N, bool) // Create end iterator + DSNodeIterator(const DSNode *N) : Node(N), Offset(0) {} // begin iterator + DSNodeIterator(const DSNode *N, bool) // Create end iterator : Node(N), Offset(N->getSize()) { } public: @@ -41,7 +41,7 @@ public: } pointer operator*() const { - DSNodeHandle *NH = Node->getLink(Offset); + const DSNodeHandle *NH = Node->getLink(Offset); return NH ? NH->getNode() : 0; } pointer operator->() const { return operator*(); } @@ -55,12 +55,12 @@ public: } unsigned getOffset() const { return Offset; } - DSNode *getNode() const { return Node; } + const DSNode *getNode() const { return Node; } }; // Provide iterators for DSNode... -inline DSNode::iterator DSNode::begin() { return DSNodeIterator(this); } -inline DSNode::iterator DSNode::end() { return DSNodeIterator(this, false); } +inline DSNode::iterator DSNode::begin() const { return DSNodeIterator(this); } +inline DSNode::iterator DSNode::end() const { return DSNodeIterator(this, false); } template <> struct GraphTraits { typedef DSNode NodeType; @@ -71,7 +71,8 @@ template <> struct GraphTraits { static ChildIteratorType child_end(NodeType *N) { return N->end(); } }; -static DSNode &dereference(DSNode *N) { return *N; } +static DSNode &dereference ( DSNode *N) { return *N; } +static const DSNode &dereferenceC(const DSNode *N) { return *N; } template <> struct GraphTraits { typedef DSNode NodeType; @@ -82,11 +83,35 @@ template <> struct GraphTraits { // nodes_iterator/begin/end - Allow iteration over all nodes in the graph typedef mapped_iterator::iterator, DerefFun> nodes_iterator; - static nodes_iterator nodes_begin(DSGraph *G) { return map_iterator(G->getNodes().begin(), DerefFun(dereference));} - static nodes_iterator nodes_end (DSGraph *G) { return map_iterator(G->getNodes().end(), DerefFun(dereference)); } + static nodes_iterator nodes_begin(DSGraph *G) { + return map_iterator(G->getNodes().begin(), DerefFun(dereference)); + } + static nodes_iterator nodes_end(DSGraph *G) { + return map_iterator(G->getNodes().end(), DerefFun(dereference)); + } static ChildIteratorType child_begin(NodeType *N) { return N->begin(); } static ChildIteratorType child_end(NodeType *N) { return N->end(); } }; +template <> struct GraphTraits { + typedef const DSNode NodeType; + typedef DSNode::iterator ChildIteratorType; + + typedef std::pointer_to_unary_function DerefFun; + + // nodes_iterator/begin/end - Allow iteration over all nodes in the graph + typedef mapped_iterator::const_iterator, + DerefFun> nodes_iterator; + static nodes_iterator nodes_begin(const DSGraph *G) { + return map_iterator(G->getNodes().begin(), DerefFun(dereferenceC)); + } + static nodes_iterator nodes_end(const DSGraph *G) { + return map_iterator(G->getNodes().end(), DerefFun(dereferenceC)); + } + + static ChildIteratorType child_begin(const NodeType *N) { return N->begin(); } + static ChildIteratorType child_end(const NodeType *N) { return N->end(); } +}; + #endif