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