1d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek//===--- StmtGraphTraits.h - Graph Traits for the class Stmt ----*- C++ -*-===//
2d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek//
3d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek//                     The LLVM Compiler Infrastructure
4d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
7d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek//
8d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek//===----------------------------------------------------------------------===//
9d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek//
101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//  This file defines a template specialization of llvm::GraphTraits to
11d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek//  treat ASTs (Stmt*) as graphs
12d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek//
13d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek//===----------------------------------------------------------------------===//
14d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek
15d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek#ifndef LLVM_CLANG_AST_STMT_GRAPHTRAITS_H
16d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek#define LLVM_CLANG_AST_STMT_GRAPHTRAITS_H
17d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek
18d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek#include "clang/AST/Stmt.h"
19d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek#include "llvm/ADT/DepthFirstIterator.h"
2030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/ADT/GraphTraits.h"
21d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek
22d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremeneknamespace llvm {
231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek//template <typename T> struct GraphTraits;
25d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek
26d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek
27d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenektemplate <> struct GraphTraits<clang::Stmt*> {
28d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  typedef clang::Stmt                       NodeType;
29d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  typedef clang::Stmt::child_iterator       ChildIteratorType;
30d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  typedef llvm::df_iterator<clang::Stmt*>   nodes_iterator;
311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  static NodeType* getEntryNode(clang::Stmt* S) { return S; }
331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  static inline ChildIteratorType child_begin(NodeType* N) {
35d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek    if (N) return N->child_begin();
369ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek    else return ChildIteratorType();
37d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  }
381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  static inline ChildIteratorType child_end(NodeType* N) {
40d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek    if (N) return N->child_end();
419ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek    else return ChildIteratorType();
42d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  }
431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  static nodes_iterator nodes_begin(clang::Stmt* S) {
45d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek    return df_begin(S);
46d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  }
471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  static nodes_iterator nodes_end(clang::Stmt* S) {
49d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek    return df_end(S);
50d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  }
51d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek};
52d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek
53d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek
54d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenektemplate <> struct GraphTraits<const clang::Stmt*> {
55d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  typedef const clang::Stmt                       NodeType;
56d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  typedef clang::Stmt::const_child_iterator       ChildIteratorType;
57d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  typedef llvm::df_iterator<const clang::Stmt*>   nodes_iterator;
581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
59d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  static NodeType* getEntryNode(const clang::Stmt* S) { return S; }
601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  static inline ChildIteratorType child_begin(NodeType* N) {
62d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek    if (N) return N->child_begin();
631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    else return ChildIteratorType();
64d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  }
651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  static inline ChildIteratorType child_end(NodeType* N) {
67d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek    if (N) return N->child_end();
689ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek    else return ChildIteratorType();
69d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  }
701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
71d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  static nodes_iterator nodes_begin(const clang::Stmt* S) {
72d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek    return df_begin(S);
73d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  }
741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  static nodes_iterator nodes_end(const clang::Stmt* S) {
76d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek    return df_end(S);
77d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek  }
78d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek};
79d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek
801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
81d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek} // end namespace llvm
82d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek
83d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek#endif
84