#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 /*static*/ const XMLCh UnaryMinus::name[]={ XERCES_CPP_NAMESPACE_QUALIFIER chLatin_u, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_m, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_i, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_n, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_u, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_s, XERCES_CPP_NAMESPACE_QUALIFIER chNull }; UnaryMinus::UnaryMinus(const VectorOfDataItems &args, XPath2MemoryManager* memMgr) : DataItemOperator(name, args, memMgr) { assert(_args.size() == 1); } Sequence UnaryMinus::collapseTreeInternal(DynamicContext* context, int flags) const { Sequence newArgs = getArithmeticOperatorArguments(context); XPath2MemoryManager* memMgr = context->getMemoryManager(); if(newArgs.getLength() < 1) return Sequence(memMgr); const Item* arg1 = newArgs.first(); assert(arg1->isAtomicValue()); const AnyAtomicType* atom1 = (const AnyAtomicType*)arg1; // only works on Numeric types if(atom1->isNumericValue()) { return Sequence(((const Numeric*)atom1)->invert(context), memMgr); } else { DSLthrow(XPath2ErrorException,X("UnaryMinus::collapseTreeInternal"), X("An attempt to apply unary minus a non numeric type has occurred")); } }