#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 /*static*/ const XMLCh Range::name[]={ XERCES_CPP_NAMESPACE_QUALIFIER chLatin_t, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_o, XERCES_CPP_NAMESPACE_QUALIFIER chNull }; Range::Range(const VectorOfDataItems &args, XPath2MemoryManager* memMgr) : DataItemOperator(name, args, memMgr) { } Sequence Range::collapseTreeInternal(DynamicContext* context, int flags) const { static SequenceType integerType(XERCES_CPP_NAMESPACE_QUALIFIER SchemaSymbols::fgURI_SCHEMAFORSCHEMA, XERCES_CPP_NAMESPACE_QUALIFIER SchemaSymbols::fgDT_INTEGER); // Required type is 2 integer arguments Sequence value1 = _args[0]->collapseTree(context); Sequence result1 = value1.castAs(&integerType, context); assert(result1.getLength() == 1); const ATDecimalOrDerived* begin = (const ATDecimalOrDerived*)result1.first(); Sequence value2 = _args[1]->collapseTree(context); Sequence result2 = value2.castAs(&integerType, context); assert(result2.getLength() == 1); const ATDecimalOrDerived* end = (const ATDecimalOrDerived*)result2.first(); XPath2MemoryManager* memMgr = context->getMemoryManager(); const ATDecimalOrDerived* step=NULL; if(end->greaterThan(begin, context)) step=DatatypeFactory::POD2AT::createInteger(context->getMemoryManager(), 1, context); else step=DatatypeFactory::POD2AT::createInteger(context->getMemoryManager(), -1, context); Sequence range(memMgr); for(const Numeric* count = begin; !count->equals(end, context); count = count->add(step, context)) { range.addItem(count); if(flags & DataItem::RETURN_ONE) break; } range.addItem(end); return range; }