#ifndef CXXFOOZZ_INCLUDE_ANALYZER_HPP_ #define CXXFOOZZ_INCLUDE_ANALYZER_HPP_ #include "model.hpp" #include "traversal.hpp" namespace cxxfoozz { namespace analysis { class AnalysisSpec { public: static AnalysisSpec FromTraversalResult( const ClassTraversingResult &traversal_result, clang::MangleContext *mangle_ctx ); const std::vector &GetRecordDecls() const; const std::vector &GetEnumDecls() const; const std::vector &GetClassTemplateDecls() const; const std::vector &GetFuncDecls() const; const std::vector &GetFuncTemplateDecls() const; clang::MangleContext *GetMangleCtx() const; private: std::vector record_decls_; std::vector enum_decls_; std::vector class_template_decls_; std::vector func_decls_; std::vector func_template_decls_; clang::MangleContext *mangle_ctx_; }; class AnalysisResult { public: AnalysisResult() = default; AnalysisResult( std::vector> class_type_models, std::vector> executables, std::vector> creators, std::vector> enum_type_models, std::shared_ptr inheritance_model ); const std::vector> &GetClassTypeModels() const; const std::vector> &GetExecutables() const; const std::vector> &GetCreators() const; const std::vector> &GetEnumTypeModels() const; const std::shared_ptr &GetInheritanceModel() const; private: std::vector> class_type_models_; std::vector> executables_; std::vector> creators_; std::vector> enum_type_models_; std::shared_ptr inheritance_model_; }; } // namespace analysis class ProgramAnalyzer { public: analysis::AnalysisResult Analyze(const analysis::AnalysisSpec &spec); private: }; } // namespace cxxfoozz #endif //CXXFOOZZ_INCLUDE_ANALYZER_HPP_