Be const correct. Handle both DSGraph* and const DSGraph*'s
authorChris Lattner <sabre@nondot.org>
Thu, 17 Oct 2002 01:01:06 +0000 (01:01 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 17 Oct 2002 01:01:06 +0000 (01:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4208 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/DSGraph.h
include/llvm/Analysis/DSGraphTraits.h
include/llvm/Analysis/DataStructure/DSGraph.h
include/llvm/Analysis/DataStructure/DSGraphTraits.h

index 121cce6fdbd50f0c3331c8a1475cd889cd2f148b..4995b11bdd3978dbce01213bd5e53a13d3f9ea33 100644 (file)
@@ -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.
index d6ea1edac8c756ac6697f2782f067f9b038d80e8..bd5bf28e6088eb5da52cb127c84b3b82e083a0b2 100644 (file)
 #include "Support/iterator"
 #include "Support/STLExtras.h"
 
-class DSNodeIterator : public forward_iterator<DSNode, ptrdiff_t> {
+class DSNodeIterator : public forward_iterator<const DSNode, ptrdiff_t> {
   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<DSNode*> {
   typedef DSNode NodeType;
@@ -71,7 +71,8 @@ template <> struct GraphTraits<DSNode*> {
   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<DSGraph*> {
   typedef DSNode NodeType;
@@ -82,11 +83,35 @@ template <> struct GraphTraits<DSGraph*> {
   // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
   typedef mapped_iterator<std::vector<DSNode*>::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<const DSGraph*> {
+  typedef const DSNode NodeType;
+  typedef DSNode::iterator ChildIteratorType;
+
+  typedef std::pointer_to_unary_function<const DSNode *,const DSNode&> DerefFun;
+
+  // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
+  typedef mapped_iterator<std::vector<DSNode*>::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
index 121cce6fdbd50f0c3331c8a1475cd889cd2f148b..4995b11bdd3978dbce01213bd5e53a13d3f9ea33 100644 (file)
@@ -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.
index d6ea1edac8c756ac6697f2782f067f9b038d80e8..bd5bf28e6088eb5da52cb127c84b3b82e083a0b2 100644 (file)
 #include "Support/iterator"
 #include "Support/STLExtras.h"
 
-class DSNodeIterator : public forward_iterator<DSNode, ptrdiff_t> {
+class DSNodeIterator : public forward_iterator<const DSNode, ptrdiff_t> {
   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<DSNode*> {
   typedef DSNode NodeType;
@@ -71,7 +71,8 @@ template <> struct GraphTraits<DSNode*> {
   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<DSGraph*> {
   typedef DSNode NodeType;
@@ -82,11 +83,35 @@ template <> struct GraphTraits<DSGraph*> {
   // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
   typedef mapped_iterator<std::vector<DSNode*>::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<const DSGraph*> {
+  typedef const DSNode NodeType;
+  typedef DSNode::iterator ChildIteratorType;
+
+  typedef std::pointer_to_unary_function<const DSNode *,const DSNode&> DerefFun;
+
+  // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
+  typedef mapped_iterator<std::vector<DSNode*>::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