#include "../config/pathan_config.h" /* * Copyright (c) 2001, DecisionSoft Limited All rights reserved. * Please see LICENSE.TXT for more information. */ #include #include #include #include #include #include #include #include #include NumericFunction::NumericFunction(const XMLCh* name, unsigned int argsFrom, unsigned int argsTo, const char* paramDecl, const VectorOfDataItems &args, XPath2MemoryManager* memMgr) : ConstantFoldingFunction(name,argsFrom, argsTo, paramDecl, args, memMgr) { } Sequence NumericFunction::getParamNumber(unsigned int number, DynamicContext* context, int flags) const { return getParamNumber(number,number,context,flags); } Sequence NumericFunction::getParamNumber(unsigned int paramNumber, unsigned int signatureNumber, DynamicContext* context, int flags) const { Sequence arg = DataItemFunction::getParamNumber(paramNumber, signatureNumber, context, flags); if (arg.isEmpty()) { return arg; } else if (arg.first()->isAtomicValue() && ((const AnyAtomicType*)arg.first())->isNumericValue()) { return arg; } else { DSLthrow(FunctionException,X("NumericFunction::getParamNumber"), X("Non-numeric argument in numeric function.")); } } bool NumericFunction::isNaN(const Numeric* number) const { const XMLCh* numType=number->getPrimitiveTypeName(); if(XERCES_CPP_NAMESPACE_QUALIFIER XMLString::equals(numType,XERCES_CPP_NAMESPACE_QUALIFIER SchemaSymbols::fgDT_FLOAT) && ((const ATFloatOrDerived*)number)->isNaN()) return true; if(XERCES_CPP_NAMESPACE_QUALIFIER XMLString::equals(numType,XERCES_CPP_NAMESPACE_QUALIFIER SchemaSymbols::fgDT_DOUBLE) && ((const ATDoubleOrDerived*)number)->isNaN()) return true; return false; } bool NumericFunction::isINF(const Numeric* number) const { const XMLCh* numType=number->getPrimitiveTypeName(); if(XERCES_CPP_NAMESPACE_QUALIFIER XMLString::equals(numType,XERCES_CPP_NAMESPACE_QUALIFIER SchemaSymbols::fgDT_FLOAT) && ((const ATFloatOrDerived*)number)->isInfinite()) return true; if(XERCES_CPP_NAMESPACE_QUALIFIER XMLString::equals(numType,XERCES_CPP_NAMESPACE_QUALIFIER SchemaSymbols::fgDT_DOUBLE) && ((const ATDoubleOrDerived*)number)->isInfinite()) return true; return false; }