X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FADT%2FGraphTraits.h;h=0fd1f5022af77e9b904675e28c77b8cf7cfd9a44;hb=4c099b8724abf993262366e2a871004a2777becb;hp=754e38fa7f5e7ae2ef1056f070ef43fb33a8a270;hpb=b38e4fd8b0228feb1fb8376d2266b7f99a9b0913;p=oota-llvm.git diff --git a/include/llvm/ADT/GraphTraits.h b/include/llvm/ADT/GraphTraits.h index 754e38fa7f5..0fd1f5022af 100644 --- a/include/llvm/ADT/GraphTraits.h +++ b/include/llvm/ADT/GraphTraits.h @@ -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 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 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 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 +struct GraphTraits > > { + typedef typename GraphTraits::NodeType NodeType; + typedef typename GraphTraits::ChildIteratorType ChildIteratorType; + + static NodeType *getEntryNode(Inverse > *G) { + return GraphTraits::getEntryNode(G->Graph.Graph); + } + + static ChildIteratorType child_begin(NodeType* N) { + return GraphTraits::child_begin(N); + } + + static ChildIteratorType child_end(NodeType* N) { + return GraphTraits::child_end(N); + } +}; + +} // End llvm namespace + #endif