System: Add SwapByteOrder and update Support/MathExtras.h to use it.
[oota-llvm.git] / include / llvm / ADT / GraphTraits.h
index 754e38fa7f5e7ae2ef1056f070ef43fb33a8a270..0fd1f5022af77e9b904675e28c77b8cf7cfd9a44 100644 (file)
@@ -1,6 +1,13 @@
-//===-- Support/GraphTraits.h - Graph traits template ------------*- C++ -*--=//
+//===-- llvm/ADT/GraphTraits.h - Graph traits template ----------*- C++ -*-===//
 //
-// This file defines the little GraphTraits<X> template class that should be 
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the little GraphTraits<X> template class that should be
 // specialized by classes that want to be iteratable by generic graph iterators.
 //
 // This file also defines the marker class Inverse that is used to iterate over
@@ -8,8 +15,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLVM_SUPPORT_GRAPH_TRAITS_H
-#define LLVM_SUPPORT_GRAPH_TRAITS_H
+#ifndef LLVM_ADT_GRAPHTRAITS_H
+#define LLVM_ADT_GRAPHTRAITS_H
+
+namespace llvm {
 
 // GraphTraits - This class should be specialized by different graph types...
 // which is why the default version is empty.
@@ -21,14 +30,14 @@ struct GraphTraits {
   // typedef NodeType          - Type of Node in the graph
   // typedef ChildIteratorType - Type used to iterate over children in graph
 
-  // static NodeType *getEntryNode(GraphType *)
+  // static NodeType *getEntryNode(const GraphType &)
   //    Return the entry node of the graph
 
   // static ChildIteratorType child_begin(NodeType *)
   // static ChildIteratorType child_end  (NodeType *)
-  //    Return iterators that point to the beginning and ending of the child 
+  //    Return iterators that point to the beginning and ending of the child
   //    node list for the specified node.
-  //  
+  //
 
 
   // typedef  ...iterator nodes_iterator;
@@ -41,7 +50,7 @@ struct GraphTraits {
   // If anyone tries to use this class without having an appropriate
   // specialization, make an error.  If you get this error, it's because you
   // need to include the appropriate specialization of GraphTraits<> for your
-  // graph, or you need to define it for a new graph type. Either that or 
+  // graph, or you need to define it for a new graph type. Either that or
   // your argument to XXX_begin(...) is unknown or needs to have the proper .h
   // file #include'd.
   //
@@ -64,9 +73,31 @@ 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
+
 #endif