//===-- sotoc/src/TargetCode.h --------------------------------------------===////// The LLVM Compiler Infrastructure//// This file is distributed under the University of Illinois Open Source// License. See LICENSE.TXT for details.////===----------------------------------------------------------------------===//#pragma once#include<deque>#include<memory>#include<set>#include<string>#include"clang/Rewrite/Core/Rewriter.h"#include"TargetCodeFragment.h"namespaceclang{classSourceManager;}usingTargetCodeFragmentDeque=std::deque<std::shared_ptr<TargetCodeFragment>>;externintclauseparam;classTargetCode{TargetCodeFragmentDequeCodeFragments;std::set<std::string>SystemHeaders;clang::Rewriter&TargetCodeRewriter;clang::SourceManager&SM;public:TargetCode(clang::Rewriter&TargetCodeRewriter):TargetCodeRewriter(TargetCodeRewriter),SM(TargetCodeRewriter.getSourceMgr()){};booladdCodeFragment(std::shared_ptr<TargetCodeFragment>Frag,boolPushFront=false);booladdCodeFragmentFront(std::shared_ptr<TargetCodeFragment>Fag);voidgenerateCode(llvm::raw_ostream&Out);TargetCodeFragmentDeque::const_iteratorgetCodeFragmentsBegin(){returnCodeFragments.begin();}TargetCodeFragmentDeque::const_iteratorgetCodeFragmentsEnd(){returnCodeFragments.end();}voidaddHeader(conststd::string&Header){SystemHeaders.insert(Header);}private:voidgenerateVariableDecl(constTargetRegionVariable&Var,llvm::raw_ostream&Out);voidgenerateFunctionPrologue(TargetCodeRegion*TCR,llvm::raw_ostream&Out);voidgenerateFunctionEpilogue(TargetCodeRegion*TCR,llvm::raw_ostream&Out);std::stringgenerateFunctionName(TargetCodeRegion*TCR);voidgenerateArgument(constTargetRegionVariable&Aarg,llvm::raw_ostream&Out);};