1//===--- StmtGraphTraits.h - Graph Traits for the class Stmt ----*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//  This file defines a template specialization of llvm::GraphTraits to
11//  treat ASTs (Stmt*) as graphs
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CLANG_AST_STMT_GRAPHTRAITS_H
16#define LLVM_CLANG_AST_STMT_GRAPHTRAITS_H
17
18#include "clang/AST/Stmt.h"
19#include "llvm/ADT/DepthFirstIterator.h"
20#include "llvm/ADT/GraphTraits.h"
21
22namespace llvm {
23
24//template <typename T> struct GraphTraits;
25
26
27template <> struct GraphTraits<clang::Stmt*> {
28  typedef clang::Stmt                       NodeType;
29  typedef clang::Stmt::child_iterator       ChildIteratorType;
30  typedef llvm::df_iterator<clang::Stmt*>   nodes_iterator;
31
32  static NodeType* getEntryNode(clang::Stmt* S) { return S; }
33
34  static inline ChildIteratorType child_begin(NodeType* N) {
35    if (N) return N->child_begin();
36    else return ChildIteratorType();
37  }
38
39  static inline ChildIteratorType child_end(NodeType* N) {
40    if (N) return N->child_end();
41    else return ChildIteratorType();
42  }
43
44  static nodes_iterator nodes_begin(clang::Stmt* S) {
45    return df_begin(S);
46  }
47
48  static nodes_iterator nodes_end(clang::Stmt* S) {
49    return df_end(S);
50  }
51};
52
53
54template <> struct GraphTraits<const clang::Stmt*> {
55  typedef const clang::Stmt                       NodeType;
56  typedef clang::Stmt::const_child_iterator       ChildIteratorType;
57  typedef llvm::df_iterator<const clang::Stmt*>   nodes_iterator;
58
59  static NodeType* getEntryNode(const clang::Stmt* S) { return S; }
60
61  static inline ChildIteratorType child_begin(NodeType* N) {
62    if (N) return N->child_begin();
63    else return ChildIteratorType();
64  }
65
66  static inline ChildIteratorType child_end(NodeType* N) {
67    if (N) return N->child_end();
68    else return ChildIteratorType();
69  }
70
71  static nodes_iterator nodes_begin(const clang::Stmt* S) {
72    return df_begin(S);
73  }
74
75  static nodes_iterator nodes_end(const clang::Stmt* S) {
76    return df_end(S);
77  }
78};
79
80
81} // end namespace llvm
82
83#endif
84