Added iterator and profiling (i.e. FoldingSetNodeID) support to ImmutableMap.
[oota-llvm.git] / include / llvm / ADT / GraphTraits.h
index 99a69b8cc87f1cec52d2542004093872c93e0e42..566956dfeecc0fd39424af4d0d368667742371ab 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -73,9 +73,29 @@ struct GraphTraits {
 //
 template <class GraphType>
 struct Inverse {
-  GraphType &Graph;
+  const GraphType &Graph;
 
-  inline Inverse(GraphType &G) : Graph(G) {}
+  inline Inverse(const GraphType &G) : Graph(G) {}
+};
+
+// Provide a partial specialization of GraphTraits so that the inverse of an inverse
+// falls back to the original graph.
+template<class T>
+struct GraphTraits<Inverse<Inverse<T> > > {
+  typedef typename GraphTraits<T>::NodeType NodeType;
+  typedef typename GraphTraits<T>::ChildIteratorType ChildIteratorType;
+  
+  static NodeType *getEntryNode(Inverse<Inverse<T> > *G) {
+    return GraphTraits<T>::getEntryNode(G->Graph.Graph);
+  }
+  
+  static ChildIteratorType child_begin(NodeType* N) {
+    return GraphTraits<T>::child_begin(N);
+  }
+  
+  static ChildIteratorType child_end(NodeType* N) {
+    return GraphTraits<T>::child_end(N);
+  }
 };
 
 } // End llvm namespace