本文整理汇总了C++中expression::Ptr::data方法的典型用法代码示例。如果您正苦于以下问题:C++ Ptr::data方法的具体用法?C++ Ptr::data怎么用?C++ Ptr::data使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类expression::Ptr
的用法示例。
在下文中一共展示了Ptr::data方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: checkCallsiteCircularity
void CallTargetDescription::checkCallsiteCircularity(CallTargetDescription::List &signList,
const Expression::Ptr expr)
{
Q_ASSERT(expr);
if(expr->is(Expression::IDUserFunctionCallsite))
{
CallTargetDescription::List::const_iterator it(signList.constBegin());
const CallTargetDescription::List::const_iterator end(signList.constEnd());
CallSite *const callsite = static_cast<CallSite *>(expr.data());
for(; it != end; ++it)
{
if(callsite->configureRecursion(*it))
{
/* A callsite inside the function body to the function. This user function
* is recursive if it's to the same function, in other words. Which it was
* if configureRecursion() returned true. */
/* Now we continue and check the arguments of the callsite. That is, the arguments.
* This catches for instance local:foo(local:foo(3)). */
checkArgumentsCircularity(signList, expr);
return;
}
}
/* Check the body of the function so this callsite isn't "indirectly" a
* recursive call to the function we're checking. XQTS test case
* default_namespace-011 is an example of this. */
signList.append(callsite->callTargetDescription());
checkCallsiteCircularity(signList, callsite->body());
}
checkArgumentsCircularity(signList, expr); /* We're done in this case. */
}
示例2: wrapAround
Expression::Ptr NodeSortExpression::wrapAround(const Expression::Ptr &operand,
const StaticContext::Ptr &context)
{
Q_ASSERT(operand);
Q_ASSERT(context);
const Expression::Ptr sort(new NodeSortExpression(operand));
context->wrapExpressionWith(operand.data(), sort);
return sort;
}
示例3: create
Expression::Ptr GenericPredicate::create(const Expression::Ptr &sourceExpression,
const Expression::Ptr &predicateExpression,
const StaticContext::Ptr &context,
const QSourceLocation &location)
{
Q_ASSERT(sourceExpression);
Q_ASSERT(predicateExpression);
Q_ASSERT(context);
const ItemType::Ptr type(predicateExpression->staticType()->itemType());
if(predicateExpression->is(IDIntegerValue) &&
predicateExpression->as<Literal>()->item().as<Numeric>()->toInteger() == 1)
{ /* Handle [1] */
return createFirstItem(sourceExpression);
}
else if(BuiltinTypes::numeric->xdtTypeMatches(type))
{ /* A numeric predicate, other than [1]. */
/* TODO at somepoint we'll return a specialized expr here, NumericPredicate or so.
* Dependency analysis is a bit tricky, since the contained expression can depend on
* some loop component. */
return Expression::Ptr(new GenericPredicate(sourceExpression, predicateExpression));
}
else if(*CommonSequenceTypes::Empty == *type)
{
return EmptySequence::create(predicateExpression.data(), context);
}
else if(*BuiltinTypes::item == *type ||
*BuiltinTypes::xsAnyAtomicType == *type)
{
/* The type couldn't be narrowed at compile time, so we use
* a generic predicate. This check is before the CommonSequenceTypes::EBV check,
* because the latter matches these types as well. */
return Expression::Ptr(new GenericPredicate(sourceExpression, predicateExpression));
}
else if(CommonSequenceTypes::EBV->itemType()->xdtTypeMatches(type))
{
return Expression::Ptr(new TruthPredicate(sourceExpression, predicateExpression));
}
else
{
context->error(QtXmlPatterns::tr("A value of type %1 cannot be a "
"predicate. A predicate must have "
"either a numeric type or an "
"Effective Boolean Value type.")
.arg(formatType(context->namePool(),
sourceExpression->staticType())),
ReportContext::FORG0006, location);
return Expression::Ptr(); /* Silence compiler warning. */
}
}
示例4: verifyCardinality
Expression::Ptr CardinalityVerifier::verifyCardinality(const Expression::Ptr &operand,
const Cardinality &requiredCard,
const StaticContext::Ptr &context,
const ReportContext::ErrorCode code)
{
const Cardinality opCard(operand->staticType()->cardinality());
if(requiredCard.isMatch(opCard))
return operand;
else if(requiredCard.canMatch(opCard))
return Expression::Ptr(new CardinalityVerifier(operand, requiredCard, code));
else if(context->compatModeEnabled() &&
!opCard.isEmpty())
{
return GenericPredicate::createFirstItem(operand);
}
else
{
/* Sequences within this cardinality can never match. */
context->error(wrongCardinality(requiredCard, opCard), code, operand.data());
return operand;
}
}
示例5: typeCheck
Expression::Ptr DocumentFN::typeCheck(const StaticContext::Ptr &context,
const SequenceType::Ptr &reqType)
{
/* See the class documentation for the rewrite that we're doing here. */
/* Generate type checking code for our operands such that they match. */
typeCheckOperands(context);
const QSourceLocation myLocation(context->locationFor(this));
const FunctionFactory::Ptr functions(context->functionSignatures());
Expression::Ptr uriSource;
{
Expression::List distinctValuesArgs;
distinctValuesArgs.append(m_operands.first());
uriSource = functions->createFunctionCall(QXmlName(StandardNamespaces::fn, StandardLocalNames::distinct_values),
distinctValuesArgs,
context,
this);
context->addLocation(uriSource.data(), myLocation);
}
const VariableSlotID rangeSlot = context->allocateRangeSlot();
const Expression::Ptr uriReference(new RangeVariableReference(uriSource, rangeSlot));
context->addLocation(uriReference.data(), myLocation);
Expression::List docArgs;
if(m_operands.count() == 2)
{
Expression::List baseUriArgs;
baseUriArgs.append(uriReference);
baseUriArgs.append(m_operands.at(1));
const Expression::Ptr fnBaseUri(functions->createFunctionCall(QXmlName(StandardNamespaces::fn, StandardLocalNames::resolve_uri),
baseUriArgs,
context,
this));
context->addLocation(fnBaseUri.data(), myLocation);
docArgs.append(fnBaseUri);
}
else
docArgs.append(uriReference);
const Expression::Ptr fnDoc(functions->createFunctionCall(QXmlName(StandardNamespaces::fn, StandardLocalNames::doc),
docArgs,
context,
this));
context->addLocation(fnDoc.data(), myLocation);
Expression::Ptr newMe(new ForClause(rangeSlot,
uriSource,
fnDoc,
-1 /* We have no position variable. */));
Expression::Ptr oldMe(this);
rewrite(oldMe, newMe, context);
return newMe->typeCheck(context, reqType);
}
示例6: verifyType
Expression::Ptr TypeChecker::verifyType(const Expression::Ptr &operand,
const SequenceType::Ptr &reqSeqType,
const StaticContext::Ptr &context,
const ReportContext::ErrorCode code,
const Options options)
{
const ItemType::Ptr reqType(reqSeqType->itemType());
const Expression::Properties props(operand->properties());
/* If operand requires a focus, do the necessary type checking for that. */
if(props.testFlag(Expression::RequiresFocus) && options.testFlag(CheckFocus))
{
const ItemType::Ptr contextType(context->contextItemType());
if(contextType)
{
if(props.testFlag(Expression::RequiresContextItem))
{
Q_ASSERT_X(operand->expectedContextItemType(), Q_FUNC_INFO,
"When the Expression sets the RequiresContextItem property, it must "
"return a type in expectedContextItemType()");
const ItemType::Ptr expectedContextType(operand->expectedContextItemType());
/* Allow the empty sequence. We don't want to trigger XPTY0020 on ()/... . */
if(!expectedContextType->xdtTypeMatches(contextType) && contextType != CommonSequenceTypes::Empty)
{
context->error(wrongType(context->namePool(), operand->expectedContextItemType(), contextType),
ReportContext::XPTY0020, operand.data());
return operand;
}
}
}
else
{
context->error(QtXmlPatterns::tr("The focus is undefined."), ReportContext::XPDY0002, operand.data());
return operand;
}
}
SequenceType::Ptr operandSeqType(operand->staticType());
ItemType::Ptr operandType(operandSeqType->itemType());
/* This returns the operand if the types are identical or if operandType
* is a subtype of reqType. */
if(reqType->xdtTypeMatches(operandType) || *operandType == *CommonSequenceTypes::Empty)
return operand;
/* Since we haven't exited yet, it means that the operandType is a super type
* of reqType, and that there hence is a path down to it through the
* type hierachy -- but that doesn't necessarily mean that a up-cast(down the
* hierarchy) would succeed. */
Expression::Ptr result(operand);
if(reqType->isAtomicType())
{
const Expression::ID opID = operand->id();
if((opID == Expression::IDArgumentReference ||
(opID == Expression::IDCardinalityVerifier && operand->operands().first()->is(Expression::IDArgumentReference)))
&& *BuiltinTypes::item == *operandType)
return Expression::Ptr(new ArgumentConverter(result, reqType));
if(!operandType->isAtomicType())
{
result = Expression::Ptr(new Atomizer(result));
/* The atomizer might know more about the type. */
operandType = result->staticType()->itemType();
}
if(reqType->xdtTypeMatches(operandType))
{
/* Atomization was sufficient. Either the expected type is xs:anyAtomicType
* or the type the Atomizer knows it returns, matches the required type. */
return result;
}
const bool compatModeEnabled = context->compatModeEnabled();
if((options.testFlag(AutomaticallyConvert) && BuiltinTypes::xsUntypedAtomic->xdtTypeMatches(operandType)) ||
(compatModeEnabled && BuiltinTypes::xsString->xdtTypeMatches(reqType)))
{
if(*reqType == *BuiltinTypes::numeric)
{
result = typeCheck(new UntypedAtomicConverter(result, BuiltinTypes::xsDouble, code),
context, reqSeqType);
}
else
result = typeCheck(new UntypedAtomicConverter(result, reqType, code), context, reqSeqType);
/* The UntypedAtomicConverter might know more about the type, so reload. */
operandType = result->staticType()->itemType();
}
else if(compatModeEnabled && *reqType == *BuiltinTypes::xsDouble)
{
const FunctionFactory::Ptr functions(context->functionSignatures());
Expression::List numberArgs;
numberArgs.append(operand);
result = functions->createFunctionCall(QXmlName(StandardNamespaces::fn, StandardLocalNames::number),
numberArgs,
context,
//.........这里部分代码省略.........
示例7: ArithmeticExpression
UnaryExpression::UnaryExpression(const AtomicMathematician::Operator op,
const Expression::Ptr &operand,
const StaticContext::Ptr &context) : ArithmeticExpression(wrapLiteral(CommonValues::IntegerZero, context, operand.data()),
op,
operand)
{
Q_ASSERT(op == AtomicMathematician::Substract ||
op == AtomicMathematician::Add);
Q_ASSERT(context);
}
示例8: invokeOptimizers
//.........这里部分代码省略.........
OptimizationPass::List::const_iterator passIt(opts.constBegin());
for(; passIt != passEnd; ++passIt) /* Invoke each optimization pass. */
{
const OptimizationPass::Ptr pass(*passIt); /* Alias, for readability. */
OptimizationPass::ExpressionMarker sourceMarker(pass->sourceExpression);
if(pass->startIdentifier && !pass->startIdentifier->matches(expr))
{
/* This pass specified a start identifier and it did
* not match -- let's try the next OptimizationPass. */
continue;
}
const ExpressionIdentifier::List::const_iterator idEnd(pass->operandIdentifiers.constEnd());
ExpressionIdentifier::List::const_iterator idIt(pass->operandIdentifiers.constBegin());
const Expression::List ops(expr->operands());
const Expression::List::const_iterator opEnd(ops.constEnd());
Expression::List::const_iterator opIt(ops.constBegin());
switch(pass->operandsMatchMethod)
{
case OptimizationPass::Sequential:
{
for(; opIt != opEnd; ++opIt)
{
const Expression::Ptr operand(*opIt); /* Alias, for readability. */
const ExpressionIdentifier::Ptr opIdentifier(*idIt); /* Alias, for readability. */
if(opIdentifier && !opIdentifier->matches(operand))
{
break;
}
++idIt;
}
if(opIt == opEnd)
break; /* All operands matched, so this pass matched. */
else
{
/* The loop above did not finish which means all operands did not match.
Therefore, this OptimizationPass did not match -- let's try the next one. */
continue;
}
}
case OptimizationPass::AnyOrder:
{
Q_ASSERT_X(ops.count() == 2, Q_FUNC_INFO,
"AnyOrder is currently only supported for Expressions with two operands.");
if(pass->operandIdentifiers.first()->matches(ops.first()) &&
pass->operandIdentifiers.last()->matches(ops.last()))
{
break;
}
else if(pass->operandIdentifiers.first()->matches(ops.last()) &&
pass->operandIdentifiers.last()->matches(ops.first()))
{
sourceMarker.first() = 1;
sourceMarker[1] = 0;
break; /* This pass matched. */
}
else
continue; /* This pass didn't match, let's loop through the next pass. */
}
}
/* Figure out the source Expression, if any. */
Expression::List operands;
Expression::Ptr sourceExpr;
if(!sourceMarker.isEmpty())
{
const OptimizationPass::ExpressionMarker::const_iterator mEnd(sourceMarker.constEnd());
OptimizationPass::ExpressionMarker::const_iterator mIt(sourceMarker.constBegin());
sourceExpr = expr;
for(; mIt != mEnd; ++mIt)
{
Q_ASSERT(*mIt >= 0);
sourceExpr = sourceExpr->operands().at(*mIt);
}
operands.append(sourceExpr);
}
if(operands.isEmpty())
{
Q_ASSERT(pass->resultCreator);
return pass->resultCreator->create(Expression::List(), context, expr.data())->compress(context);
}
else if(pass->resultCreator)
return pass->resultCreator->create(operands, context, expr.data())->compress(context);
else
{
return sourceExpr;
}
}
return expr;
}