#include "../config/pathan_config.h" /* * Copyright (c) 2001, DecisionSoft Limited All rights reserved. * Please see LICENSE.TXT for more information. */ #include #include #include #ifdef WIN32 #define snprintf _snprintf #endif #include #include #include #include DataItemSequence::DataItemSequence(const Sequence & s, XPath2MemoryManager* memMgr) : DataItemImpl(memMgr), _sequence(s, memMgr) { setType(DataItem::SEQUENCE); } DataItemSequence::DataItemSequence(const Item* b, XPath2MemoryManager* memMgr) : DataItemImpl(memMgr), _sequence(b, memMgr) { setType(DataItem::SEQUENCE); } DataItemSequence::DataItemSequence(XPath2MemoryManager* memMgr) : DataItemImpl(memMgr), _sequence(memMgr) { setType(DataItem::SEQUENCE); } DataItemSequence::~DataItemSequence() { //no-op } DataItemImpl *DataItemSequence::resolvePredicate(VectorOfDataItems::reverse_iterator it, VectorOfDataItems &newPreds, DynamicContext *context, StaticResolutionContext *src) { if(it != _predList.rend()) { StaticResolutionContext newSrc(context->getMemoryManager()); resolvePredicate(it + 1, newPreds, context, &newSrc); if(_sequence.isEmpty()) { newPreds.clear(); } else { DataItem *pred = (*it)->staticResolution(context, &newSrc); // Remove context item usage newSrc.contextItemUsed(false); newSrc.contextPositionUsed(false); newSrc.contextSizeUsed(false); if(newSrc.isUsed()) { // We can't constant fold, so just return newPreds.push_back(pred); src->add(&newSrc); } else { // Constant fold _sequence = checkPredicate(_sequence, pred, context); } } } return this; } DataItem* DataItemSequence::staticResolution(StaticContext *context, StaticResolutionContext *src) { return resolvePredicates(context, src); } Sequence DataItemSequence::collapseTreeInternal(DynamicContext* context, int flags) const { return _sequence; }