#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 DataItemParenthesizedExpr::DataItemParenthesizedExpr(XPath2MemoryManager* memMgr) : DataItemImpl(memMgr), _dataItems(PathanAllocator(memMgr)) { setType(DataItem::PARENTHESIZED); } Sequence DataItemParenthesizedExpr::collapseTreeInternal(DynamicContext* context, int flags) const { Sequence result(context->getMemoryManager()); VectorOfDataItems::const_iterator end = _dataItems.end(); for(VectorOfDataItems::const_iterator i = _dataItems.begin(); i != end; ++i) { result.joinSequence((*i)->collapseTree(context, flags)); if((flags & DataItem::RETURN_ONE) && !result.isEmpty()) break; if((flags & DataItem::RETURN_TWO) && result.getLength()>1) break; } return result; } void DataItemParenthesizedExpr::addItem(DataItem* di) { _dataItems.push_back(di); } DataItem* DataItemParenthesizedExpr::staticResolution(StaticContext *context, StaticResolutionContext *src) { // Return a blank DataItemSequence if we have no children if(_dataItems.empty()) { return new (getMemoryManager()) DataItemSequence(getMemoryManager()); } // Dissolve ourselves if we have only one child if(_dataItems.size() == 1) { DataItem *result = _dataItems.front(); result->addPredicates(getPredicates()); return result->staticResolution(context, src); } // Compress to a sequence if all our children are constant return resolveDataItems(_dataItems, context, src, true); } const VectorOfDataItems &DataItemParenthesizedExpr::getChildren() const { return _dataItems; }