本文整理汇总了C++中MatchResult::size方法的典型用法代码示例。如果您正苦于以下问题:C++ MatchResult::size方法的具体用法?C++ MatchResult::size怎么用?C++ MatchResult::size使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MatchResult
的用法示例。
在下文中一共展示了MatchResult::size方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: substituteConstArrayIndexExprsWithConst
int Specialization::substituteConstArrayIndexExprsWithConst(VariableIdMapping* variableIdMapping, ExprAnalyzer* exprAnalyzer, const EState* estate, SgNode* root) {
typedef pair<SgExpression*,int> SubstitutionPair;
typedef list<SubstitutionPair > SubstitutionList;
SubstitutionList substitutionList;
AstMatching m;
MatchResult res;
int numConstExprElim=0;
#pragma omp critical(EXPRSUBSTITUTION)
{
res=m.performMatching("SgPntrArrRefExp(_,$ArrayIndexExpr)",root);
}
if(res.size()>0) {
for(MatchResult::iterator i=res.begin();i!=res.end();++i) {
// match found
SgExpression* arrayIndexExpr=isSgExpression((*i)["$ArrayIndexExpr"]);
if(arrayIndexExpr) {
// avoid substituting a constant by a constant
if(!isSgIntVal(arrayIndexExpr)) {
list<SingleEvalResultConstInt> evalResultList=exprAnalyzer->evalConstInt(arrayIndexExpr,*estate,true, true);
// only when we get exactly one result it is considered for substitution
// there can be multiple const-results which do not allow to replace it with a single const
if(evalResultList.size()==1) {
list<SingleEvalResultConstInt>::iterator i=evalResultList.begin();
ROSE_ASSERT(evalResultList.size()==1);
AValue varVal=(*i).value();
if(varVal.isConstInt()) {
int varIntValue=varVal.getIntValue();
//cout<<"INFO: const: "<<varIntValue<<" substituting: "<<arrayIndexExpr->unparseToString()<<endl;
SgNodeHelper::replaceExpression(arrayIndexExpr,SageBuilder::buildIntVal(varIntValue),false);
numConstExprElim++;
}
}
}
}
}
}
return numConstExprElim;
}
示例2: transformArrayProgram
void Specialization::transformArrayProgram(SgProject* root, Analyzer* analyzer) {
// 1) transform initializers of global variables : a[]={1,2,3} ==> int a_0=1;int a_1=2;int a_2=3;
// 2) eliminate initializers of pointer variables: int p* = a; ==> \eps
// 3) replace uses of p[k]: with a_k (where k is a constant)
//ad 1 and 2)
VariableIdMapping* variableIdMapping=analyzer->getVariableIdMapping();
Analyzer::VariableDeclarationList usedGlobalVariableDeclarationList=analyzer->computeUsedGlobalVariableDeclarationList(root);
cout<<"STATUS: number of used global variables: "<<usedGlobalVariableDeclarationList.size()<<endl;
list<pair<SgNode*,string> > toReplaceArrayInitializations;
list<SgVariableDeclaration*> toDeleteDeclarations;
typedef map<VariableId,VariableId> ArrayPointerMapType;
ArrayPointerMapType arrayPointer; // var,arrayName
for(Analyzer::VariableDeclarationList::iterator i=usedGlobalVariableDeclarationList.begin();
i!=usedGlobalVariableDeclarationList.end();
++i) {
SgVariableDeclaration* decl=*i;
//cout<<"DEBUG: variableDeclaration:"<<decl->unparseToString()<<endl;
SgNode* initName0=decl->get_traversalSuccessorByIndex(1); // get-InitializedName
ROSE_ASSERT(initName0);
if(SgInitializedName* initName=isSgInitializedName(initName0)) {
// array initializer
SgInitializer* arrayInitializer=initName->get_initializer();
//string arrayName=variableIdMapping->variableName(variableIdMapping->variableId(*i));
if(isSgAggregateInitializer(arrayInitializer)) {
string transformedArrayInitializer=flattenArrayInitializer(decl,variableIdMapping);
toReplaceArrayInitializations.push_back(make_pair(decl,transformedArrayInitializer));
//SgNodeHelper::replaceAstWithString(decl,transformedArrayInitializer);
} else {
//cout<<"initName:"<<astTermWithNullValuesToString(initName)<<endl;
VariableId lhsVarId=variableIdMapping->variableId(*i);
string lhsVariableName=variableIdMapping->variableName(lhsVarId);
SgType* type=variableIdMapping->getType(variableIdMapping->variableId(*i));
// match: SgInitializedName(SgAssignInitializer(SgVarRefExp))
// variable on lhs
// check if variable is a pointer variable
if(isSgPointerType(type)) {
AstMatching m;
MatchResult res;
res=m.performMatching("SgInitializedName(SgAssignInitializer($varRef=SgVarRefExp))|SgInitializedName(SgAssignInitializer(SgAddressOfOp($varRef=SgVarRefExp)))",initName);
if(res.size()==1) {
toDeleteDeclarations.push_back(decl);
MatchResult::iterator j=res.begin();
SgVarRefExp* rhsVarRef=isSgVarRefExp((*j)["$varRef"]);
VariableId rhsVarId=variableIdMapping->variableId(rhsVarRef);
arrayPointer[lhsVarId]=rhsVarId;
//cout<<"Inserted pair "<<variableName<<":"<<rhsVarName<<endl;
}
}
}
}
}
typedef list<pair<SgPntrArrRefExp*,ArrayElementAccessData> > ArrayAccessInfoType;
ArrayAccessInfoType arrayAccesses;
RoseAst ast(root);
for(RoseAst::iterator i=ast.begin();i!=ast.end();++i) {
SgExpression* exp=isSgExpression(*i);
if(exp) {
if(SgPntrArrRefExp* arrAccess=isSgPntrArrRefExp(exp)) {
ArrayElementAccessData aead(arrAccess,analyzer->getVariableIdMapping());
ROSE_ASSERT(aead.isValid());
//VariableId arrayVar=aead.varId;
//cout<<"array-element: "<<variableIdMapping->variableName(arrayVar);
if(aead.subscripts.size()==1) {
//cout<<" ArrayIndex:"<<*aead.subscripts.begin();
arrayAccesses.push_back(make_pair(arrAccess,aead));
} else {
cout<<"Error: ArrayIndex: unknown (dimension>1)";
exit(1);
}
}
}
}
#if 0
cout<<"Array-Pointer Map:"<<endl;
for(ArrayPointerMapType::iterator i=arrayPointer.begin();i!=arrayPointer.end();++i) {
cout<<(*i).first.toString()<<":"<<(*i).second.toString()<<endl;
}
#endif
cout<<"STATUS: Replacing array-initializations."<<endl;
for(list<pair<SgNode*,string> >::iterator i=toReplaceArrayInitializations.begin();i!=toReplaceArrayInitializations.end();++i) {
//cout<<(*i).first->unparseToString()<<":\n"<<(*i).second<<endl;
SgNodeHelper::replaceAstWithString((*i).first,"\n"+(*i).second);
}
cout<<"STATUS: Transforming pointer declarations."<<endl;
for(list<SgVariableDeclaration*>::iterator i=toDeleteDeclarations.begin();i!=toDeleteDeclarations.end();++i) {
//cout<<(*i)->unparseToString()<<endl;
VariableId declaredPointerVar=variableIdMapping->variableId(*i);
SgNode* initName0=(*i)->get_traversalSuccessorByIndex(1); // get-InitializedName
ROSE_ASSERT(initName0);
if(SgInitializedName* initName=isSgInitializedName(initName0)) {
// initializer
SgInitializer* initializer=initName->get_initializer();
if(SgAssignInitializer* assignInitializer=isSgAssignInitializer(initializer)) {
//cout<<"var-initializer:"<<initializer->unparseToString()<<astTermWithNullValuesToString(initializer)<<endl;
SgExpression* assignInitOperand=assignInitializer->get_operand_i();
if(isSgAddressOfOp(assignInitOperand)) {
assignInitOperand=isSgExpression(SgNodeHelper::getFirstChild(assignInitOperand));
ROSE_ASSERT(assignInitOperand);
//.........这里部分代码省略.........