1#ifndef ROSE_CodeGen_Factory_H
2#define ROSE_CodeGen_Factory_H
4#include <Rose/CodeGen/API.h>
6namespace Rose {
namespace CodeGen {
17template <
typename CRT,
typename API>
28template <
typename CRT,
typename apiT, Object otag>
31using tplargs_t = std::vector<SgTemplateArgument *>;
33template <
typename CRT,
typename API>
60 template <
Object otag,
typename... Args>
64 ROSE_ASSERT(is_template_symbol_variant<otag>(sym->variantT()));
81 template <
Object otag,
typename... Args>
86 if (is_template_symbol_variant<otag>(sym->variantT())) {
88 ROSE_ASSERT(decl !=
nullptr);
89 sym =
dynamic_cast<symbol_t<otag> *
>(decl->search_for_symbol_from_symbol_table());
90 ROSE_ASSERT(sym !=
nullptr);
96 return __factory_helper_t<CRT, API, otag>::reference(*
this, sym, parent, args...);
112 template <Object otag,
typename... Args>
115 SgType * ptype = parent->get_type();
117 bool lhs_has_ptr_type = isSgPointerType(parent->get_type());
118 if (lhs_has_ptr_type) {
123 ROSE_ASSERT(xtype !=
nullptr);
126 ROSE_ASSERT(rhs !=
nullptr);
128 if (lhs_has_ptr_type) {
143 template <Object otag>
144 using access_return_t = std::conditional_t<otag == Object::a_class || otag == Object::a_typedef, SgType, SgExpression>;
159 template <
Object otag,
typename... Args>
161 reference_t<otag> * rhs = reference(obj, parent, args...);
168template <
typename CRT,
typename apiT>
170reference_t<Object::a_variable> * Factory<CRT,apiT>::reference<Object::a_variable>(symbol_t<Object::a_variable> * sym) {
177#include "Rose/CodeGen/factory/namespaces.txx"
178#include "Rose/CodeGen/factory/classes.txx"
179#include "Rose/CodeGen/factory/typedefs.txx"
180#include "Rose/CodeGen/factory/variables.txx"
181#include "Rose/CodeGen/factory/functions.txx"
permits to gather types and symbols to extract an API from a set of headers.
facilitates the manipulation of source-files (esp.
constructs expressions and types for the given API
reference_t< otag > * reference(symbol_t< otag > *API::*obj, SgNamedType *parent, Args... args) const
Return an expression or type referencing the object.
std::conditional_t< otag==Object::a_class||otag==Object::a_typedef, SgType, SgExpression > access_return_t
Select return type for access based on Object type.
declaration_t< otag > * instantiate(symbol_t< otag > *API::*obj, SgNamedType *parent, Args... args) const
Return an instantiation.
access_return_t< otag > * access(symbol_t< otag > *API::*obj, SgNamedType *parent, Args... args) const
Build expression or type to access static member and subtype of the parent type.
SgExpression * access(symbol_t< otag > *API::*obj, SgExpression *parent, Args... args) const
Build expression to access a member of the parent expression.
This class represents the notion of an expression. Expressions are derived from SgLocatedNodes,...
This class represents the base class for all types.
typename object_helper< otag >::symbol_t symbol_t
The SgSymbol specialization for an Object kind /tparam otag an Object kind.
typename object_helper< otag >::decl_t declaration_t
The SgDeclarationStatement specialization for an Object kind /tparam otag an Object kind.
typename object_helper< otag >::ref_t reference_t
The SgReference specialization for an Object kind /tparam otag an Object kind.
Object
The five kind of objects manipulated by Rose::CodeGen::API and associated Rose::CodeGen::Factory.
ROSE_DLL_API SgArrowExp * buildArrowExp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgDotExp * buildDotExp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
enables partial specializations w.r.t the template parameter otag